FurniOpsDocs
API referenceProducts

List offers

Every source's price and stock the organisation can see, newest first: filter by variant, product, source, availability or updated_since. Each offer shows only the fields its licences cover, as in GET /v1/products, and names its variant and catalogue; its product, title and SKU only where the licences show them.

  • Scopesproducts:read
  • Rate classread
GET/v1/offers

Every source's price and stock the organisation can see, newest first: filter by variant, product, source, availability or updated_since. Each offer shows only the fields its licences cover, as in GET /v1/products, and names its variant and catalogue; its product, title and SKU only where the licences show them.

Authorization

apiKey
AuthorizationBearer <token>

An API key (fo_live_… / fo_test_…) as a bearer token

In: header

Query Parameters

variant?string

Only offers of this variant

Match^var_[0-9A-Za-z]{22}$
product?string

Only offers of this product's variants

Match^prod_[0-9A-Za-z]{22}$
source?string

Only this source's offers

Match^src_[0-9A-Za-z]{22}$
availability?string

Only offers of this availability

Value in

  • "in_stock"
  • "low_stock"
  • "out_of_stock"
  • "backorder"
  • "preorder"
  • "discontinued"
  • "unknown"
updated_since?string

Only offers that changed at or after this time (UTC)

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
Formatdate-time
limit?integer

Page size

Range1 <= value <= 100
Default20
starting_after?string

Opaque position returned by a previous page

Match^[A-Za-z0-9_-]{1,512}$

Header Parameters

FurniOps-Version?string

Dated API version; pinned per organisation on first use and overridable per request

Value in

  • "2026-10-01"
  • "2026-10-04"
FurniOps-Mode?string

The data the request acts on: test is the organisation's sandbox. An OAuth token picks it (live by default); an API key's mode is fixed, and naming the other one is refused

Value in

  • "live"
  • "test"
If-None-Match?string

ETag of a cached representation; a match returns 304

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X GET "https://example.com/v1/offers"
{  "object": "list",  "data": [    {      "object": "offer",      "id": "string",      "source": "string",      "location": "string",      "currency": "usd",      "cost": 0,      "msrp": 0,      "map": 0,      "price": 0,      "compare_at": 0,      "quantity": 0,      "incoming": [        {          "quantity": 1,          "eta": "2019-08-24"        }      ],      "availability": "in_stock",      "lead_time_days": 0,      "version": 1,      "observed_at": "2019-08-24T14:15:22Z",      "withdrawn_at": "2019-08-24T14:15:22Z",      "variant": "string",      "catalogue": "string",      "product": "string",      "product_title": "string",      "variant_sku": "string"    }  ],  "has_more": true,  "next_cursor": "string"}