Skip to content
Menu

DEVELOPER DOCS / CONTRACT 0.101.0

Read commerce data

Retailers, brand profiles, listings and dated observations from the current core contract.

Get started with your AI agent.

Contract snapshot 0.101.0 · Deployment and client release availability follow the integration note for your environment.

Choose the right record

Retailers identify sources; brand profiles describe brands; listings describe what a retailer lists; observations hold price and availability history. A listing is not proof that every shopper can buy it.

Keep location and time

Preserve source identifiers, pin-code context, as-of information and collection dates. Price and availability vary across locations and time. A missing field remains unknown.

Paging and charges

Follow the paging shape returned by the API. Read the operation description for its current rate and repeat-read policy. An empty page costs nothing. Keep the response’s credit receipt with the delivered records.

Check deployment before integration

The published contract describes listings, product search, observations and pin availability. Verify the connected service version and permissions before a charged read. A published-rate read does not need a quote: show its rate first, then retain meta.credits and the receipt.

Compare equivalent observations

Retain product identity, quantity and source context when combining listings. Compare observations over a defined period and location set. A missing price is unknown, not zero; a missing availability field is not a measured out-of-stock event. Explain these distinctions when producing tables, charts or agent summaries.

Build an honest empty state

A successful response with no matching records and a failed request require different messages. Show the selected filters and returned paging information for a valid empty result. For a service error, preserve the request identifier and offer the recovery advised by the error envelope rather than presenting an empty dataset.

GET

/v1/data/retailers

List the tracked retailers

The retailers Rewalto tracks, one page at a time. Free: no credits are charged.

Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/brands

Get a brand profile

One brand profile by name (case-insensitive exact match): category, website, and its logo and favicon URLs, never the files. An empty list when the brand is unknown. Free: no credits are charged.

