Resources and methods
Every SDK method, the API operation it calls, and how arguments map to paths, bodies and queries.
The client groups operations into resources: furniops.products, furniops.sources,
furniops.webhookEndpoints and so on. Each method calls one API operation.
How arguments map
A method takes, in order:
- the operation's path parameters, as strings (
"prod_…"); - its input, when it has one: the JSON body for a write, or the query parameters for a read;
- the per-call options, always optional.
// Path parameters first, then the body or query, then per-call options.
await furniops.products.get("prod_034XqBaL2mRLTZPXyRbaUc"); // GET /v1/products/{id}
furniops.products.list({ updated_since: "2026-10-01T00:00:00Z" }); // GET /v1/products?…
await furniops.webhookEndpoints.create({
url: "https://example.com/hooks/furniops", // POST /v1/webhook-endpoints
event_types: ["offer.changed"],
});
await furniops.webhookEndpoints.getDelivery(endpointId, deliveryId); // GET …/deliveries/{delivery}Field names are exactly the API's (event_types, starting_after), so the API reference reads
straight across. The input is required when the operation requires a body or a query parameter,
and optional otherwise.
Results are the typed response body, plus lastResponse.
List methods return a PagePromise. changes.stream returns a
ChangeStream.
Every method
This table is generated from a map the docs' build type-checks against the SDK, so a method listed here exists with exactly this operation's signature.
| Method | Operation | Does |
|---|---|---|
| furniops.agent.listTools() | GET /v1/agent/tools | List the caller's agent tools |
| furniops.agents.listSettings() | GET /v1/agents | List the agents' settings |
| furniops.agents.updateSettings() | PATCH /v1/agents/{agent} | Update an agent's settings |
| furniops.agreementAcceptances.list() | GET /v1/agreement-acceptances | List the organisation's acceptances |
| furniops.agreements.accept() | POST /v1/agreements/{kind}/acceptances | Accept an agreement for the organisation |
| furniops.agreements.get() | GET /v1/agreements/{kind} | Read an agreement and where the organisation stands |
| furniops.assistant.createConversationForMe() | POST /v1/assistant/conversations | Start a conversation |
| furniops.assistant.createMemoryForMe() | POST /v1/assistant/memories | Save a memory |
| furniops.assistant.deleteConversationForMe() | DELETE /v1/assistant/conversations/{conversation} | Delete a conversation |
| furniops.assistant.deleteMemoriesForMe() | DELETE /v1/assistant/memories | Delete all your memories |
| furniops.assistant.deleteMemoryForMe() | DELETE /v1/assistant/memories/{memory} | Delete a memory |
| furniops.assistant.getConversationForMe() | GET /v1/assistant/conversations/{conversation} | Retrieve a conversation |
| furniops.assistant.getMyAssistant() | GET /v1/assistant/me | Retrieve Ask AI for you |
| furniops.assistant.getOrgSettings() | GET /v1/assistant/settings | Retrieve Ask AI for the organisation |
| furniops.assistant.getSpend() | GET /v1/assistant/spend | Retrieve Ask AI spend |
| furniops.assistant.listConversationsForMe() | GET /v1/assistant/conversations | List your conversations |
| furniops.assistant.listMemoriesForMe() | GET /v1/assistant/memories | List your memories |
| furniops.assistant.turn() | POST /v1/assistant/conversations/{conversation}/turns | Talk to FurniOps AI |
| furniops.assistant.updateMemoryForMe() | PATCH /v1/assistant/memories/{memory} | Update a memory |
| furniops.assistant.updateMyAssistant() | PATCH /v1/assistant/me | Update Ask AI for you |
| furniops.assistant.updateOrgSettings() | PATCH /v1/assistant/settings | Update Ask AI for the organisation |
| furniops.auditEvents.list() | GET /v1/audit-events | List audit events |
| furniops.auditEvents.undo() | POST /v1/audit-events/{id}/undo | Undo an audited change |
| furniops.billing.cancelScheduledChange() | POST /v1/billing/subscription/scheduled-change/cancel | Cancel a scheduled plan change |
| furniops.billing.cancelSubscription() | POST /v1/billing/subscription/cancel | Cancel at the period's end |
| furniops.billing.createCreditPurchase() | POST /v1/billing/credits/purchases | Buy FurniOps AI credit |
| furniops.billing.get() | GET /v1/billing | Read billing |
| furniops.billing.getCreditBalance() | GET /v1/billing/credits | Read FurniOps AI credit |
| furniops.billing.getCreditPurchase() | GET /v1/billing/credits/purchases/{purchase} | Retrieve a credit purchase |
| furniops.billing.getCreditRateCard() | GET /v1/billing/credits/rates | Read the credit rate card |
| furniops.billing.listCreditEntries() | GET /v1/billing/credits/entries | List credit entries |
| furniops.billing.listCreditPurchases() | GET /v1/billing/credits/purchases | List credit purchases |
| furniops.billing.listInvoices() | GET /v1/billing/invoices | List invoices |
| furniops.billing.previewCreditPurchase() | POST /v1/billing/credits/purchases/preview | Preview a credit purchase |
| furniops.billing.previewSubscription() | POST /v1/billing/preview | Preview a subscription |
| furniops.billing.resumeSubscription() | POST /v1/billing/subscription/resume | Keep a cancelled subscription |
| furniops.billing.setUpCard() | POST /v1/billing/card | Change the card |
| furniops.billing.subscribe() | POST /v1/billing/subscription | Subscribe, or change plan |
| furniops.billing.updateCreditSettings() | PATCH /v1/billing/credits/settings | Update how credit is spent |
| furniops.billing.updateDetails() | PATCH /v1/billing/details | Update the billing name and email |
| furniops.brand.checkClaim() | POST /v1/brand/claims/{id}/check | Gather a claim's evidence again |
| furniops.brand.fileClaim() | POST /v1/brand/claims | Claim a brand |
| furniops.brand.get() | GET /v1/brand | Read the organisation's brand |
| furniops.brand.getClaim() | GET /v1/brand/claims/{id} | Read a claim |
| furniops.brand.listClaims() | GET /v1/brand/claims | List the organisation's claims |
| furniops.brand.previewClaimInvitation() | POST /v1/brand/invitations/preview | Read an invitation to claim a brand |
| furniops.brand.update() | PATCH /v1/brand | Edit the organisation's brand |
| furniops.brand.withdrawClaim() | POST /v1/brand/claims/{id}/withdraw | Withdraw a claim |
| furniops.catalogue.get() | GET /v1/catalogue | Read the organisation's own catalogue |
| furniops.catalogue.getPublicationRun() | GET /v1/catalogue/publication-runs/{id} | Retrieve a publication run |
| furniops.catalogue.listImages() | GET /v1/catalogue/images | List the catalogue's images |
| furniops.catalogue.listPublicationRuns() | GET /v1/catalogue/publication-runs | List publication runs |
| furniops.catalogue.listVariants() | GET /v1/catalogue/variants | List the catalogue's variants with price levels and stock |
| furniops.catalogue.publish() | POST /v1/catalogue/publish | Publish the catalogue to the network |
| furniops.catalogue.setProductVisibility() | POST /v1/catalogue/visibility | Hide products from the network, or list them again |
| furniops.catalogue.withdraw() | POST /v1/catalogue/withdraw | Withdraw the catalogue from the network |
| furniops.categories.list() | GET /v1/categories | List the FurniOps taxonomy |
| furniops.changes.list() | GET /v1/changes | Read the change feed |
| furniops.changes.listRecentChanges() | GET /v1/changes/recent | Read the newest changes first |
| furniops.changes.stream() | GET /v1/stream | Stream the change feed |
| furniops.demand.record() | POST /v1/demand | Record demand |
| furniops.exports.create() | POST /v1/exports | Start an export |
| furniops.exports.get() | GET /v1/exports/{id} | Get an export |
| furniops.exports.list() | GET /v1/exports | List exports |
| furniops.mappings.confirm() | POST /v1/mappings/{id}/confirm | Confirm a mapping |
| furniops.mappings.get() | GET /v1/mappings/{id} | Retrieve a mapping |
| furniops.matching.getJudgeSettings() | GET /v1/matching/judge-settings | Retrieve the AI judge's settings |
| furniops.matching.updateJudgeSettings() | PATCH /v1/matching/judge-settings | Update the AI judge's settings |
| furniops.matchPairs.dismiss() | POST /v1/match-pairs/{id}/dismiss | Dismiss a review pair |
| furniops.matchPairs.get() | GET /v1/match-pairs/{id} | Retrieve a review pair |
| furniops.matchPairs.list() | GET /v1/match-pairs | List review pairs |
| furniops.matchPairs.merge() | POST /v1/match-pairs/{id}/merge | Merge a review pair |
| furniops.matchPairs.reopen() | POST /v1/match-pairs/{id}/reopen | Reopen a dismissed review pair |
| furniops.me.listMyOrgs() | GET /v1/me/orgs | List the user's organisations |
| furniops.media.get() | GET /v1/media/{id} | Get a stored image |
| furniops.merges.get() | GET /v1/merges/{id} | Retrieve a merge |
| furniops.merges.list() | GET /v1/merges | List merges |
| furniops.merges.undo() | POST /v1/merges/{id}/undo | Undo a merge |
| furniops.offers.list() | GET /v1/offers | List offers |
| furniops.org.get() | GET /v1/org | Read the caller's organisation |
| furniops.plans.list() | GET /v1/plans | List the plans on sale |
| furniops.products.get() | GET /v1/products/{id} | Get a product |
| furniops.products.list() | GET /v1/products | List products |
| furniops.proposals.accept() | POST /v1/proposals/{id}/accept | Accept a proposal |
| furniops.proposals.get() | GET /v1/proposals/{id} | Retrieve a proposal |
| furniops.proposals.list() | GET /v1/proposals | List proposals |
| furniops.proposals.reject() | POST /v1/proposals/{id}/reject | Reject a proposal |
| furniops.requestLogs.get() | GET /v1/request-logs/{id} | Get a request log |
| furniops.requestLogs.list() | GET /v1/request-logs | List request logs |
| furniops.runs.get() | GET /v1/runs/{id} | Retrieve a run |
| furniops.sourceProbes.create() | POST /v1/source-probes | Probe a vendor URL |
| furniops.sourceProbes.get() | GET /v1/source-probes/{id} | Retrieve a source probe |
| furniops.sourceProbes.list() | GET /v1/source-probes | List source probes |
| furniops.sources.create() | POST /v1/sources | Create a source |
| furniops.sources.createRun() | POST /v1/sources/{id}/runs | Start a run |
| furniops.sources.createUpload() | POST /v1/sources/{id}/uploads | Start an upload |
| furniops.sources.deleteCredentials() | DELETE /v1/sources/{id}/credentials | Remove a source's credentials |
| furniops.sources.get() | GET /v1/sources/{id} | Retrieve a source |
| furniops.sources.list() | GET /v1/sources | List sources |
| furniops.sources.listCategories() | GET /v1/sources/{id}/categories | List a source's categories |
| furniops.sources.listInboundMessages() | GET /v1/sources/{id}/inbound-messages | List a source's inbound emails |
| furniops.sources.listMappings() | GET /v1/sources/{id}/mappings | List a source's mappings |
| furniops.sources.listRuns() | GET /v1/sources/{id}/runs | List a source's runs |
| furniops.sources.pushRecords() | POST /v1/sources/{id}/records | Write products to a push source |
| furniops.sources.replayRun() | POST /v1/sources/{id}/replay | Replay a source |
| furniops.sources.rotateInboundAddress() | POST /v1/sources/{id}/inbound-address/rotate | Rotate a source's inbound address |
| furniops.sources.saveCategoryRules() | POST /v1/sources/{id}/categories | Set a source's category rules |
| furniops.sources.setCredentials() | PUT /v1/sources/{id}/credentials | Set a source's credentials |
| furniops.sources.test() | POST /v1/sources/{id}/test | Test a source |
| furniops.sources.update() | PATCH /v1/sources/{id} | Update a source |
| furniops.status.get() | GET /v1/status | Read the platform's current health |
| furniops.status.getHistory() | GET /v1/status/history | Read the platform's daily health |
| furniops.test.triggerEvent() | POST /v1/test/events | Trigger a sample event |
| furniops.uploads.complete() | POST /v1/uploads/{id}/complete | Complete an upload |
| furniops.uploads.get() | GET /v1/uploads/{id} | Retrieve an upload |
| furniops.usage.get() | GET /v1/usage | Read the month's usage |
| furniops.usage.getSeries() | GET /v1/usage/series | Read one meter over time |
| furniops.variants.check() | POST /v1/variants/{id}/checks | Check a variant now |
| furniops.vendor.getProductStats() | GET /v1/vendor/stats/products | Read the vendor's most read products |
| furniops.vendor.getStats() | GET /v1/vendor/stats | Read the vendor's reach and data health |
| furniops.vendor.getStatsSeries() | GET /v1/vendor/stats/series | Read the vendor's reach week by week |
| furniops.vendorProfiles.get() | GET /v1/vendor-profiles/{id} | Read a vendor profile |
| furniops.vendorProfiles.list() | GET /v1/vendor-profiles | Search the vendor directory |
| furniops.webhookEndpoints.create() | POST /v1/webhook-endpoints | Create a webhook endpoint |
| furniops.webhookEndpoints.delete() | DELETE /v1/webhook-endpoints/{id} | Delete a webhook endpoint |
| furniops.webhookEndpoints.get() | GET /v1/webhook-endpoints/{id} | Get a webhook endpoint |
| furniops.webhookEndpoints.getDelivery() | GET /v1/webhook-endpoints/{id}/deliveries/{delivery} | Get a delivery |
| furniops.webhookEndpoints.list() | GET /v1/webhook-endpoints | List webhook endpoints |
| furniops.webhookEndpoints.listDeliveries() | GET /v1/webhook-endpoints/{id}/deliveries | List an endpoint's deliveries |
| furniops.webhookEndpoints.recoverDeliveries() | POST /v1/webhook-endpoints/{id}/recover | Send failed deliveries again |
| furniops.webhookEndpoints.resendDelivery() | POST /v1/webhook-endpoints/{id}/deliveries/{delivery}/resend | Send a delivery again |
| furniops.webhookEndpoints.rotateSecret() | POST /v1/webhook-endpoints/{id}/rotate-secret | Rotate an endpoint's secret |
| furniops.webhookEndpoints.sendTest() | POST /v1/webhook-endpoints/{id}/test | Send a test event |
| furniops.webhookEndpoints.update() | PATCH /v1/webhook-endpoints/{id} | Update a webhook endpoint |
Types
Every schema in the API is exported as a type, for your own functions:
type Product = Schemas["Product"];
type Source = ResponseData<"getSource">; // a success body, by operation ID
type Run = PageItem<"listRuns">; // one item of a list
type CreateRunArgs = OperationArgs<"createRun">; // a method's parameters
type CreateRunResult = OperationResult<"createRun">; // and its result
ErrorCode is the union of every error code, and Problem the error body.