Skip to content

Error codes

When Maitento refuses a request, it says why with a stable code such as api:billing:out-of-credit. This page lists every one, in 24 areas: 227 codes, and 4 more that are built from a value, such as api:<kind>:delete:in-use. It is generated from Maitento’s code, so it lists what the API sends.

Branch on the HTTP status and the code, never on the message: messages are English for developers and logs, and their wording can change.

StatusBodyMeans
400{"validationFailures": [{"errorCode", "memberName", "message"}]}the request was refused and nothing happened; there is one failure for each reason
403{"code", "error"}, or emptyyou’re signed in but not allowed
413{"code": "api:request-too-large", "error", "maxRequestBodyBytes"}the body is too large
429{"code": "api:rate-limited", "error", "retryAfterSeconds"}slow down; the wait is also sent as Retry-After

In a 400, errorCode is the code, memberName the request field it is about (request when it’s about the whole request), and message says what is wrong:

{
"validationFailures": [
{ "errorCode": "api:credentials:name-in-use", "memberName": "name", "message": "The tenant already has a credential by that name." }
]
}

A few codes don’t arrive as an error: a credential test’s result, an embedding test’s result, a run’s failure details and the provider sign-in’s redirect carry them. Their sections say where. 401 and 404 have no code: see Errors in the API overview.

Every SDK raises a typed error for a refused request:

StatusTypeScriptPythonC#
400ValidationError: codes, and failures, each with code, member and messageValidationError: codes, and failures, each with code, member and messageMaitentoValidationException: ValidationResults, each with ErrorCode, MemberName and Message
403PermissionError: codePermissionError: codeMaitentoApiAuthenticationException: StatusCode, and the body in ResponseBody
413RequestTooLargeError: code, maxRequestBodyBytesRequestTooLargeError: code, max_request_body_bytesMaitentoApiException: StatusCode, and the body in ResponseBody
429RateLimitError: code, retryAfterRateLimitError: code, retry_afterMaitentoApiException: StatusCode, and the body in ResponseBody

In TypeScript and Python every API error is an ApiError, with the status and the code (a 400’s first failure’s), and every SDK error is a MaitentoError. In C# every SDK error is a MaitentoSdkException.

A request body that fails a check on a field answers api:validation-failure:<field>, described below. Some checks answer the plain api:validation-failure with the field in memberName, and some answer with the field’s path itself as the code, without api: (name, request:mount-name). Treat a code that doesn’t start with api: as “this field is wrong”, and read memberName and the message.

The Status column gives the HTTP status, and the request field (memberName) where a code always names the same one. Codes that only Maitento’s own operators, or its own services, can receive aren’t listed.

Codes any call can answer with.

CodeStatusWhat it meansWhat to do
api:forbidden403You’re signed in, but not allowed to do this, and no more specific reason applies.
api:rate-limited429Too many requests in a short time.Wait retryAfterSeconds (also sent as Retry-After), then try again. The SDKs wait and retry for you where that is safe.
api:request-too-large413The request body is over this call’s limit, which the answer’s maxRequestBodyBytes gives.Send a smaller body.
api:validation-failure400The request failed a check. memberName names the field (request when the body is missing), and the message says what is wrong.Check what you entered and try again.
api:validation-failure:<field>400The request body failed a check on a field. <field> is the field’s path in kebab case, with : between levels: api:validation-failure:system-prompt, api:validation-failure:credentials[0]:value. memberName is the same field, and the message says what is wrong.
api:validation-failure:interaction400The interaction definition failed validation. There is one failure for each problem, and its message says what to fix.

What your plan lets you start and keep, and buying or changing a plan. A start your plan refuses creates nothing. Limits explains the refusals, and Plans and billing the plans.

