# API and CLI errors

> Every error the API and the CLI print, by code: what it means and what to do.

Every error the API answers (`code` of the problem details) and every CLI error with a hint has a page here, at `/docs/errors/<code>`. Build diagnostics are in [diagnostics](https://taggor.dev/docs/diagnostics.md).

| Code                                | Where   | en |
| ----------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------- |
| `validation_failed`                 | API 400 | [Request validation failed](https://taggor.dev/docs/errors/validation_failed.md) |
| `malformed_request`                 | API 400 | [Malformed request](https://taggor.dev/docs/errors/malformed_request.md) |
| `unauthenticated`                   | API 401 | [Authentication required](https://taggor.dev/docs/errors/unauthenticated.md) |
| `cross_site_request`                | API 403 | [Cross-site request refused](https://taggor.dev/docs/errors/cross_site_request.md) |
| `workspace_suspended`               | API 403 | [The workspace is suspended](https://taggor.dev/docs/errors/workspace_suspended.md) |
| `component_disabled`                | API 403 | [The component is disabled](https://taggor.dev/docs/errors/component_disabled.md) |
| `suspension_state_changed`          | API 409 | [The workspace's suspension changed during the walk](https://taggor.dev/docs/errors/suspension_state_changed.md) |
| `captcha_failed`                    | API 403 | [The human check failed](https://taggor.dev/docs/errors/captcha_failed.md) |
| `abuse_reports_unavailable`         | API 503 | [The abuse report channel is temporarily unavailable](https://taggor.dev/docs/errors/abuse_reports_unavailable.md) |
| `abuse_case_closed`                 | API 409 | [The abuse case is already closed](https://taggor.dev/docs/errors/abuse_case_closed.md) |
| `usage_flag_reviewed`               | API 409 | [The usage flag is already closed](https://taggor.dev/docs/errors/usage_flag_reviewed.md) |
| `insufficient_scope`                | API 403 | [The credential lacks a required scope](https://taggor.dev/docs/errors/insufficient_scope.md) |
| `permission_denied`                 | API 403 | [The workspace role does not permit this action](https://taggor.dev/docs/errors/permission_denied.md) |
| `human_action_required`             | API 403 | [This action is for a person in the portal](https://taggor.dev/docs/errors/human_action_required.md) |
| `api_key_creation_requires_session` | API 403 | [Only a portal session creates API keys](https://taggor.dev/docs/errors/api_key_creation_requires_session.md) |
| `api_key_scope_exceeds_role`        | API 403 | [The requested scopes exceed the creator's workspace role](https://taggor.dev/docs/errors/api_key_scope_exceeds_role.md) |
| `user_preferences_require_session`  | API 403 | [User preferences require a portal session](https://taggor.dev/docs/errors/user_preferences_require_session.md) |
| `user_sessions_require_portal`      | API 403 | [Session management requires a portal session](https://taggor.dev/docs/errors/user_sessions_require_portal.md) |
| `session_not_found`                 | API 404 | [Session not found](https://taggor.dev/docs/errors/session_not_found.md) |
| `invitation_role_exceeds_role`      | API 403 | [The invitation's role is above the sender's own role](https://taggor.dev/docs/errors/invitation_role_exceeds_role.md) |
| `invitation_email_mismatch`         | API 403 | [The signed-in e-mail is not the one the invitation is for](https://taggor.dev/docs/errors/invitation_email_mismatch.md) |
| `invitation_requires_session`       | API 403 | [Only a portal session accepts invitations](https://taggor.dev/docs/errors/invitation_requires_session.md) |
| `invitation_unavailable`            | API 410 | [The invitation can no longer be accepted](https://taggor.dev/docs/errors/invitation_unavailable.md) |
| `invitation_already_pending`        | API 409 | [This address already has a pending invitation](https://taggor.dev/docs/errors/invitation_already_pending.md) |
| `invitee_already_member`            | API 409 | [This address already belongs to a member](https://taggor.dev/docs/errors/invitee_already_member.md) |
| `invitation_not_pending`            | API 409 | [The invitation is no longer pending](https://taggor.dev/docs/errors/invitation_not_pending.md) |
| `invitation_quota_exceeded`         | API 429 | [Too many invitations sent today in this workspace](https://taggor.dev/docs/errors/invitation_quota_exceeded.md) |
| `notification_quota_exceeded`       | API 429 | [The confirmation could not be requested now](https://taggor.dev/docs/errors/notification_quota_exceeded.md) |
| `notification_token_invalid`        | API 404 | [The notification link is not valid](https://taggor.dev/docs/errors/notification_token_invalid.md) |
| `owner_transfer_unavailable`        | API 410 | [The ownership offer can no longer be accepted](https://taggor.dev/docs/errors/owner_transfer_unavailable.md) |
| `owner_transfer_already_pending`    | API 409 | [The workspace already has a pending ownership offer](https://taggor.dev/docs/errors/owner_transfer_already_pending.md) |
| `owner_transfer_not_ready`          | API 409 | [The ownership offer cannot be accepted yet](https://taggor.dev/docs/errors/owner_transfer_not_ready.md) |
| `owner_recently_changed`            | API 409 | [The workspace changed owner recently](https://taggor.dev/docs/errors/owner_recently_changed.md) |
| `workspace_has_subscription`        | API 409 | [The workspace still has a subscription](https://taggor.dev/docs/errors/workspace_has_subscription.md) |
| `lifecycle_rate_limited`            | API 429 | [Too many deletion requests or ownership offers today](https://taggor.dev/docs/errors/lifecycle_rate_limited.md) |
| `workspace_deletion_scheduled`      | API 409 | [The workspace is scheduled for deletion](https://taggor.dev/docs/errors/workspace_deletion_scheduled.md) |
| `email_unavailable`                 | API 503 | [E-mail cannot be sent in this environment](https://taggor.dev/docs/errors/email_unavailable.md) |
| `session_required`                  | API 403 | [This route needs a portal session](https://taggor.dev/docs/errors/session_required.md) |
| `invalid_preferences`               | API 422 | [User preferences are invalid](https://taggor.dev/docs/errors/invalid_preferences.md) |
| `legal_versions_changed`            | API 409 | [The legal texts changed while the page was open](https://taggor.dev/docs/errors/legal_versions_changed.md) |
| `invalid_login_state`               | API 400 | [Invalid or expired login](https://taggor.dev/docs/errors/invalid_login_state.md) |
| `login_failed`                      | API 400 | [Login failed](https://taggor.dev/docs/errors/login_failed.md) |
| `identity_provider_unavailable`     | API 503 | [Sign-in is not available](https://taggor.dev/docs/errors/identity_provider_unavailable.md) |
| `not_found`                         | API 404 | [Resource not found](https://taggor.dev/docs/errors/not_found.md) |
| `method_not_allowed`                | API 405 | [Method not allowed](https://taggor.dev/docs/errors/method_not_allowed.md) |
| `unsupported_media_type`            | API 415 | [Unsupported media type](https://taggor.dev/docs/errors/unsupported_media_type.md) |
| `request_rejected`                  | API 400 | [Request rejected](https://taggor.dev/docs/errors/request_rejected.md) |
| `rate_limited`                      | API 429 | [Too many requests](https://taggor.dev/docs/errors/rate_limited.md) |
| `client_has_sites`                  | API 409 | [The client still has sites](https://taggor.dev/docs/errors/client_has_sites.md) |
| `rate_limiter_unavailable`          | API 503 | [Rate limiting is temporarily unavailable](https://taggor.dev/docs/errors/rate_limiter_unavailable.md) |
| `invalid_cursor`                    | API 400 | [Invalid pagination cursor](https://taggor.dev/docs/errors/invalid_cursor.md) |
| `idempotency_request_in_progress`   | API 409 | [A request with this idempotency key is in progress](https://taggor.dev/docs/errors/idempotency_request_in_progress.md) |
| `idempotency_key_reused`            | API 422 | [Idempotency key reused with a different request](https://taggor.dev/docs/errors/idempotency_key_reused.md) |
| `build_not_publishable`             | API 409 | [The build cannot become a version](https://taggor.dev/docs/errors/build_not_publishable.md) |
| `version_already_exists`            | API 409 | [The version already exists](https://taggor.dev/docs/errors/version_already_exists.md) |
| `invalid_tag_name`                  | API 400 | [The tag name is not a valid custom element name](https://taggor.dev/docs/errors/invalid_tag_name.md) |
| `component_already_exists`          | API 409 | [The workspace already has a component with this tag](https://taggor.dev/docs/errors/component_already_exists.md) |
| `tag_conflict`                      | API 409 | [Two components of the site use the same Custom Element tag](https://taggor.dev/docs/errors/tag_conflict.md) |
| `component_archived`                | API 409 | [The component is archived](https://taggor.dev/docs/errors/component_archived.md) |
| `version_not_ready`                 | API 409 | [The version's build did not succeed](https://taggor.dev/docs/errors/version_not_ready.md) |
| `breaking_change_not_allowed`       | API 409 | [The version breaks the one in production](https://taggor.dev/docs/errors/breaking_change_not_allowed.md) |
| `no_previous_version`               | API 409 | [The channel has no earlier version to go back to](https://taggor.dev/docs/errors/no_previous_version.md) |
| `channel_moved`                     | API 409 | [The channel no longer points to the version the request expected](https://taggor.dev/docs/errors/channel_moved.md) |
| `site_component_limit`              | API 409 | [The site already has the most components its plan allows](https://taggor.dev/docs/errors/site_component_limit.md) |
| `site_props_invalid`                | API 422 | [The site's props do not fit the component](https://taggor.dev/docs/errors/site_props_invalid.md) |
| `site_props_incompatible`           | API 409 | [The site's saved props do not fit the new version](https://taggor.dev/docs/errors/site_props_incompatible.md) |
| `site_props_conflict`               | API 409 | [The site's props changed since they were read](https://taggor.dev/docs/errors/site_props_conflict.md) |
| `channel_has_no_version`            | API 409 | [The channel has no version yet](https://taggor.dev/docs/errors/channel_has_no_version.md) |
| `plan_limit_reached`                | API 402 | [The workspace reached a limit of its plan](https://taggor.dev/docs/errors/plan_limit_reached.md) |
| `invalid_webhook_signature`         | API 400 | [The webhook signature is invalid](https://taggor.dev/docs/errors/invalid_webhook_signature.md) |
| `billing_conflict`                  | API 409 | [The billing request does not fit the workspace's billing state](https://taggor.dev/docs/errors/billing_conflict.md) |
| `billing_unavailable`               | API 503 | [Billing is temporarily unavailable](https://taggor.dev/docs/errors/billing_unavailable.md) |
| `retention_exceeds_plan`            | API 422 | [A collection cannot keep submissions longer than the plan does](https://taggor.dev/docs/errors/retention_exceeds_plan.md) |
| `api_key_in_use`                    | API 409 | [An API key cannot revoke itself](https://taggor.dev/docs/errors/api_key_in_use.md) |
| `api_key_quota_exceeded`            | API 409 | [The workspace reached its limit of active API keys](https://taggor.dev/docs/errors/api_key_quota_exceeded.md) |
| `semver_bump_too_small`             | API 409 | [The semver is too small for the manifest changes](https://taggor.dev/docs/errors/semver_bump_too_small.md) |
| `breaking_collection_change`        | API 409 | [The version breaks the schema of a collection that holds data](https://taggor.dev/docs/errors/breaking_collection_change.md) |
| `payload_too_large`                 | API 413 | [The request body is too large](https://taggor.dev/docs/errors/payload_too_large.md) |
| `source_package_invalid`            | API 422 | [The source package is not valid](https://taggor.dev/docs/errors/source_package_invalid.md) |
| `conversion_event_not_in_manifest`  | API 422 | [The conversion event is not declared in the component's manifest](https://taggor.dev/docs/errors/conversion_event_not_in_manifest.md) |
| `export_too_large`                  | API 422 | [The export holds too many submissions](https://taggor.dev/docs/errors/export_too_large.md) |
| `build_quota_exceeded`              | API 429 | [The workspace reached its build limit for the last 7 days](https://taggor.dev/docs/errors/build_quota_exceeded.md) |
| `platform_build_capacity`           | API 429 | [The platform reached its weekly emergency build fuse](https://taggor.dev/docs/errors/platform_build_capacity.md) |
| `database_unavailable`              | API 503 | [The service is temporarily unavailable](https://taggor.dev/docs/errors/database_unavailable.md) |
| `manifest_publish_unavailable`      | API 503 | [The change was saved but the site manifest is not updated yet](https://taggor.dev/docs/errors/manifest_publish_unavailable.md) |
| `internal_error`                    | API 500 | [Internal server error](https://taggor.dev/docs/errors/internal_error.md) |
| `configuration_error`               | API 500 | [Service misconfigured](https://taggor.dev/docs/errors/configuration_error.md) |
| `api.error`                         | CLI     | [The API refused the request](https://taggor.dev/docs/errors/api.error.md) |
| `sites.invalidHold`                 | CLI     | [The hold is not 1 to 3 seconds](https://taggor.dev/docs/errors/sites.invalidHold.md) |
| `sites.invalidLoading`              | CLI     | [The loading value is not eager or idle](https://taggor.dev/docs/errors/sites.invalidLoading.md) |
| `api.network`                       | CLI     | [The API cannot be reached](https://taggor.dev/docs/errors/api.network.md) |
| `publish.attachFailedAfterVersion`  | CLI     | [The version was created but attaching to the site failed](https://taggor.dev/docs/errors/publish.attachFailedAfterVersion.md) |
| `api.rateLimited`                   | CLI     | [Too many requests](https://taggor.dev/docs/errors/api.rateLimited.md) |
| `auth.notLoggedIn`                  | CLI     | [Not logged in](https://taggor.dev/docs/errors/auth.notLoggedIn.md) |
| `auth.rejected`                     | CLI     | [The API rejected the login](https://taggor.dev/docs/errors/auth.rejected.md) |
| `auth.forbidden`                    | CLI     | [Not allowed](https://taggor.dev/docs/errors/auth.forbidden.md) |
| `auth.humanActionRequired`          | CLI     | [This is for a person](https://taggor.dev/docs/errors/auth.humanActionRequired.md) |
| `input.missingFlag`                 | CLI     | [A flag is required](https://taggor.dev/docs/errors/input.missingFlag.md) |
| `agent.noProject`                   | CLI     | [No Taggor project here](https://taggor.dev/docs/errors/agent.noProject.md) |
| `agent.noBundle`                    | CLI     | [This CLI carries no agent files](https://taggor.dev/docs/errors/agent.noBundle.md) |
| `agent.badTarget`                   | CLI     | [Unknown agent](https://taggor.dev/docs/errors/agent.badTarget.md) |
| `agent.unsafePath`                  | CLI     | [Refused to write an agent file](https://taggor.dev/docs/errors/agent.unsafePath.md) |
| `agent.markers`                     | CLI     | [The Taggor block markers cannot be read](https://taggor.dev/docs/errors/agent.markers.md) |
| `agent.bundleCorrupt`               | CLI     | [The agent files in this CLI are damaged](https://taggor.dev/docs/errors/agent.bundleCorrupt.md) |
| `publish.noProject`                 | CLI     | [No taggor.json found](https://taggor.dev/docs/errors/publish.noProject.md) |
| `publish.buildTimeout`              | CLI     | [The build did not finish in time](https://taggor.dev/docs/errors/publish.buildTimeout.md) |
| `pull.versionAndChannel`            | CLI     | [--version and --channel together](https://taggor.dev/docs/errors/pull.versionAndChannel.md) |
| `pull.noVersions`                   | CLI     | [The component has no version to pull](https://taggor.dev/docs/errors/pull.noVersions.md) |
| `pull.channelEmpty`                 | CLI     | [The channel points to nothing](https://taggor.dev/docs/errors/pull.channelEmpty.md) |
| `pull.hashMismatch`                 | CLI     | [The downloaded source does not match its hash](https://taggor.dev/docs/errors/pull.hashMismatch.md) |
| `pull.noHash`                       | CLI     | [The API sent the source without its hash](https://taggor.dev/docs/errors/pull.noHash.md) |
| `pull.tooLarge`                     | CLI     | [The source package is over the size limit](https://taggor.dev/docs/errors/pull.tooLarge.md) |
| `pull.packageRefused`               | CLI     | [The downloaded source was refused](https://taggor.dev/docs/errors/pull.packageRefused.md) |
| `pull.secrets`                      | CLI     | [The downloaded source holds a credential](https://taggor.dev/docs/errors/pull.secrets.md) |
| `pull.notEmpty`                     | CLI     | [The folder is not empty](https://taggor.dev/docs/errors/pull.notEmpty.md) |
| `projects.invalidDays`              | CLI     | [Invalid --older-than](https://taggor.dev/docs/errors/projects.invalidDays.md) |
| `projects.unsafeName`               | CLI     | [Not a project folder of Taggor](https://taggor.dev/docs/errors/projects.unsafeName.md) |
| `login.expired`                     | CLI     | [The login code expired](https://taggor.dev/docs/errors/login.expired.md) |
| `login.denied`                      | CLI     | [The login was denied](https://taggor.dev/docs/errors/login.denied.md) |
| `init.renamedProjectKey`            | CLI     | [taggor.json uses an older name for its component list](https://taggor.dev/docs/errors/init.renamedProjectKey.md) |
| `props.invalidName`                 | CLI     | [Not a prop name](https://taggor.dev/docs/errors/props.invalidName.md) |
| `protection.invalidSuspects`        | CLI     | [Unknown choice for suspect submissions](https://taggor.dev/docs/errors/protection.invalidSuspects.md) |
| `protection.invalidDailyCap`        | CLI     | [The daily cap is not a whole number](https://taggor.dev/docs/errors/protection.invalidDailyCap.md) |
| `protection.nothingToSet`           | CLI     | [Nothing to change](https://taggor.dev/docs/errors/protection.nothingToSet.md) |
| `protection.aboveCeiling`           | CLI     | [The daily cap is above the platform's ceiling](https://taggor.dev/docs/errors/protection.aboveCeiling.md) |
| `build.quotaExceeded`               | CLI     | [The workspace reached its build limit for the last 7 days](https://taggor.dev/docs/errors/build.quotaExceeded.md) |
| `build.platformFuse`                | CLI     | [The platform paused new builds for the week](https://taggor.dev/docs/errors/build.platformFuse.md) |
| `props.invalidKind`                 | CLI     | [Unknown way to read the value](https://taggor.dev/docs/errors/props.invalidKind.md) |
| `props.invalidValue`                | CLI     | [The value is not of the kind asked](https://taggor.dev/docs/errors/props.invalidValue.md) |
| `props.notAttached`                 | CLI     | [The component is not attached to the site](https://taggor.dev/docs/errors/props.notAttached.md) |
| `sites.deleteInPortal`              | CLI     | [Deleting a site is done in the portal](https://taggor.dev/docs/errors/sites.deleteInPortal.md) |
| `props.conflict`                    | CLI     | [The site's props kept changing](https://taggor.dev/docs/errors/props.conflict.md) |
| `props.noVersion`                   | CLI     | [The channel has no version yet](https://taggor.dev/docs/errors/props.noVersion.md) |
| `props.invalid`                     | CLI     | [The API refused the prop value](https://taggor.dev/docs/errors/props.invalid.md) |
| `config.invalidApiUrl`              | CLI     | [Invalid API URL](https://taggor.dev/docs/errors/config.invalidApiUrl.md) |