Parameters
[
  {
    "name": "name",
    "in": "query",
    "required": true,
    "schema": {
      "type": "string",
      "title": "Name",
      "examples": [
        "Amul"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "The brand name (case-insensitive exact match)."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/listings

List retailer listings

Retailer listings (what a retailer sells, as last seen), newest first, each with all its image URLs (primary first). With selection, exactly the listings chosen in a free preview (discoverListings), by their selectionIds. Charged 1 credit per 10 listings delivered, rounded up; re-reading the same listings within 7 days is free, and an empty page costs nothing. When the credits cannot cover the page: 402 credits_exhausted and no data.

Parameters
[
  {
    "name": "retailer",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer",
      "examples": [
        "blinkit"
      ],
      "pattern": "^[a-z0-9_]{2,40}$"
    },
    "description": "Only this retailer (a key from /v1/data/retailers)."
  },
  {
    "name": "brand",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Brand",
      "examples": [
        "Aashirvaad"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "Only records with exactly this brand text, as the retailer wrote it (exact match, case-sensitive)."
  },
  {
    "name": "productId",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Product",
      "examples": [
        "0d6b4a52-4b6e-4c1a-9a7e-5b0d2f8f1a11"
      ],
      "format": "uuid"
    },
    "description": "Only records matched to this Rewalto product id."
  },
  {
    "name": "retailerSku",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer product id",
      "examples": [
        "prd-88213"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "Only this retailer product id (use together with retailer)."
  },
  {
    "name": "selection",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Selection",
      "examples": [
        "sel_7c1e5f0a2f554d2b8c360f3f1d9c2b77,sel_0d6b4a524b6e4c1a9a7e5b0d2f8f1a11"
      ],
      "pattern": "^sel_[0-9a-f]{32}(,sel_[0-9a-f]{32}){0,99}$"
    },
    "description": "Only these listings: comma-separated selectionIds from the free preview (discoverListings), 1 to 100; a repeated id counts once. Charged like every listings page, for the listings delivered."
  },
  {
    "name": "limit",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Page size",
      "examples": [
        "100"
      ],
      "pattern": "^[1-9][0-9]{0,2}$"
    },
    "description": "How many records to return, 1 to 500. Default 100."
  },
  {
    "name": "cursor",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Cursor",
      "examples": [
        "eyJ0IjoiMjAyNi0xMC0xNFQwOToyNzowMC4wMDBaIiwiaSI6NDgyMTAzNzcsImYiOiJhYmMxMjMifQ"
      ],
      "pattern": "^[A-Za-z0-9_-]{1,600}$"
    },
    "description": "The nextCursor of the previous page, sent back with exactly the same filters. A cursor from other filters is refused."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
402Error. The `error.code` is one of: - `credits_exhausted`: retry advice `never` - `plan_required`: retry advice `never`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/observations

List price and availability history

Price and availability history for listings, newest first. Charged 1 credit per 10 records delivered, rounded up; re-reading the same records within 7 days is free, and an empty page costs nothing. When the credits cannot cover the page: 402 credits_exhausted and no data.

Parameters
[
  {
    "name": "retailer",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer",
      "examples": [
        "blinkit"
      ],
      "pattern": "^[a-z0-9_]{2,40}$"
    },
    "description": "Only this retailer (a key from /v1/data/retailers)."
  },
  {
    "name": "pincode",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Pin code",
      "examples": [
        "110092"
      ],
      "pattern": "^(national|[0-9]{6})$"
    },
    "description": "Only readings for this six-digit pin code, or national for readings that are not pin-scoped."
  },
  {
    "name": "location",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Location",
      "examples": [
        "IN:city:karnataka:bengaluru"
      ],
      "pattern": "^[A-Z]{2}:(pin:[1-9][0-9]{5}|city:[a-z0-9-]{1,100}:[a-z0-9-]{1,100}|area:[a-z0-9-]{1,100}:[a-z0-9-]{1,100}:[a-z0-9]{1,120}|store:[a-z0-9_]{2,40}:[A-Za-z0-9_-]{1,64})$"
    },
    "description": "A Core location id from the free lookup (GET /v1/data/locations, /cities or /stores): a pin, a city, an area or a dark store. It resolves to an explicit list of pin codes (see GET /v1/data/locations/filter). Never combine with pincode. More than one pin needs confirmPins. A store id (IN:store:<retailer>:<store id>) means the pin codes that dark store serves (its catchment as the sweeps saw it). Readings are kept per pin code, not per store, so it reads every kept reading at those pin codes, whichever store served them; no reading is attributed to the store itself."
  },
  {
    "name": "confirmPins",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Confirm pins",
      "examples": [
        "112"
      ],
      "pattern": "^[1-9][0-9]{0,2}$"
    },
    "description": "Your consent to a multi-pin read: the number of pins the location resolves to, as GET /v1/data/locations/filter showed it. A different number is refused with the current count, so a place is never silently broadened."
  },
  {
    "name": "brand",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Brand",
      "examples": [
        "Aashirvaad"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "Only records with exactly this brand text, as the retailer wrote it (exact match, case-sensitive)."
  },
  {
    "name": "productId",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Product",
      "examples": [
        "0d6b4a52-4b6e-4c1a-9a7e-5b0d2f8f1a11"
      ],
      "format": "uuid"
    },
    "description": "Only records matched to this Rewalto product id."
  },
  {
    "name": "retailerSku",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer product id",
      "examples": [
        "prd-88213"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "Only this retailer product id (use together with retailer)."
  },
  {
    "name": "from",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "format": "date-time",
      "title": "From",
      "examples": [
        "2026-10-01T00:00:00Z"
      ]
    },
    "description": "Only readings at or after this time. Default: 30 days before now."
  },
  {
    "name": "to",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "format": "date-time",
      "title": "To",
      "examples": [
        "2026-10-15T00:00:00Z"
      ]
    },
    "description": "Only readings before this time. Default: now."
  },
  {
    "name": "limit",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Page size",
      "examples": [
        "100"
      ],
      "pattern": "^[1-9][0-9]{0,2}$"
    },
    "description": "How many records to return, 1 to 500. Default 100."
  },
  {
    "name": "cursor",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Cursor",
      "examples": [
        "eyJ0IjoiMjAyNi0xMC0xNFQwOToyNzowMC4wMDBaIiwiaSI6NDgyMTAzNzcsImYiOiJhYmMxMjMifQ"
      ],
      "pattern": "^[A-Za-z0-9_-]{1,600}$"
    },
    "description": "The nextCursor of the previous page, sent back with exactly the same filters. A cursor from other filters is refused."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
402Error. The `error.code` is one of: - `credits_exhausted`: retry advice `never` - `plan_required`: retry advice `never`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/listings/search

Search retailer listings by name