CodeStatusWhat it meansWhat to do
api:billing:alert-threshold-invalid400 · billingA low-balance alert percentage outside 1 to 100.Choose a share of the last top-up from 1 to 100 percent, or turn the email off.
api:billing:allowance-used400 · billingThe plan’s allowance for this kind of work is used up for the period, and the plan can’t top up.Upgrade to carry on now.
api:billing:already-subscribed400 · billingYour tenant already has a paid plan.Change that plan instead of buying another.
api:billing:auto-top-up-threshold-invalid400 · billingAn auto top-up threshold that’s negative, past the largest top-up, or not in whole cents.Choose a balance from 0 to the largest top-up, in whole cents, to start an automatic top-up.
api:billing:change-awaiting-payment400 · billingA change while an earlier one still waits for its invoice to be paid.Pay it, or wait for it to lapse, then try again.
api:billing:invalid-return-path400 · billingThe returnPath isn’t a plain path in the portal, such as /billing, for the payment page to send you back to.
api:billing:lanes-over-limit400 · billingThat’s more extra lanes than this plan can hold.Choose fewer.
api:billing:mixed-change400 · billingA change that adds something and takes something away at once; made as two changes.Make the addition now, and the reduction (which waits for your renewal) as a separate change.
api:billing:no-billing-account400 · billingThere’s no billing account yet, because nothing has been bought.Buy a plan or a top-up first.
api:billing:no-change400 · billingThe plan asked for is the plan the tenant already has.
api:billing:no-subscription400 · billingA plan change, cancellation or withdrawal on a tenant with no paid subscription.Choose a plan to buy one.
api:billing:nothing-scheduled400 · billingNothing is booked for the renewal, so there’s nothing to withdraw.
api:billing:out-of-credit400 · billingThe tenant is out of credit: top up or upgrade.Top up or upgrade, then try again.
api:billing:payments-not-configured400 · billingPayments aren’t available on this Maitento, so nothing can be bought here.
api:billing:premium-not-included400 · billingThe plan doesn’t include capsules and code pipelines.Upgrade to run them.
api:billing:storage-cap-reached400 · billingThe write would take the tenant over its storage cap, and its plan can’t pay for storage above it.Delete what you no longer need, or upgrade.
api:billing:subscription-frozen400 · billingA plan change while frozen after a failed renewal: the failed invoice is paid first.Pay it from the payment provider’s page before changing the plan.
api:billing:tenant-locked400 · billingA platform admin has locked the tenant: nothing new starts until it’s unlocked.Contact support to have it unlocked.
api:billing:tier-not-available400 · billingThat plan can’t be bought.Choose another.
api:billing:top-up-amount-invalid400 · billingThe top-up amount is less than the smallest top-up, more than the largest, or not in whole cents.Choose an amount between the smallest and the largest top-up, in whole cents.
api:billing:top-up-not-available400 · billingYour plan can’t buy credit.Upgrade to a paid plan to top up.
api:file-system:limit-reached400 · fileSystemsThe plan holds no more file systems.Delete one you no longer use, or upgrade.
api:partition:limit-reached400 · partitionsThe plan holds no more knowledge bases.Delete one you no longer use, or upgrade.

Starting an interaction or an app. A start that is refused creates nothing. Child runs are refused the same way, and the refusal is what their start returns.

CodeStatusWhat it meansWhat to do
api:apps:input-missing400 · inputsAn app run was started without a value for an input the app declares.
api:interactions:ai-model-override-invalid400 · aiModelOverridesAn AI model override is malformed, names an unknown model, or one that cannot run an interaction.
api:interactions:input-empty400 · inputsA required input was given empty, and it has no default.
api:interactions:input-invalid400 · inputsAn input’s value is not of its type (a number, a date, a secret’s id…).
api:interactions:input-required400 · inputsA required input was not given (member inputs; the message names it).
api:interactions:input-unknown400 · inputsAn input the interaction does not declare was given.
api:interactions:loom-gift-invalid400 · loomGiftsThreads handed to an agent at start are refused (too many, unknown, or private to their loom).
api:interactions:loom-mapping-invalid400 · loomMappingsA loom mapping is malformed: an unknown agent, no id or name, or a namespace given twice.
api:interactions:loom-not-enabled400Memory (looms) was mapped or handed over for an interaction that has none.
api:interactions:loom-not-found400 · loomMappingsA loom, or the namespace named to find it in, does not exist.
api:interactions:no-enabled-version400 · interactionIdEvery version of the interaction is disabled.
api:interactions:not-found400 · interactionIdThe interaction does not exist in the tenant.
api:interactions:response-schema-invalid400 · responseJsonSchemaThe responseJsonSchema given with the start is not a valid JSON schema.
api:interactions:swarm-limits-invalid400 · swarmLimitsThe start’s sub-interaction limits are out of range.
api:web:download-partition-invalid400The knowledge base named for the run’s web downloads can’t be used: it isn’t one of your tenant’s temporary knowledge bases.Name one of your tenant’s temporary knowledge bases.
api:web:download-partition-required400The run’s agents may fetch from the web, and nothing names a knowledge base to keep what they fetch: not the start, the namespace or the tenant.Name a temporary knowledge base for the run’s downloads, or set a default one for the namespace or the tenant.

