Catalogues and licences
Your own catalogue, the network catalogue, and how a licence narrows what you can see of it by source and by field group, the same way on every path.
FurniOps keeps data in catalogues. Your organisation has its own: everything your sources
bring in. The network catalogue holds vendor data FurniOps maintains for many organisations.
A catalogue licence (lic_…) lets your organisation see part of the network catalogue.
| You see | Of your own catalogue | Of a licensed catalogue | Of any other catalogue |
|---|---|---|---|
| Products and variants | every field | the granted field groups, from licensed sources | nothing |
| Offers | every offer | offers from licensed sources, with price or stock granted | nothing |
| Events | every event | the same narrowing; an event with nothing left is skipped | nothing |
| Source health | your sources | never: it stays with the source's owner | nothing |
What a licence grants
A licence names a catalogue and narrows it two ways:
- Sources: every source of the catalogue, or a list of them.
- Field groups: which kinds of field you see. Every field is in exactly one group.
| Group | Fields |
|---|---|
content | Every field of a product's or variant's data except media: title, brand, description, category, sku, colour, dimensions, cartons, compliance and the rest. |
media | A product's or variant's images (media). |
price | An offer's currency, cost, msrp, map, price and compare_at. |
stock | An offer's other fields: quantity, incoming, availability and lead_time_days. |
* | Every group, including any added later. |
Several licences on one catalogue add up: their sources and field groups unite. A licence can have a start and an end; outside that window it grants nothing. Licences are arranged with FurniOps, not through the API.
How the narrowing works
- A product or variant
datafield is shown when its group is granted and the value comes from a licensed source. A value FurniOps set itself, with no source behind it, follows its group alone. - An offer is shown only when it is from a licensed source and
priceorstockis granted. Of its fields, you see only the granted groups. Withoutstock,availabilityreadsunknown. - A licence that grants only offer groups (
price,stock) does not show the products those offers belong to. - An update event left with no visible field is skipped, and the change feed's cursor moves past it, so you never receive an empty change.
Because a licence can leave fields out, every field of a product's or variant's data, and
every price and stock field of an offer, is optional in the API's schemas. Identity fields (id,
status, version, an offer's source and observed_at) are always present. Check for a field
before using it:
for (const variant of product.variants) {
for (const offer of variant.offers) {
if (offer.cost !== undefined) {
// The licence grants price, and this source gave a cost.
}
}
}One projection on every path
The read API, the change feed, the stream and webhooks all pass data through one licence
projection. A field you cannot read with GET /v1/products/{id} never reaches you in an event
either, and a fat payload's object equals what
the read API would have shown at that version. When your licence changes, the next read and the
next event follow it.
A source's licence basis
Each of your sources records why FurniOps may use its data, in licence_basis:
| Value | Meaning |
|---|---|
vendor_agreement | You have an agreement with the vendor to use its data. |
public_data | The vendor publishes this data, such as a public storefront feed. |
tenant_account | It is read with your organisation's own account with the vendor. |
It is required when you create a source and can be
changed with PATCH /v1/sources/{id}.
API versions
Dated API versions, the pin your organisation gets on its first request, the FurniOps-Version header, and how webhook endpoints choose the shape of their events.
Live and test
Every organisation has live data and a sandbox. What belongs to one mode, what the two share, and how a request's mode is decided.