Listings whose name, brand or retailer product id contain every word of q. Whole words first (contract 0.58.0): when any listing holds every word of q as a whole word, only such listings are returned ("amul butter" finds Amul butters, never Amul Buttermilk, and never the brand's other products); otherwise each word matches the start of a word ("aashir atta" finds "Aashirvaad Atta"). Each result carries match: how it matched (exact_id, phrase, words, brand, near) and how many words of q are whole words of it. Optionally only one retailer, one exact brand, or listings read at one pin code in the last 30 days. Best match first: a listing whose retailer product id is exactly q; then listings where more words of q are whole words of the name ("atta" finds "Aashirvaad Atta" before "Attar"); then listings whose product is the thing typed: the main part of the name (before a |, a comma, " - ", or for, with, made or by) ends with the last word of q, sizes, units and pack words aside ("amul butter" finds "Amul Salted Butter" before "Amul Butter Bread"); then names with fewer words that are not in q ("Amul Butter" before "Amul Salted Butter"); then, only to break a tie, names holding the words of q in order and next to each other; then more frequent matches, then the most recently seen. When fewer than 10 listings match, listings whose name holds each word of q of 5 or more letters approximately (a likely misspelling: "ashirvad" finds "Aashirvaad") follow, after every listing that matches: first those whose name also has the shorter words of q ("oil" in "sunflwr oil"), then those closest to the whole of q. Paged with nextCursor. With include=latest (contract 0.59.0) each result also carries latest, its newest kept price reading in the last 30 days (price, MRP, stock, pin code, time; at the pin codes asked for, else at any pin), never a guess. Each result is a listing, charged like GET /v1/data/listings: 1 credit per 10 listings delivered, prices included (contract 0.72.0, issue #221: a price reading adds nothing), rounded up, so 10 results cost 1 credit and 25 cost 3; re-reading the same page within 7 days is free, and a search that finds nothing costs nothing. When the credits cannot cover the page: 402 credits_exhausted and no data.

Parameters
[
  {
    "name": "q",
    "in": "query",
    "required": true,
    "schema": {
      "type": "string",
      "title": "Words",
      "examples": [
        "aashirvaad atta"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "What to look for: name, brand or retailer product id words."
  },
  {
    "name": "retailer",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer",
      "examples": [
        "blinkit"
      ],
      "pattern": "^[a-z0-9_]{2,40}$"
    },
    "description": "Only this retailer (a key from /v1/data/retailers)."
  },
  {
    "name": "brand",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Brand",
      "examples": [
        "Aashirvaad"
      ],
      "minLength": 1,
      "maxLength": 200
    },
    "description": "Only records with exactly this brand text, as the retailer wrote it (exact match, case-sensitive)."
  },
  {
    "name": "pincode",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Pin code",
      "examples": [
        "110092"
      ],
      "pattern": "^[1-9][0-9]{5}$"
    },
    "description": "Only listings read at this six-digit pin code in the last 30 days."
  },
  {
    "name": "location",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Location",
      "examples": [
        "IN:city:karnataka:bengaluru"
      ],
      "pattern": "^[A-Z]{2}:(pin:[1-9][0-9]{5}|city:[a-z0-9-]{1,100}:[a-z0-9-]{1,100}|area:[a-z0-9-]{1,100}:[a-z0-9-]{1,100}:[a-z0-9]{1,120}|store:[a-z0-9_]{2,40}:[A-Za-z0-9_-]{1,64})$"
    },
    "description": "A Core location id from the free lookup (GET /v1/data/locations, /cities or /stores): a pin, a city, an area or a dark store. It resolves to an explicit list of pin codes (see GET /v1/data/locations/filter). Never combine with pincode. More than one pin needs confirmPins. A store id (IN:store:<retailer>:<store id>) means the pin codes that dark store serves (its catchment as the sweeps saw it). Readings are kept per pin code, not per store, so it reads every kept reading at those pin codes, whichever store served them; no reading is attributed to the store itself."
  },
  {
    "name": "confirmPins",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Confirm pins",
      "examples": [
        "112"
      ],
      "pattern": "^[1-9][0-9]{0,2}$"
    },
    "description": "Your consent to a multi-pin read: the number of pins the location resolves to, as GET /v1/data/locations/filter showed it. A different number is refused with the current count, so a place is never silently broadened."
  },
  {
    "name": "limit",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Page size",
      "examples": [
        "50"
      ],
      "pattern": "^[1-9][0-9]{0,2}$"
    },
    "description": "How many listings to return, 1 to 100. Default 50."
  },
  {
    "name": "cursor",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Cursor",
      "examples": [
        "eyJ0IjoiMjAyNi0xMC0xNFQwOToyNzowMC4wMDBaIiwiaSI6NDgyMTAzNzcsImYiOiJhYmMxMjMifQ"
      ],
      "pattern": "^[A-Za-z0-9_-]{1,600}$"
    },
    "description": "The nextCursor of the previous page, sent back with exactly the same filters. A cursor from other filters is refused."
  },
  {
    "name": "mode",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Mode",
      "examples": [
        "semantic"
      ],
      "pattern": "^(words|semantic)$"
    },
    "description": "words (the default): the word search described above. semantic: the listings nearest in meaning to q (its embedding against each listing's embedding of title, brand and retailer; OpenAI text-embedding-3-small), with the same retailer, brand and location filters, nearest first, each with a similarity. Semantic answers one page of up to limit listings and takes no cursor (nextCursor is always null); a listing not embedded yet is found only by the word search. 503 unavailable when semantic search is not available on this deployment."
  },
  {
    "name": "include",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "pattern": "^latest$",
      "title": "Include",
      "examples": [
        "latest"
      ]
    },
    "description": "latest: each result also carries its newest kept price reading in the last 30 days (price, MRP, stock, pin code, time; at the pin codes asked for, else at any pin), never a guess. Prices are included: the page is charged by listings delivered only, at the published listings rate (contract 0.72.0, issue #221). Omit for listings only."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
