Most of the Swarme catalog is visible to an API key and still refuses to execute. That is not an auth bug. It is execution.machine_run_status.
The catalog currently holds 1940 tools: 560 free, 1380 premium. Machine status splits differently: 1491 describe_only, 439 supported, 10 requires_worker. Docs at https://swarme.io/developers state that describe_only blocks quote/run. Treat missing or unknown values as describe_only and re-describe before execution.
Access level is not machine status
Free and premium describe commercial access. They do not tell you whether the API will run the tool.
Observed describe calls:
- aac-converter — free, describe_only, client_browser
- add-image-to-pdf — free, describe_only, client_browser
- accessibility-statement-generator — free, supported, server_sync
- anchor-text-analyzer — premium, supported, server_sync
- 3-2-1-backup-planning-tool — premium, describe_only, client_browser
- file-chunker — free, requires_worker, async_worker
A free badge on the directory page does not mean POST /quote will succeed. A premium badge does not mean it will fail. Read machine_run_status on GET /api/capabilities/{slug}.
Create keys at https://swarme.io/dashboard?tab=developers. /dashboard/developers is 404. Scopes capabilities:read, capabilities:quote, and capabilities:run do not override describe_only.
What describe_only is for
describe_only means the schema is published and quote/run are blocked. Many of those tools are client_browser operations: they are meant to run in a page, not as a server job keyed by an API token.
The safety gate values are:
- supported — executes in the declared mode
- requires_worker — preserves the worker-required response until that runtime is ready
- plan_only — returns a client plan without server processing
- describe_only — blocks quote/run
The legacy value runnable is accepted as supported. Unknown values are not a green light.
If you POST quote on a describe_only slug, stop. Do not retry run. Do not send files. Open the tool page if the work belongs in the browser, or pick a supported slug with a compatible contract.
Supported is a smaller set, and quote is still required
439 tools are supported. That is the set where machine quote/run is in play, not a promise that empty input will pass.
A completed supported run of uuid-generator returned UUID 4cd3c7b6-0495-447a-8efd-9a1374f7599c at $0.00 included after a 900-second quote lock, with idempotency_required_for_client true. Public URL: https://swarme.io/tool/uuid-generator. Wallet on that account was still $0.00 / metered_observe. Included did not skip quote.
Other supported tools quoted and then returned HTTP 422 on run:
- Use labeled address lines in key: value form or provide JSON.
- Domain must contain valid ASCII hostname labels.
- backlinks must contain between 1 and 1,000 records.
- Enter valid Base64URL input.
Those are input-schema failures, not evidence that describe_only can be bypassed. Fix the field. Do not lower machine_run_status.
10 tools are requires_worker. Describe smoke included file-chunker, video-to-gif, barcode-scanner, and document-translator. Docs say quote/run may be issued for requires_worker, and the worker-required response is preserved until that runtime is ready. Do not treat requires_worker as supported in your own gating logic. Branch on the status you received.
How to filter before you waste a quote
- Search GET /api/capabilities. Note the 500-item cap on a single call.
- Describe the slug. Read execution.machine_run_status.
- If the value is describe_only, missing, or unknown: do not quote.
- If the value is supported, requires_worker, or plan_only: quote, then run with quote_id.
- On HTTP 422, read the labeled error. Adjust input. Quote again if the 900-second lock expired.
MCP follows the same gate. tools/list on Swarme Capability MCP Alpha 2026.07.15-wallet-alpha returned 22 tools. That list is the protocol surface (swarme_capability_describe, swarme_tool_quote, swarme_tool_run, …). It is not 1940 executable MCP tools. Search still yields catalog slugs. Most of those slugs remain describe_only.
Unauthenticated quote is HTTP 419. The login toast Your secure form token expired. Please go back and try again. is a form-token failure. Neither converts a describe_only tool into supported.
A practical split for clients
Keep three buckets in the client, not one "tools" array:
- Readable: 1940 catalog entries from search/describe.
- Executable via API: 439 supported, plus 10 requires_worker if you handle that status.
- Browser or blocked: 1491 describe_only.
Surface the bucket to the caller before you ask for files or spend. Wallet $0.00 with metered_observe is enough for the included UUID path after quote. It is not a reason to fire quote against a describe-only slug.
A first GET /api/capabilities?limit=500 will not even show the full readable set. Walk categories if you need all 1940 slugs, then apply the status gate. Listing more tools does not raise the 439 supported count.
For routing a request onto a compatible contract, see AI tool routing. For tools that still process files in the browser or on a server, see how to choose a secure online file tool before you upload.
