FurniOpsDocs

API keys

Secret and restricted keys, the key wizard, every scope a key can hold, templates, access policies, expiry, rotation, keys for AI agents, suspicious-activity reviews and what to do when a key leaks.

An API key is a long-lived credential for your own servers. It belongs to the organisation, not to the member who made it, so it keeps working when that member leaves.

Authorization: Bearer fo_rk_live_…

Kinds and prefixes

A key says two things in its prefix: secret or restricted, and live or test.

PrefixKindModeHolds
fo_live_secretliveevery permission a key can hold, including any added later
fo_test_secrettestthe same, on your sandbox
fo_rk_live_restrictedliveonly the permissions chosen when it was made
fo_rk_test_restrictedtestthe same, on your sandbox

Prefer restricted keys: give each integration its own key with only what it needs. Restricted keys are a plan feature (restricted_keys); without it, only secret keys can be made and the wizard says so.

The format

After the prefix come 43 base62 characters (256 random bits), then a 6-character base62 CRC-32 checksum of everything before it, the same scheme as GitHub's tokens:

  • a mistyped or truncated key is refused before any lookup, so a typo costs nothing and tells a guesser nothing;
  • secret scanners can recognise a FurniOps key with almost no false positives.

FurniOps stores only a key's SHA-256. The key is shown once, when it is made or rotated; afterwards the dashboard shows its prefix and last four characters (fo_rk_live_…a9Zq).

Keep keys on your servers

A key is a server-side secret. Never put one in a browser, a mobile app or a repository. Load it from your secret store into an environment variable such as FURNIOPS_API_KEY, which the SDK and the CLI read. For code that runs on a user's device, use an OAuth app instead.

Create a key

Keys are made in the dashboard, under Developers › API keys, in the mode the dashboard is in (switch to test mode for a test key). A key can never create another key, so no API call makes one.

Who uses it

Name the key (up to 100 characters, such as "Shopify sync"), add an optional note for whoever finds it later, and say who will use it:

PurposeFor
Your integrationYour own servers or scripts.
A third partyA partner or an app you hand the key to.
An AI agentAn agent calling the API, the CLI or the MCP server. Always restricted; see Keys for AI agents.

Then choose Restricted or Secret. A secret key holds every permission a key can hold, so only owners and admins can make one.

What it can do

For a restricted key, start from a preset (the templates below) or choose permissions: a None, Read or Write switch for each resource. Choosing Write gives Read too. The key never holds a permission you lack yourself; asking for one is refused with 403, naming the missing permissions.

Where and how long

  • Allowed addresses: any address, or an access policy you made.
  • Expires: never, or in 7, 30 or 90 days, or a year. The member who made the key is emailed 30, 7 and 1 day before it expires (the owners, if that member has left or can no longer see keys).

Copy it

The key is shown once. Copy it into your secret store before you close the dialog.

Making, rotating and approving keys, and changing an access policy, need a sign-in within the last 10 minutes. If yours is older, the dashboard asks you to confirm it is you, then brings you back to the same screen.

Scopes

A permission is <resource>:<action>. Every operation in the API reference lists the scopes it needs; a key without them gets 403 permission_denied. These are every permission a key can hold, with the operations that need each:

ScopeOperations that need it
products:read
products:write
variants:read
variants:writeNone in this API yet
offers:readNone in this API yet
offers:writeNone in this API yet
sources:read
sources:write
runs:read
runs:write
webhooks:read
webhooks:write
events:read
exports:read
exports:write
freshness:write
api_keys:readNone in this API yet
oauth_apps:readNone in this API yet
members:readNone in this API yet
org:readNone in this API yet
billing:read
usage:read
audit:read
audit:write
request_logs:read
agent:read
agreements:read
analytics:read
brand:read
publishing:read
publishing:write
  • A secret key holds all of them, and any added later.
  • A restricted key holds its list for life. Its permissions never change: make a new key to change them.
  • No key can ever hold api_keys:write, oauth_apps:write, members:write, org:write, billing:write, agent:write, sso:read or sso:write. Those stay with signed-in people.

Templates

The wizard's presets. A key records the template it was made from.

TemplateForPermissions
Catalogue read-onlyRead products, variants and offers.
  • products:read
  • variants:read
  • offers:read
Catalogue syncRead and write products, variants and offers, for a store that keeps its catalogue in step.
  • products:read
  • products:write
  • variants:read
  • variants:write
  • offers:read
  • offers:write
  • events:read
Integration operationsRun vendor connections and ingestion, manage webhooks and read the change feed.
  • sources:read
  • sources:write
  • runs:read
  • runs:write
  • webhooks:read
  • webhooks:write
  • events:read