Sending a message or a vote to an interaction run.

CodeStatusWhat it meansWhat to do
api:interaction-process:complete400 · RequestThe run has ended (Finished, Error, Killed); nothing was stored. Permanent.
api:interaction-process:no-vote-pending400 · RequestA vote was sent while no vote or solution proposal is open.
api:interaction-process:not-awaiting-input400 · RequestA vote needs the run parked at a human-input gate, and it is not (it is running). Retry later.Try again when it asks.
api:interaction-process:vote-pending400 · RequestThe run is parked on a vote or solution proposal: it takes a vote, not a message.Vote instead of sending a message.

A run that can’t make a model call ends with status Error, and its failure details end with one of these codes in brackets: ... [api:credentials:all-failed]. See when the stack can’t serve a call and when there’s no key.

CodeStatusWhat it meansWhat to do
api:credentials:all-failedIn the runEvery credential that could serve the call failed.Replace the key, then retry. Test the credential to see which key fails.
api:credentials:no-usable-credentialIn the runNo credential in the run’s stack serves this model, or every one that does is switched off.Add a credential that serves the model to the stack, or change the entries’ rules.
api:model-keys:all-failedIn the runEvery key a model call could use for the provider failed (authentication, quota or endpoint), and the platform’s key is not allowed. Carried at the end of a run’s failure text, in brackets.Check the key with the provider, and replace it.
api:model-keys:none-for-providerIn the runA model call had no key to run on: none supplied with the run, none of the tenant’s for the provider, and the platform’s key not allowed. Carried at the end of a run’s failure text, in brackets.Add a model key for the provider, or give the run a credential stack.

Listing runs, and how long they are kept.

CodeStatusWhat it meansWhat to do
api:processes:invalid-cursor400 · cursorThe cursor isn’t one this list gave out.Start again from the first page.
api:processes:invalid-ids400 · idsAn id isn’t a run id, or more than 50 are asked for at once.
api:processes:invalid-namespaces400 · namespaceMore than 50 namespaces are asked for at once.
api:processes:invalid-state400 · stateThe state isn’t active, waiting or terminal.
api:processes:invalid-status400 · statusesA status isn’t one that the run types asked for can have.
api:processes:invalid-type400 · typesA type isn’t App, Interaction, Capsule or CodePipeline.
api:processes:retention:lease-inherited400 · processIdThe run’s lease is inherited from a retained ancestor — release that run instead.Release that run instead.
api:processes:retention:lease-limit-reached400 · processIdThe tenant already holds its maximum of own leases.Release runs you no longer need, then try again.
api:processes:retention:note-too-long400 · noteThe note is too long.Keep it to 500 characters.
api:processes:summary:invalid-hours400 · hourshours isn’t from 1 to 168.
api:tenant:retention-out-of-range400 · hoursThe retention asked for is outside what your plan allows.Choose a retention your plan allows, in whole hours. Upgrade to keep runs longer.

Adding and changing credentials, and subscription sign-ins for code pipelines.

