Search products
const url = 'https://api.listrar.com/v1/products/search?trust_level_min=L0&sort=relevance';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.listrar.com/v1/products/search?trust_level_min=L0&sort=relevance' \ --header 'Authorization: Bearer <token>'Only manufacturer is backed by real data at this revision; brand, category and market are refused with UNSUPPORTED_FILTER rather than silently ignored, so an empty result never means “we ignored your filter”. Cursor pagination only — pass back meta.next_cursor, never an offset.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Fuzzy, trigram-ranked manufacturer name.
Lowest acceptable trust level.
Restrict to products with, or without, a persisted passport.
RFC 3339 timestamp.
relevance (default with manufacturer) or updated_at.
An opaque cursor from a previous meta.next_cursor.
Page size.
Responses
Section titled “Responses”Matching products, with meta.next_cursor when more remain.
object
Typed result status. Absence (‘not_found’, ‘unknown’) is an answer carried at HTTP 200, never a 404 — see ERROR_MODEL.md design rule 1. ‘not_found’ MUST NOT be softened (06 §9).
REQUIRED when status = ‘unknown’.
object
object
INFERENCE and ESTIMATION can never be promoted to FACT. See 10 §3.
REQUIRED for INFERENCE and ESTIMATION
object
object
What was actually consulted, so a caller can distinguish ‘does not exist’ from ‘not covered’. Present on absence and on batch responses.
object
object
Opaque cursor for the next page; absent means end of results. Cursor pagination only, never offset.
Up to four independent axes, never collapsed into one verdict (12 §5). A class is absent when no rule of that class has been evaluated for this subject — which is not the same as ‘not_assessed’, a recorded verdict.
object
object
object
Example
{ "status": "found", "reason": "NO_SOURCE", "claims": [ { "subject": "gtin14:04012345678901", "predicate": "dpp:carbonFootprintKgCO2e", "claim_type": "FACT", "verification_status": "unverified", "trust_level": "L0" } ], "sources": [ { "kind": "registry" } ], "meta": { "coverage": { "sources_skipped": [ { "reason": "LICENCE_RESTRICTED" } ] } }, "validation": { "technical": "pass", "business": "pass", "regulatory": "pass", "authority": "none" }, "warnings": [ { "severity": "info" } ]}Headers
Section titled “Headers”Echoes the envelope’s request_id.
INVALID_FILTER, UNSUPPORTED_FILTER, INVALID_SORT, INVALID_CURSOR
object
Examplegenerated
{ "type": "https://example.com", "title": "example", "status": 1, "code": "example", "detail": "example", "request_id": "example", "retryable": true, "docs_url": "https://example.com"}UNAUTHENTICATED
object
Examplegenerated
{ "type": "https://example.com", "title": "example", "status": 1, "code": "example", "detail": "example", "request_id": "example", "retryable": true, "docs_url": "https://example.com"}TENANT_QUOTA_EXCEEDED
object
Examplegenerated
{ "type": "https://example.com", "title": "example", "status": 1, "code": "example", "detail": "example", "request_id": "example", "retryable": true, "docs_url": "https://example.com"}RATE_LIMITED
object
Examplegenerated
{ "type": "https://example.com", "title": "example", "status": 1, "code": "example", "detail": "example", "request_id": "example", "retryable": true, "docs_url": "https://example.com"}INTERNAL_ERROR
object
Examplegenerated
{ "type": "https://example.com", "title": "example", "status": 1, "code": "example", "detail": "example", "request_id": "example", "retryable": true, "docs_url": "https://example.com"}