- The door. A request that never reached an action — no key, access switched
off, too fast, no such action — answers a
4xx. - 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: false, a code and a message at the top
level — so one branch in your code reads either. Branch on 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.
Every response also carries an x-request-id; quote it when you contact
support. More in API conventions.
Refused at the door
error object repeats the same values and is
deprecated — read the top-level fields.
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.