Skip to content

Error codes

The API returns errors in one shape:

{
"error": {
"code": "origin_not_allowed",
"message": "this origin is not registered for the project"
}
}

Use error.code in code. message is for people and can change.

Authentication

StatusCodeMeaning
401missing_keyNo Gutternote-Key header.
401unknown_keyThe project key is not recognized.
403origin_not_allowedThe origin is not in the project’s sites.
401no_sessionA write has no Gutternote-Session.
401session_expiredThe session expired. Sign in again.
401invalid_sessionThe session token failed verification.
403session_project_mismatchThe session belongs to another project.
403verification_requiredThe project does not allow guests.
409google_not_enabledThe project does not use Google sign-in. 403 on renew.
501google_not_configuredThis deployment has no Google sign-in.
400missing_credentialA Google sign-in has no credential.
401wrong_audience, invalid_credentialThe Google token failed verification.
403email_unverifiedGoogle has not verified the email.
403domain_not_allowedThe email’s domain is not on the project’s list.
409own_idp_not_enabledThe project does not use your own identity provider.
403bikeshed_requiredYour own identity provider needs the Bikeshed plan.
503billing_unavailableThe plan could not be checked. Retry.
503no_signing_secretThe project has no identity signing secret.
400missing_tokenThe token exchange has no token.
401token_expiredThe identity token expired or is older than the maximum age.
401invalid_tokenThe identity token failed verification.
401session_not_renewableSessions from your own identity provider are not renewed. Get a new token.
403member_requiredOnly workspace members can triage, resolve, stop a task or send work.
503membership_unavailableMembership could not be checked. Retry.
503read_onlyThe deployment refuses writes for now.

Threads

StatusCodeMeaning
400invalid_jsonBad JSON, an unknown field, a requestId that is not a UUID, or a body over 256 KiB.
400missing_pathThe list has neither path nor site=true.
400invalid_deploymentdeploymentId is not a UUID.
400invalid_prprNumber is not a positive integer.
400invalid_idA thread, comment or mention ID has the wrong shape.
400invalid_anchorThe anchor cannot be decoded.
400invalid_requestA new thread fails validation.
400empty_bodyA reply has no text and no attachment.
400invalid_statusStatus is not open, resolved or archived.
400invalid_emojiThe reaction is not an accepted emoji.
400foreign_attachmentThe attachment URL did not come from this API.
403not_authorYou can delete only your own comment.
404not_foundThe thread, comment or attachment is not in this project, or a retried comment was deleted.
409unsupported_by_backendThe project’s comment store cannot do this.
409not_runningThe agent task is finished, already stopping, or not in this thread.
409request_in_progressThis requestId is still being saved. Retry after Retry-After seconds. See Retry.
409request_id_reusedThis requestId already named a different thread or reply. Use a new UUID.
502body_store_unavailableThe project’s comment store failed. Retry.

Uploads

StatusCodeMeaning
400unsupported_typeThe content type is not accepted.
400invalid_kindThe attachment kind is not recognized.
413too_largeThe size is not between 1 byte and uploads.maxBytes.
501uploads_unavailableThis deployment has no image storage.

MCP tool errors

A failed tool call on /mcp is an MCP tool error, not the JSON shape above. The message starts with a stable code:

CodeMeaningWhat to do
PROJECT_REQUIREDThe connection needs a project choice.Call list_projects and pass projectId on each call.
PROJECT_NOT_AVAILABLEThe project is not enabled for this connection, or does not exist.Call list_projects again. Ask a workspace owner for access.
GUIDANCE_UNAVAILABLEThe server could not check the project’s workflow.Retry list_projects.
THREAD_NOT_FOUNDNo such thread in this project, or agents cannot see it.Stop. Check the ID.
THREAD_VERSION_CONFLICTAnother agent wrote to the thread after you read it.Call get_thread, then retry with the new version.
TOOL_TIMEOUTThe call ran past the per-call time limit and was stopped.Wait a few seconds, then call it again. Retry a write with the same clientEventId (requestId on batch tools): if the first attempt went through, the retry returns its result instead of doing it twice.
WILDCARD_ORIGIN_NEEDS_DASHBOARDadd_allowed_origin got an origin with *. Nothing was saved.Ask the person to add the pattern on Configure.

Other tool errors name the bad argument in plain words.

/mcp endpoint

/mcp returns 401 with a WWW-Authenticate header that points to the OAuth metadata. The body uses the JSON shape:

CodeMeaning
missing_tokenNo bearer token.
invalid_tokenGutternote did not issue this token.
expired_tokenThe access token expired. The client refreshes it.
revoked_tokenThe connection was revoked. Approve it again.

The OAuth endpoints return standard OAuth errors, such as invalid_grant, invalid_request and invalid_client_metadata.

Server failures

500 internal means the server could not finish the request. Keep the request ID when you report it.