CodeStatusWhat it meansWhat to do
api:credentials:cloud-invalid400Check the cloud settings: Bedrock and Vertex are for Anthropic credentials, with a region (and for Vertex a project) and no endpoint.
api:credentials:endpoint-invalid400 · endpointAn endpoint is a whole https:// address, with no user name, password, query or fragment.
api:credentials:endpoint-not-public400 · endpointThat endpoint isn’t on the public internet. Maitento only calls public https endpoints.
api:credentials:key-invalid400 · keysA key is one piece of text with no spaces, at most 4096 characters (a Vertex key is the whole JSON key file).
api:credentials:key-unknown400 · keysA key on this credential changed while you were editing it. Close this and open it again.
api:credentials:keys-required400 · keysAdd at least one key.
api:credentials:limit-reached400 · credentialsYour plan holds no more credentials.Delete one you no longer use, or change plan.
api:credentials:models-invalid400 · modelsCheck the models: each needs a name with no spaces, listed once, with a positive context window if you give one.
api:credentials:name-in-use400 · nameYou already have a credential with that name.Choose another.
api:credentials:name-required400Give the credential a name.
api:credentials:name-too-long400 · nameA credential’s name is at most 100 characters, with no line breaks.
api:credentials:not-a-sign-in400That credential isn’t a sign-in for this coding agent.
api:credentials:provider-invalid400 · providerChoose a provider.
api:credentials:sign-in-code-required400 · codePaste the code the provider showed after you signed in.
api:credentials:sign-in-fixed400 · credentialA sign-in’s provider, endpoint and tokens come from signing in.Sign in again to change them.
api:credentials:sign-in-refreshed-by-caller400 · credentialIdThe application that brought this sign-in keeps it fresh, so it can’t be signed in again here.
api:credentials:sign-in-refreshed-here400 · idMaitento keeps this sign-in fresh itself.Sign in again to replace its tokens.
api:credentials:sign-in-refused400 · codeThe provider refused that code. Copy it again, whole, from the page it showed you, or start again.
api:credentials:sign-in-tokens-invalid400The sign-in’s tokens are incomplete.Send the access and refresh tokens, Codex’s ID token, and when the access token expires.
api:credentials:sign-in-unavailable400The provider’s sign-in isn’t answering right now.Try again in a few minutes.
api:credentials:sign-in-unknown400 · signInIdThat sign-in has finished or expired.Start again.
api:credentials:tag-invalid400 · tagA tag is at most 100 characters, with no line breaks.
api:credentials:too-many-keys400 · keysA credential holds at most 10 keys.

A test of a credential answers 200 whether it passes or not. Each key that fails has one of these codes as its errorCode, and the result’s own errorCode is the first failing key’s.

CodeStatusWhat it meansWhat to do
api:credentials:test-auth-failedIn the resultThe provider refused the key.
api:credentials:test-endpoint-not-foundIn the resultNothing answers at the endpoint’s models route.Check the endpoint.
api:credentials:test-endpoint-refusedIn the resultMaitento won’t connect to that endpoint’s address.
api:credentials:test-not-supportedIn the resultClaude on Bedrock or Vertex can’t be tested here.
api:credentials:test-provider-errorIn the resultThe provider had an error of its own.Try again later.
api:credentials:test-quota-exhaustedIn the resultThe key’s account is out of quota or can’t pay.
api:credentials:test-rejectedIn the resultThe provider turned the request down.
api:credentials:test-timed-outIn the resultThe endpoint didn’t answer in time.
api:credentials:test-unreachableIn the resultThe endpoint couldn’t be reached.

Making and using credential stacks.

CodeStatusWhat it meansWhat to do
api:credential-stacks:credential-unknown400 · entriesA credential in this stack no longer exists.Remove it, then save.
api:credential-stacks:entries-invalid400 · entriesCheck the entries: a stack has 1 to 20 credentials, and each rule names at least one model or endpoint kind.
api:credential-stacks:in-use-as-default400 · idThis stack is a default, for the tenant or a namespace, so it can’t be deleted.Change that default first.
api:credential-stacks:in-use-by-partition400 · idA knowledge base embeds with this stack, so it can’t be deleted.Give the knowledge base another stack, or clear its stack, first.
api:credential-stacks:limit-reached400 · credentialStacksYour plan holds no more credential stacks.Delete one you no longer use, or change plan.
api:credential-stacks:name-in-use400 · nameYou already have a stack with that name.Choose another.
api:credential-stacks:name-required400Give the stack a name.
api:credential-stacks:name-too-long400 · nameA stack’s name is at most 100 characters, with no line breaks.
api:credential-stacks:unknown400That stack doesn’t exist in this tenant.
api:credential-stacks:with-credentials400A run can’t have a stack and keys of its own at once.Choose one.

Adding and changing your tenant’s model keys.

