- The door. A request that never reached an action — no key, access switched
off, too fast, no such action — answers a
4xxwith anerrorobject. - The answer. A request that got through the door and reached the action
answers
200, and theokfield says how it went. A declined action is still a200with"ok": falseand a reason.
ok, not on the status code. If you would rather not read the
body, the x-goosy-tool-error header carries true or false on every
dispatched call.
Refused at the door
Refused by the action
These answer200 with "ok": false, a code, and a plain-language message.
An
invalid_arguments reply points at the field:
Which refusals are about us
Four of the answers above are platform states. No new key, no permission change and no code change on your side will clear them, and each says so in its own message rather than leaving you to guess:tenant_mcp.surface_disabled— the surface is not open for your account yet.api_access.platform_disabled— programmatic access is off platform-wide.tool_capability_unbound— that action is not open to API clients yet.- Anything a support reply tells you is on our side.
A quick triage
1
Read the status first
A
4xx means the request never reached the action. A 200 means it did.2
On a 4xx, read the code
The table above names who can clear each one. Most
403s are a switch or a
permission, not the key.3
On a 200, read ok
"ok": true is a real answer. "ok": false carries a code and a message
written to be acted on — including, where it applies, the list of choices
you could pass instead.4
If the message says it is not about your key, believe it
Minting another key is the most common wasted step. The refusals that are
not about your credential say so in those words.