Vizit Public APIAPI
Exports

Create a bulk export job

Start an asynchronous export of PDP or image scores.

POST/v1/exports

Queues an asynchronous bulk export for the caller's organization. The response returns immediately with status: PENDING and a status_url pointing at Retrieve an export; poll there until status reaches COMPLETED to obtain the short-lived presigned download URL.

Org scope is enforced by the access token; the optional filters block narrows within the org. Each caller is limited to one in-flight PENDING/PROCESSING export at a time — additional submissions return 409 EXPORT_CONCURRENCY_LIMIT.

CSV format

Exports are CSV in v1 (JSONL and Parquet deferred to v2). The header row is fixed per subject; carousel rows in subject=images exports emit empty values for hero-only columns so partners can rely on a stable column set.

subject=pdps column set

ColumnTypeNotes
pdp_iduuidPDP identifier; stable across refreshes
portfolio_iduuidOwning portfolio
retailer_regionstringe.g. amazon_us, walmart_us
item_idstringASIN or GTIN, depending on retailer
namestring | nullPDP display name
brandstring | null
category_iduuid | nullVizit category identifier
categorystring | nullCategory display name
listing_scoreint | null0–100, resolved per org
raw_listing_scorefloat | nullPre-blend, pre-penalty
listing_score_blendedint | null0–100, pre-penalty
score_penaltybool | nullTrue if any penalty applied
image_count_penaltyfloat | null
image_mix_penaltyfloat | null
image_order_penaltyfloat | null
high_scoring_asset_countint | null
is_ideal_content_mixbool | null
images_matching_ideal_mixint | null
score_statusstringCREATED, PROCESSING, SCORED, or CATEGORY_NOT_FOUND
created_atdate-time
updated_atdate-time
last_refresheddate-time | nullLast successful scrape + score

subject=images column set

Hero-score and mobile-readiness columns are populated only for hero rows; carousel rows emit empty values in those columns.

ColumnTypeNotes
image_iduuid
pdp_iduuidParent PDP
portfolio_iduuidDenormalized from PDP for row-standalone exports
retailer_regionstring
item_idstringASIN or GTIN of the parent PDP
image_typestringhero or carousel
image_urlstring
positionint1-based position within the PDP (matches CarouselImageResponse.position)
sourcestring | nulle.g. scraped
vizit_scoreint | null0–100, resolved per org
raw_scorefloat | null
hero_scoreint | null0–100; null for carousel rows. The hero_score_breakdown sub-scores (heroism, category_edge, technical_integrity, local_support) are intentionally omitted from v1 — the hero formula is in flight
mobile_readybool | nullAll five clarity scores ≥ 80. Null for carousel
mobile_brand_clarityfloat | nullNull for carousel
mobile_product_type_clarityfloat | nullNull for carousel
mobile_variant_clarityfloat | nullNull for carousel
mobile_count_clarityfloat | nullNull for carousel
mobile_size_clarityfloat | nullNull for carousel
mobile_scored_modelstring | nullNull for carousel
classificationstring | nulle.g. Lifestyle, Packshot
classification_confidencefloat | null0–1
classification_high_confidencebool | null
created_atdate-time
updated_atdate-time
scored_atdate-time | nullLast successful score

Authorization

bearerAuth
Authorization<token>

Short-lived access token issued by Create a token. Send it on every request as Authorization: Bearer <token>.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

subject*string

Which dataset to export. pdps returns PDP-level scores; images returns image-level scores. CSV column layout per subject is documented in the createExport endpoint description.

Value in"pdps" | "images"
filters?

Optional filters narrowing the export. Org scope is always enforced by the access token; these filters refine within the caller's org. Unknown filter keys are rejected with INVALID_FILTER.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://ext.vizit.com/v1/exports" \  -H "Content-Type: application/json" \  -d '{    "subject": "pdps"  }'
{  "export_id": "a9a55f8d-48b1-4a5b-a88e-c41b0cd75102",  "subject": "pdps",  "status": "PENDING",  "status_url": "/v1/exports/4f1a2b3c-5d6e-7f8a-9b0c-1d2e3f4a5b6c",  "requested_at": "2019-08-24T14:15:22Z"}
{  "detail": "string",  "status_code": 0,  "error_code": "INVALID_GTIN",  "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",  "extra": {    "failed_urls": [      {        "url": "https://cdn.example.com/broken.jpg",        "reason": "IMAGE_DOWNLOAD_TIMEOUT"      },      {        "url": "https://cdn.example.com/icon.svg",        "reason": "UNSUPPORTED_IMAGE_FORMAT"      }    ]  },  "timestamp": "2019-08-24T14:15:22Z"}
Empty
{  "detail": "string",  "status_code": 0,  "error_code": "INVALID_GTIN",  "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",  "extra": {    "failed_urls": [      {        "url": "https://cdn.example.com/broken.jpg",        "reason": "IMAGE_DOWNLOAD_TIMEOUT"      },      {        "url": "https://cdn.example.com/icon.svg",        "reason": "UNSUPPORTED_IMAGE_FORMAT"      }    ]  },  "timestamp": "2019-08-24T14:15:22Z"}
{  "detail": "string",  "status_code": 0,  "error_code": "INVALID_GTIN",  "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",  "extra": {    "failed_urls": [      {        "url": "https://cdn.example.com/broken.jpg",        "reason": "IMAGE_DOWNLOAD_TIMEOUT"      },      {        "url": "https://cdn.example.com/icon.svg",        "reason": "UNSUPPORTED_IMAGE_FORMAT"      }    ]  },  "timestamp": "2019-08-24T14:15:22Z"}
Empty

PUTSubmit a PDP by Amazon ASIN

Submitting an ASIN runs Vizit's standard Amazon scrape-and-score pipeline server-side: ASIN lookup and validation, category inference with ICP check, retailer scrape, image ingest, and scoring. Unlike [Submit a PDP by GTIN](/api/product-details/upsertPdpByGtin), the caller does not supply images or a category — both are derived from the scrape. **Upsert semantics.** If a PDP already exists for this ASIN in your organization (and region), this call refreshes it — same behavior as the in-product "refresh" action. The previous scores remain visible alongside `status: processing` until the new scores land. The response returns immediately with `status: processing` and a `score_url`. Use [Retrieve PDP scores by ASIN](/api/product-details/getPdpByAsin) (with the same `region`) to watch the scores come in. Score availability is bounded by the scrape and scoring pipeline — expect tens of seconds for typical Amazon ASINs. **Common errors.** `INVALID_ASIN` if the path parameter is not 10 uppercase alphanumeric characters; `ASIN_NOT_FOUND_AT_RETAILER` if Amazon does not return the listing; `CATEGORY_NOT_IN_ORG_ICP` if the scraped category is outside your organization's ICP; `NO_VALID_CATEGORY` if the retailer returned no usable category data.

GETRetrieve an export

Returns the current status of an export job. When `status` is `COMPLETED` and the artifact has not yet expired, `download_url` is populated with a path to [Download an export artifact](/api/exports/downloadExport). Authenticate that follow-up GET with the same Bearer token used for this endpoint — the URL itself does not carry embedded credentials. Lifecycle: - `PENDING` / `PROCESSING` → `download_url` is `null`, no `error_code` - `COMPLETED` (within retention) → `download_url` populated - `COMPLETED` (past 7-day retention) → `download_url` is `null`, `error_code: EXPORT_EXPIRED` - `ERROR` → `download_url` is `null`, `error_code: EXPORT_FAILED` Cross-org access is intentionally indistinguishable from "not found"; foreign `export_id`s return `404 EXPORT_NOT_FOUND`.