CodeStatusWhat it meansWhat to do
api:model-keys:api-key-invalid400 · apiKeyThe key is too long, or holds whitespace or control characters.Paste the key on its own: no spaces or line breaks, and at most 4,096 characters.
api:model-keys:api-key-required400 · apiKeyNo key was given on create (or an empty one on update).Paste the API key.
api:model-keys:base-url-invalid400 · baseUrlNot an absolute https URL with a host and no embedded credentials.Enter a full https URL, without a user name or password.
api:model-keys:base-url-not-allowed400 · baseUrlThe host is not a public endpoint (loopback, private, link-local or an internal name).Use a public endpoint.
api:model-keys:label-required400 · labelNo label was given.Give the key a label.
api:model-keys:label-too-long400 · labelThe label is longer than 100 characters.Use at most 100 characters for the label.
api:model-keys:limit-reached400 · providerThe tenant already holds the most keys it may.Delete keys you no longer use, then try again.
api:model-keys:model-name-overrides-invalid400 · modelNameOverridesA blank or over-long name, or too many entries.Check the model name overrides: each needs both names, up to 200 characters each, and a key can have at most 50.
api:model-keys:priority-out-of-range400 · priorityOutside 0–1000.Choose a priority from 0 to 1000.
api:model-keys:provider-invalid400 · providerThe provider is not one a key can be stored for.Choose a provider a model key can be for.
api:model-keys:provider-required400 · providerNo provider was given.Choose a provider.

Knowledge bases (partitions in the API) and the embedding models that index them. A file that couldn’t be indexed has api:embeddings:fallback-not-permitted or api:embeddings:credentials-exhausted in its indexingFailure. See Knowledge.

CodeStatusWhat it meansWhat to do
api:embeddings:credential-api-key-required400 · credentialsAn embedding credential without an API key.
api:embeddings:credential-base-url-invalid400 · baseUrlA credential’s base URL is not an absolute https URL.
api:embeddings:credential-base-url-not-allowed400 · baseUrlAn embedding credential’s base URL is not a public provider endpoint.
api:embeddings:credential-base-url-required400A credential for a provider with no default endpoint (Qwen) carries no base URL.
api:embeddings:credential-id-duplicate400 · credentialsTwo embedding credentials share a credential id.
api:embeddings:credential-id-required400 · credentialsAn embedding credential without a credential id.
api:embeddings:credential-provider-mismatch400A credential is for a different provider from the partition’s profile.
api:embeddings:credentials-empty-without-consent400 · credentialsAn empty embedding credential stack without consent to Maitento’s key.
api:embeddings:credentials-exhausted400 · partitionEvery key that could embed for the knowledge base failed, or is switched off for failing, and Maitento’s own key may not be used.Check the keys.
api:embeddings:fallback-not-permitted400 · partitionNothing can embed for the knowledge base: it has no embedding credentials or stack of its own, your tenant has no model key for the provider, and Maitento’s own key may not be used for it.Add a model key for the provider, or give the knowledge base credentials or a stack.
api:embeddings:index-rebuild-failed400 · partitionSearch is refused: rebuilding the knowledge base’s index for its new embedding model stopped, because its keys failed.Fix the keys, and the rebuild carries on.
api:embeddings:index-rebuilding400 · partitionSearch is refused while the knowledge base’s index is rebuilt for a new embedding model, because a half-built index would answer from only some of the files. The message says how far it has got.Try again when it is done.
api:embeddings:invalid-profile400 · profileThe embedding profile isn’t valid. The message says why.
api:embeddings:profile-changed400The knowledge base’s embedding model changed while its credentials or stack were being set.Set them again.
api:embeddings:reindex-in-progress400 · profileThe knowledge base’s index is already being rebuilt.Wait for it to finish before changing the embedding model again.
api:embeddings:reindex-not-permitted400 · profileThe profile asked for needs the index rebuilt, and the request set allowReindex to false. Nothing was changed.
api:partition:files:invalid-cursor400 · cursorThe cursor isn’t one this list gave out.Start again from the first page.
api:partition:lifetime-not-temporary400 · fileLifetimeHoursOnly a temporary partition has a file lifetime.
api:partition:lifetime-out-of-range400 · fileLifetimeHoursA temporary partition’s file lifetime is outside 1–720 hours.
api:partition:not-empty400 · idA knowledge base still holds files, so it cannot be deleted. Delete them first.
api:partition:temporary-not-indexed400 · idA temporary partition is never indexed, so it has no embedding model to change.
api:partition:too-many-ids400 · idsMore partition ids than one status request may name.

A test call of an embedding model (POST /partitions/embedding-profile/probe) says what went wrong in its result’s errorCode. A change to a custom embedding model makes the same call first, and is refused with 400 and the same code when it fails.

