Write products to a push source
Sends up to 1000 products (at most 5 MB) to a push source of the organisation's own catalogue and queues the run that reads them, like a file. upsert replaces each product's record whole; merge changes only the fields given, keeping the rest. A push never discontinues products it does not name. Another kind of source answers 422; a source with an active run, or a paused or disabled one, answers 409; a vendor without the current data agreement answers 409 agreement_required once its catalogue is published.
- Scopes
runs:write - Rate classexpensive
- Idempotency-Key required
/v1/sources/{id}/recordsSends up to 1000 products (at most 5 MB) to a push source of the organisation's own catalogue and queues the run that reads them, like a file. upsert replaces each product's record whole; merge changes only the fields given, keeping the rest. A push never discontinues products it does not name. Another kind of source answers 422; a source with an active run, or a paused or disabled one, answers 409; a vendor without the current data agreement answers 409 agreement_required once its catalogue is published.
Authorization
apiKey An API key (fo_live_… / fo_test_…) as a bearer token
In: header
Path Parameters
Source (a vendor connection) ID
^src_[0-9A-Za-z]{22}$Header Parameters
Dated API version; pinned per organisation on first use and overridable per request
Value in
- "2026-10-01"
- "2026-10-04"
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"
Unique key for this operation, reused on retries (24 h)
1 <= length <= 257Preview the write and change nothing: true answers the would-be response, explain a Preview (application/vnd.furniops.preview+json)
Value in
- "true"
- "explain"
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
A batch of products for a push source, whole (upsert) or as patches (merge)
A batch of products for a push source, whole (upsert) or as patches (merge)
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
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/v1/sources/string/records" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "mode": "upsert", "products": [ { "key": "string", "variants": [ { "key": "string" } ] } ] }'{ "object": "run", "id": "string", "source": "string", "trigger": "schedule", "stream": "catalogue", "status": "queued", "stage": "fetch", "served_by": null, "stats": { "property1": 0, "property2": 0 }, "error": { "code": "fetch_refused", "message": "string" }, "waiting": { "reason": "rate_limited", "until": "2019-08-24T14:15:22Z", "attempt": 1, "detail": "string" }, "problems": [ { "sheet": "string", "line": 1, "column": "string", "field": "string", "problem": "missing", "detail": "string" } ], "created_at": "2019-08-24T14:15:22Z", "started_at": "2019-08-24T14:15:22Z", "finished_at": "2019-08-24T14:15:22Z"}Withdraw the catalogue from the network POST
Starts a run that takes every product of the vendor's catalogue back from the network, each announced as `product.withdrawn` so retailers drop it. Its data is kept and it can be published again. A catalogue that is not published, or a run under way, answers 409.
Probe a vendor URL POST
Queues a probe of the URL: robots.txt obeyed, one request at a time, at most 25. Follow it with `GET /v1/source-probes/{id}`. With AI agents in the plan, the onboarding agent then proposes a source from the report when FurniOps can run one for it; a person decides. A catalogue may have 3 open probes and start 20 in a day; one more answers 409 `conflict`.