WebhooksManage webhook endpoints and read deliveries and events.
  • webhooks:read
  • webhooks:write
  • events:read
Change feed readerRead the change feed and the catalogue it describes.
  • products:read
  • variants:read
  • offers:read
  • events:read
AI agent, read-onlyLet an AI agent read the catalogue, connections, runs, webhooks and events, and change nothing.
  • products:read
  • variants:read
  • offers:read
  • sources:read
  • runs:read
  • webhooks:read
  • events:read
Catalogue publishingFor a vendor: keep its catalogue, prices and availability up to date, run its connections, uploads and records, and publish it.
  • products:read
  • products:write
  • variants:read
  • variants:write
  • offers:read
  • offers:write
  • sources:read
  • sources:write
  • runs:read
  • runs:write
  • publishing:read
  • publishing:write
Vendor analyticsFor a vendor: read its catalogue and its aggregate reach and data health.
  • products:read
  • variants:read
  • offers:read
  • analytics:read

A storefront that mirrors the catalogue needs the catalogue reads and events:read, not sources:write. A sync job that only follows the change feed needs Change feed reader.

Access policies

An access policy is a named list of IPv4 and IPv6 addresses and CIDR ranges (203.0.113.0/24, 2001:db8::/32). A key that holds one works only from those addresses; from anywhere else it is refused with 401 authentication_required.

  • Up to 50 entries a policy, and 50 policies an organisation. One policy can be shared by any number of keys.
  • A bare address means just that address. A range must be written as its network address, and /0 is refused: a key that may be used from anywhere simply has no policy.
  • Policies are managed on the same page, under Access policies. Changing one reaches every key holding it within a minute.
  • A policy that a usable key holds cannot be deleted. Detach it from its keys (or revoke them) first, so no key is ever silently opened to every address.

Rotate a key

Rotating issues a replacement with the same permissions, policy and lifetime length, and keeps the old key working for an overlap you choose: end it now, 1 hour, 24 hours, 3 days or 7 days in the dashboard (any whole number of hours from 0 to 168 through identity). Deploy the replacement within the overlap and the switch has no downtime.

  • You must hold every permission the key holds to rotate it.
  • A key that was already rotated cannot be rotated again; rotate its replacement.

Revoke a key

Revoking stops a key within a minute, for anything still using it. It cannot be undone, and the key's open reviews close.

Keys for AI agents

A key whose purpose is An AI agent is always restricted. Two things set it apart:

  • Approval. When the organisation requires agent key approval, an agent key that can write starts pending: it does not work until another member, holding every permission it holds, approves it under Keys waiting for approval. A pending key nobody approves expires after 7 days. A key that only reads needs no approval.
  • MCP writes. On the MCP server, only keys made for an agent are offered write tools. A key made for an integration or a third party gets read tools only, so a sync key can never be driven by a model.

Agent key approval is an organisation setting (agent_key_approval: off by default, or required) that only an owner can change, under Settings › Security › Organisation policies (see Organisation policies).

Suspicious-activity reviews

FurniOps watches where each key is used from and how its requests fare, and opens a review under Key reviews for the members who manage keys (owners, admins and developers):

ReviewOpens when
Used from a new countryThe key is used from a country it was not used from before. The key's first 24 hours of use are its baseline, so testing on a laptop and deploying elsewhere is not news.
Used from a new networkThe key is used from a network (an autonomous system) not seen before, in a country it already uses.
Most requests refusedIn one hour, at least 50 of its requests were refused, and at least half of that hour's requests.
Found publishedA secret scanner reported the key published.

A review keeps its 20 most recent observations (the country, network and /24 or /48 the use came from; the hour of a spike). Owners and the key's creator are emailed when one opens.

  • If the activity is expected, dismiss it with an optional reason ("Our new CI runners"). The same thing happening again opens a new review.
  • If it is not, rotate or revoke the key. Revoking closes its reviews.

A key reported as published is revoked at once by default, and the owners are emailed either way. An organisation can choose a review instead (leaked_key_action: revoke or review), an owner's choice under Settings › Security › Organisation policies (Leaked keys).

Limits

Limit
Usable keys (active or pending) per organisation100, or fewer when the plan says so (403 plan_limit_reached)
Expiry1 hour to 366 days ahead, or never
Rotation overlap0 to 168 hours, 24 by default
Access policies50 per organisation, 50 entries each
Pending agent keysExpire unapproved after 7 days

If a key leaks

  1. Revoke it, or rotate it with an overlap of 0, straight away.
  2. Deploy the replacement.
  3. Read what it did: filter the audit log and the request logs by the key's ID (key_…).

Because no key can create keys, change members or change the organisation, revoking it ends the exposure.

On this page