Shared Format 409 format_inactive: the owner's switch hits partners
format_inactive and format_api_trigger_disabled are set on the owner's API tab and apply to every caller, including workspaces the Format was shared with.

If a shared Format suddenly answers 409 format_inactive or 409 format_api_trigger_disabled to a grantee, nothing is wrong with the grantee's key or grant. The owner workspace set the Format to Inactive, or turned off its API call trigger, on the Format page's API tab, and those settings apply to every caller, including workspaces the owner shared the Format with.
Which switch is which
The two codes come from two controls that sit next to each other on the owner's API tab. They are easy to mix up because both stop API runs, and both are owner-only. The grantee sees the 409 but cannot change either setting.
| Code | Owner setting | Owner fix | Grantee can fix it? |
|---|---|---|---|
| format_inactive | Status set to Inactive | Format page, API tab, Status Active | No |
| format_api_trigger_disabled | API call trigger off | Format page, API tab, API call trigger On | No |
How to tell the grantee case from your own bug
A 409 with one of these two codes is not a retryable condition. The code is stable, so a client can branch on it. It is different from a 404 format_not_found, which says the grant is pending, revoked, or the Format was archived.
If you are the grantee, the fastest check is to send the same request with a tiny input. Same 409 means the owner's switch. If a tiny input succeeds and the real one fails, look at the failure code on that run instead.
import os, requests
r = requests.post(
"https://api.sume.com/v1/formats/acme/product-promo/runs",
headers={"Authorization": "Bearer " + os.environ["PARTNER_TEAM_KEY"]},
json={"instruction": "ping"},
timeout=30,
)
code = r.json().get("error", {}).get("code")
if r.status_code == 409 and code in ("format_inactive", "format_api_trigger_disabled"):
print("owner paused this Format:", code)
else:
print(r.status_code, code)For owners: pause on purpose
Turning the trigger off is a clean way to freeze a Format while you edit it, because every grantee gets the same stable code. It is also a clean way to cause an outage for partners without meaning to. Tell grantees before you flip it, and flip it back after the edit.
Revoking a grant is the other lever, and it is narrower: it affects one workspace. Use the switch for everyone and the revoke for one.
What to put in a partner runbook
If you share Formats with several workspaces, write down three lines for your partners. The first says which codes mean the owner paused the Format and that waiting is the only fix. The second says which codes mean the key or grant is wrong, so they should contact you. The third says where to see a failed run's code.
Giving partners that table up front saves a support round trip, because the 409 reads like a bug on their side when it is a decision on yours.
Limits
This post is about API runs. The owner's switches are described for the API tab; the Formats errors page does not say they stop runs started from chat, so do not assume that.
Sources
Related posts
More in Formats
- Shared Format run stuck queued: whose concurrency limit applies?
A partner's run on your shared Format uses the partner's concurrency slot, so the partner's plan limit and queue decide when it starts, not yours.
- Sume bulk Format runs: 100 items, one concurrency window, cost control
POST /v1/formats/{handle}/{slug}/bulk-runs queues up to 100 ordinary Format runs. Set concurrency and a per-run cap, and poll the queue with format-run-queues.
- Sume catalog Formats for ads: which of 27 slugs to read first
The Sume Format catalog lists 27 slugs. Group them by the ad job their names suggest, then confirm each with GET /v1/formats/sume/{slug} before you call it.
- Format run input extra keys: context only, not echoed in output
Keys your Format does not read, like a sheet row number, reach the run as context and do not return in output. Store them beside the 202's id and thread id.
Written by Sume