Skip to main content
POST /v1/products/lookup resolves one product page URL and returns a source-aware MerchantProductUrlLookupResponse. The default auto mode checks Octogen’s product index first, then uses on-demand product resolution if the URL is not indexed and that capability is available.

Request

Body parameters

string
required
Product page URL to resolve. The URL does not need to belong to an Octogen catalog unless resolutionMode is index_only.
string
default:"auto"
Source selection policy. auto checks the index and then resolves on demand after a miss. index_only never performs outbound work. on_demand_only skips the index. Allowed values: auto, index_only, on_demand_only.
string
default:"prefer_cache"
Cache behavior when the request can enter the on-demand path. prefer_cache reuses a recent result when available. refresh requests a fresh resolution but does not bypass safety checks or rate limits. Allowed values: prefer_cache, refresh. This field does not apply to index_only.

Example

Response

string | null
Request identifier for tracing an on-demand resolution. It may be null for an indexed hit.
"indexed" | "on_demand"
required
Source that produced the successful result.
string | null
Catalog key for an indexed result. null for an on-demand result.
string | null
Human-readable catalog name for an indexed result. null for an on-demand result.
string | null
Catalog source base URL for an indexed result. null for an on-demand result or when not configured.
MerchantProductView
required
Product detail view. productUrl is always present. For on-demand results, uuid, catalogKey, and isActive are null; unsupported fields are null, omitted, or empty according to their existing schema defaults.
string | null
The URL you submitted, echoed back on every successful result.
string | null
Final URL after redirects. Populated for on-demand results when available; use it for on-demand follow-up lookups.
string | null
The matched product’s URL as normalized by Octogen (HTTPS-forced, www. stripped, tracking parameters removed, query sorted). Populated for indexed results. This is the stable URL: submit it on a follow-up lookup and it deterministically re-resolves the same product. Prefer storing it over the URL you originally submitted.
string | null
The canonical URL the product page itself declares (JSON-LD url, og:url, or link rel="canonical"). Populated only for on-demand results; when the page declares none, the resolver currently falls back to the final fetched URL, so a non-null value is not proof of a declaration. null for indexed results. For follow-up lookups use normalizedUrl (indexed) or resolvedUrl (on-demand), not this field.
ProductResolutionMetadata | null
On-demand resolution metadata. null for indexed results.
"hit" | "miss" | "refresh" | null
Cache outcome for an on-demand result. null for an indexed result.
string[]
Non-fatal warnings about the result.

Indexed example

On-demand example

Errors

See Error Handling and Rate Limits.

SDK equivalents

On-demand results are ephemeral and do not create an indexed product UUID. If your integration requires indexed identity and catalog context, set resolutionMode to index_only.