CodeStatusWhat it meansWhat to do
api:embeddings:probe-credential-rejectedIn the result, or 400Every key was refused (401/403, or Gemini’s 400 for an invalid key).
api:embeddings:probe-dimension-mismatchIn the result, or 400The model answered, but its embeddings have a different number of dimensions from the profile’s. The result says how many it measured.
api:embeddings:probe-endpoint-unreachableIn the result, or 400The base URL’s host does not exist, or refused a secure connection.
api:embeddings:probe-failedIn the result, or 400Anything else: a refused request, a provider outage, a response that was not an embedding.
api:embeddings:probe-model-not-foundIn the result, or 400The endpoint answered 404: the model id (or the base URL’s path) is wrong.
api:embeddings:probe-needs-credentials400A test call, or a custom embedding model, needs at least one key of your own. It never uses Maitento’s.
api:embeddings:probe-quota-exceededIn the result, or 400The account behind the key cannot pay for the call, or is over a quota.
api:embeddings:probe-rate-limitedIn the result, or 400The provider is rate-limiting the key; try again shortly.
api:embeddings:probe-timed-outIn the result, or 400The call did not finish in time.

Files in a knowledge base.

CodeStatusWhat it meansWhat to do
api:files:update-conflict400 · fileSomething else changed the file while it was being updated. Nothing was changed.Try again.

Deploying, changing and deleting definitions and namespaces. A delete that is blocked answers 400 with one failure for each reason, and each failure’s message names what blocks it.

CodeStatusWhat it meansWhat to do
api:<kind>:delete:has-active-runs400 · idIt has runs that are still going, so it can’t be deleted. The message lists them. <kind> is agent, app, capsule, code-pipeline or interaction.Wait for them to end, or kill them.
api:<kind>:delete:in-use400 · idThe latest version of another definition uses this one, so it can’t be deleted. The message lists them. <kind> is agent, connector, interaction or tool.Remove it from those definitions, or delete them first.
api:<kind>:delete:referenced-by-automation400 · idAn automation starts it, so it can’t be deleted. The message names the automations. <kind> is app, capsule, code-pipeline or interaction.Remove it from the automation first.
api:definitions:version-conflict400 · versionsAnother change, such as a second deploy of the same namespace, kept adding versions to the definition while this one was being added. Nothing was changed.Try again.
api:namespace:delete:in-progress400 · idA delete of a namespace another delete is checking right now.Wait for that delete to finish.
api:namespace:delete:not-empty400 · idThe namespace still holds definitions, automations, memory or file systems. The message lists them.Delete them first.
api:namespace:deleting400 · namespaceIdThis namespace is being deleted, so nothing can be created in it.Choose another namespace.

Tools, and the connectors they call. See Tools.

CodeStatusWhat it meansWhat to do
api:connectors:address-blocked400 · urlThe connector’s address is not one Maitento will call: a loopback, private, link-local or cluster address, a name that resolves to one, an internal name such as localhost, or one of the platform’s own hosts. Refused when the connector is deployed if the URL names such an address outright, and when a tool is called (including on every redirect) if its name resolves to one.Use a public address.
api:connectors:secret-missing400 · externalOperationsThe tool’s connector needs a secret in a header (auth = "Header"), and nothing gives it one: not the tool’s own auth, not the interaction’s binding, and no run input. Refused when an interaction that can never supply it is deployed; when the secret is an optional run input that a run was not given, calling the tool answers with this code.Set the tool’s auth, its binding’s auth, or accept the secret as a run input.

Creating and triggering automations.

CodeStatusWhat it meansWhat to do
api:automations:app-input-missing400 · actionsOn create and update: an action starts an app version without a value for one of the inputs it declares (its main’s parameters). Every app input is required.
api:automations:start-failed400 · actionsFrom a manual trigger: none of the automation’s actions could be started. The message says why; the failures that follow it carry the cause’s own codes. Each failure is in the history too.

Registering webhooks, and delivering to them.

CodeStatusWhat it meansWhat to do
api:webhook:header-value-required400 · headersA header has no value, and there is no stored value to keep.Send its value.
api:webhook:secret-required400 · secretAn update that moves the registration to a new origin without supplying the secret again.
api:webhooks:address-blocked400 · urlThe webhook’s address is not one Maitento will deliver to: a loopback, private, link-local or cluster address, a name that resolves to one, an internal name such as localhost, or one of the platform’s own hosts. Refused when the webhook is registered if the URL names such an address outright; otherwise each delivery to it is recorded as failed with this code in its failure details.Use a public address.
api:webhooks:already-exists400 · urlA live registration already has this URL and type.