402Error. The `error.code` is one of: - `credits_exhausted`: retry advice `never` - `plan_required`: retry advice `never`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/availability

Is a product in stock at a pin code

For one six-digit pin code and one product (listingId: one retailer listing, such as a search result; or productId: the listings matched to that Rewalto product, across retailers, that were read at this pin in the last 30 days, at most 100), one row per listing: in_stock, out_of_stock, or unknown with the reason, from the listing's newest kept reading at that pin, with the reading's time and, where the reading records it, the retailer's store. Never a guess: unknown when the newest reading is older than 48 hours (stale), when there is none in 30 days (no_reading_at_pin), when the retailer does not report stock (stock_not_reported), or when the reading falls on a pin-day left out of the data (excluded_pin_day, with the reason and decision). Charged like GET /v1/data/listings, 1 credit per 10 rows whose state is known (in or out of stock), rounded up; unknown rows and an empty answer cost nothing; re-reading the same answer within 7 days is free. When the credits cannot cover it: 402 credits_exhausted and no data.

Parameters
[
  {
    "name": "pincode",
    "in": "query",
    "required": true,
    "schema": {
      "type": "string",
      "title": "Pin code",
      "examples": [
        "110092"
      ],
      "pattern": "^[1-9][0-9]{5}$"
    },
    "description": "A six-digit pin code."
  },
  {
    "name": "listingId",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Listing",
      "examples": [
        "3b8f1c2a-6d4e-4a7b-9c10-2e5f8a1d4b66"
      ],
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
    },
    "description": "A listing id, e.g. a search result id."
  },
  {
    "name": "productId",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Product",
      "examples": [
        "0d6b4a52-4b6e-4c1a-9a7e-5b0d2f8f1a11"
      ],
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
    },
    "description": "A Rewalto product id (a listing's productId)."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
402Error. The `error.code` is one of: - `credits_exhausted`: retry advice `never` - `plan_required`: retry advice `never`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.

GET

/v1/data/availability/pin

Share in stock per retailer at a pin code

For one six-digit pin code (optionally one retailer), one row per retailer: how many of its listings read at that pin are in stock and out of stock, by each listing's newest kept reading there, and the share in stock. Only readings at most 48 hours old count as in or out of stock; listings read there in the last 30 days whose newest reading is older, does not report stock, or falls on a pin-day left out of the data are counted under unknown, by reason. From a summary refreshed hourly (meta.refreshedAt). Charged like GET /v1/data/listings, 1 credit per 10 retailer rows with a known share, rounded up; rows without one and an empty answer cost nothing; re-reading the same answer within 7 days is free. When the credits cannot cover it: 402 credits_exhausted and no data.

Parameters
[
  {
    "name": "pincode",
    "in": "query",
    "required": true,
    "schema": {
      "type": "string",
      "title": "Pin code",
      "examples": [
        "110092"
      ],
      "pattern": "^[1-9][0-9]{5}$"
    },
    "description": "A six-digit pin code."
  },
  {
    "name": "retailer",
    "in": "query",
    "required": false,
    "schema": {
      "type": "string",
      "title": "Retailer",
      "examples": [
        "blinkit"
      ],
      "pattern": "^[a-z0-9_]{2,40}$"
    },
    "description": "Only this retailer."
  }
]
Response status codes
StatusMeaning
200Success
400Error. The `error.code` is one of: - `invalid_request`: retry advice `fix_request`
401Error. The `error.code` is one of: - `key_expired`: retry advice `refresh_credentials` - `key_revoked`: retry advice `refresh_credentials` - `session_expired`: retry advice `refresh_credentials` - `unauthenticated`: retry advice `refresh_credentials`
402Error. The `error.code` is one of: - `credits_exhausted`: retry advice `never` - `plan_required`: retry advice `never`
403Error. The `error.code` is one of: - `org_missing`: retry advice `never` - `scope_missing`: retry advice `never`
429Error. The `error.code` is one of: - `rate_limited`: retry advice `after_reset`
500Error. The `error.code` is one of: - `internal`: retry advice `bounded`
503Error. The `error.code` is one of: - `unavailable`: retry advice `bounded`

Full response fields and reusable schemas are in the downloadable OpenAPI contract.