Probe a vendor URL
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.
- Scopes
sources:write - Rate classexpensive
- Idempotency-Key required
/v1/source-probesQueues 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.
Authorization
apiKey An API key (fo_live_… / fo_test_…) as a bearer token
In: header
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.
The URL to probe
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
curl -X POST "https://example.com/v1/source-probes" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "url": "http://example.com" }'{ "object": "source_probe", "id": "string", "url": "string", "status": "queued", "livemode": true, "report": { "final_url": "string", "robots": { "state": "parsed", "crawl_delay_seconds": 0, "sitemaps": [ "string" ] }, "platform": "shopify", "confidence": 0, "evidence": [ { "platform": "shopify", "signal": "string", "weight": 0 } ], "wall": { "kind": "bot_challenge", "detail": "string" }, "feed": { "platform": "shopify", "url": "string", "status": -9007199254740991, "products": 0, "total": 0, "fields": [ "name" ] }, "sitemap": { "read": [ "string" ], "product_pages": 0, "truncated": true }, "sample": { "pages": [ { "url": "string", "status": -9007199254740991, "products": 0 } ], "malformed_blocks": 0, "coverage": { "property1": 0, "property2": 0 } }, "disallowed": [ "string" ], "requests": 0, "notes": [ "string" ], "estimate": { "effort": "low", "kind": "platform_feed", "reasons": [ "string" ] } }, "failure": "string", "proposal": "string", "created_at": "2019-08-24T14:15:22Z", "completed_at": "2019-08-24T14:15:22Z"}Write products to a push source POST
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.
Create a source POST
Adds a vendor connection to the organisation's catalogue. The kind is fixed; `config` must fit it (a feed needs a URL and a platform, an API source a connector). Set credentials separately with `PUT /v1/sources/{id}/credentials`.