Listing a namespace’s builds.

CodeStatusWhat it meansWhat to do
api:builds:invalid-cursor400 · cursorThe cursor isn’t one this list gave out.Start again from the first page.
api:builds:invalid-namespace400 · namespaceNo namespace was named.
api:builds:invalid-outcome400 · outcomeThe outcome filter isn’t Succeeded, Failed or Rejected.

Reading your usage.

CodeStatusWhat it meansWhat to do
api:usage:invalid-bucket400 · bucketHourly totals cover at most 31 days.Choose daily or weekly totals for a longer range.
api:usage:invalid-dimension400 · groupByUsage can’t be grouped that way.
api:usage:invalid-filter400One of the filters isn’t valid.Remove it and try again.
api:usage:invalid-metric400 · metricThat measure isn’t available.
api:usage:invalid-namespaces400 · namespaceMore than 50 namespaces are asked for at once.Filter by at most 50 namespaces at a time.
api:usage:invalid-range400That date range can’t be shown.Choose a start before the end, at most 400 days apart.
api:usage:invalid-sort400 · sortUsage can’t be sorted that way.

The people in your tenant, their API keys, and inviting more.

CodeStatusWhat it meansWhat to do
api:invitation:code-no-remaining-uses400 · invitationCodeIdYou’ve used every invitation on your code.Cancel a pending invite to free one up.
api:invitation:email-address-already-in-use400 · emailAddressSomeone already has an account with this email address.
api:invitation:email-address-already-invited400 · emailAddressYou’ve already invited this email address, and that invite hasn’t been used yet.
api:invitation:grants-admin-requires-admin403Only a tenant admin can invite another admin.
api:invitation:grants-admin-requires-invite-to-tenant400 · grantsAdminAn admin invite has to invite the person into this tenant.
api:invitation:invalid-scope400 · scopeThat list of invites isn’t available.
api:invitation:invite-to-tenant-requires-admin403Only a tenant admin can invite people into this tenant.
api:invitation:no-matching-codes400 · invitationCodeIdThat invitation code doesn’t exist or isn’t yours.
api:invitation:tenant-scope-requires-admin403Only a tenant admin can see everyone’s invites.
api:invitation:too-many-pending-invites400 · emailAddressThis tenant already has 100 invites waiting to be accepted.Cancel the ones you no longer need, then try again.
api:invitation:used-or-cancelled400 · invitationIdThis invite has already been used or cancelled.
api:user:api-key-create:expiry-in-past400 · dateExpiresThe API key’s expiry date is in the past.Choose an expiry date in the future.
api:user:api-key-create:name-exists400 · nameYou already have an API key with this name.
api:user:cannot-modify-own-account400 · userIdYou can’t change your own role or status.
api:user:email-already-verified400 · idThis email address is already verified. You can sign in.

Signing up a new tenant (POST /tenants/register), joining one (POST /users/register), and signing in with a password.

CodeStatusWhat it meansWhat to do
api:auth:email-not-verified400 · EmailAddressYour email address hasn’t been verified yet.Open the verification link we emailed you, then sign in.
api:tenant:register:code-not-found400 · codeSign-up without an invitation isn’t open. If someone has invited you, open the invitation link in your email.
api:tenant:register:email-domain-blocked400 · emailAddressSign-up isn’t open to this email domain.Use a different address.
api:tenant:register:email-in-use400 · emailAddressThis email address has already been used to sign up.Sign in instead.
api:tenant:register:invite-code-mismatch-required400 · inviteIdThe invite and the invitation code don’t match.
api:tenant:register:invite-email-mismatch400 · emailAddressThe invite was sent to a different email address.
api:tenant:register:invite-not-found400 · inviteIdThe invite doesn’t exist, or has been used or cancelled.
api:tenant:register:invite-not-valid-for-new-tenant-registration400 · inviteIdThe invite is to join an existing tenant, not to sign up a new one.Join with POST /users/register instead.
api:tenant:register:sign-up-closed400 · emailAddressSign-up isn’t open here.Ask a tenant admin to invite you.
api:tenant:register:verification-failed400 · turnstileTokenWe couldn’t confirm you’re not a robot.Complete the check again, then sign up.
api:user:register:email-in-use400 · emailAddressAn account already exists for this email address.Sign in instead.
api:user:register:invite-email-mismatch400 · emailAddressThis invitation was sent to a different email address.
api:user:register:invite-not-found400 · inviteIdThis invitation is no longer valid.
api:user:register:invite-not-valid-for-joining-tenant-registration400 · inviteIdThis invitation can’t be used to join a tenant.

Signing in, or signing up, with an identity provider runs in the browser. When it fails, the browser is sent back to the portal with the code in the error query parameter (“Redirect” below). Finishing a sign-in (POST /auth/sso/exchange), and linking or unlinking a provider, answer with the code instead.

CodeStatusWhat it meansWhat to do
api:auth:sso:account-disabled400The account is disabled.Ask an admin of your team to enable it.
api:auth:sso:account-not-verified400 · codeThe account’s e-mail address hasn’t been verified.Open the verification link we emailed you, then sign in.
api:auth:sso:browser-mismatchRedirectThe provider came back to a browser other than the one that started the sign-in.Start it again in the browser you want to use.
api:auth:sso:cancelledRedirectThe person cancelled at the provider (or refused consent).
api:auth:sso:email-domain-blockedRedirectSigning up: the address’s domain can’t be used to sign up.Use an account with a different address.
api:auth:sso:email-in-useRedirectSigning up: the address, or a variant of it, is in use or has signed up before.Sign in instead.
api:auth:sso:email-not-verified400 · codeSigning up: the provider didn’t say the identity’s e-mail address is verified.Verify it with the provider, then try again.
api:auth:sso:exchange-failedRedirectThe provider’s code couldn’t be redeemed, or what it returned couldn’t be trusted.Try again.
api:auth:sso:identity-linked-to-another-account400 · providerThe identity is linked to another account.Unlink it there first, or use another one.
api:auth:sso:interactive-session-required403Only a person’s own signed-in session can change how they sign in: not an API key or a run’s token.
api:auth:sso:invalid-code400 · codeThe one-time code is unknown, expired, used, for another purpose, or doesn’t match the verifier.Start it again.
api:auth:sso:invalid-link-token400 · tokenThe link-confirmation link is unknown, expired, used or wrong.
api:auth:sso:invalid-requestRedirectA start without a valid codeChallenge, or with an unknown intent.Try again.
api:auth:sso:invalid-stateRedirectThe provider came back with a state that is missing, unknown, expired, already used or another provider’s.Start it again.
api:auth:sso:last-sign-in-method400 · providerThe identity is the account’s only way to sign in, so it can’t be unlinked.Set a password or link another provider before you remove it.
api:auth:sso:link-confirmation-requiredRedirectThe identity’s verified address is an existing account’s, which isn’t linked to it: nothing is linked automatically, and the account’s owner has been e-mailed a link to confirm it.
api:auth:sso:no-accountRedirectSigning in: no account is linked to the identity, and none has its verified address.Sign in another way, or use the account you joined with.
api:auth:sso:no-pending-link400 · pendingLinkThere is no link waiting for confirmation.
api:auth:sso:provider-already-linked400The account already has an identity at that provider; unlink it first.Unlink it before linking a different one.
api:auth:sso:provider-errorRedirectThe provider came back with an error, or without a code.Try again in a moment.
api:auth:sso:provider-not-enabledRedirectThe provider isn’t one Maitento knows, or isn’t set up on this deployment.Use another way to sign in.
api:auth:sso:provider-not-linked400 · providerThe account has no identity at that provider.
api:auth:sso:resend-too-soon400 · pendingLinkA confirmation e-mail was sent moments ago; wait before asking for another.Wait a few minutes before asking for another.
api:auth:sso:sign-up-closedRedirectSigning up: sign-up isn’t open.Ask a tenant admin to invite you.
api:auth:sso:unknown-provider400 · providerThe provider named isn’t one Maitento knows.

The live notification feed (GET /notifications).

CodeStatusWhat it meansWhat to do
api:notifications:invalid-scope400 · scopeThe scope isn’t user or tenant.

Opening the portal’s cloud shell.

CodeStatusWhat it meansWhat to do
api:shell:process-token-refused403The cloud shell was asked for with a run’s token. Only your own signed-in session can open it.
api:shell:too-many-pending-tickets400 · ticketToo many cloud shell connections are being opened at once.Wait a moment and try again.