Skip to content

Reference / Error codes

Error codes ​

Every error is an RFC 9457 Problem Details document with a stable code:

json
{
  "type": "https://docs.anchorkeel.io/errors/sources.blocked-host",
  "title": "…",
  "status": 422,
  "detail": "That address is on a private or internal network. …",
  "code": "Sources.BlockedHost",
  "traceId": "00-…",
  "errors": { "host": ["…"] }
}
  • Branch on code, never on detail (wording can change).
  • Validation failures (400) list field errors in errors. Unknown metric or dimension names (422) add name and suggestions. Unmet certification criteria (422) add details.
  • HTTP status by error type: Validation 400, Unauthorized 401, Forbidden 403, NotFound 404, Conflict 409, Concurrency (stale If-Match / expected version) 412, Unprocessable (a domain rule) 422, RateLimited 429, Failure 500.
  • Cross-tenant access looks exactly like "not found" (404): another tenant's resources are never disclosed.
  • Provider (database, Git, LLM) error text is never passed through; Keel writes its own message.

All codes ​

Generated from the code. … marks a value filled in at run time.

482 codes in 28 areas.

Agents ​

CodeHTTPMessage
Agents.CertificateInvalid400The agent certificate must be one PEM-encoded ECDSA P-256 certificate without its private key.
Agents.ChannelInvalid400The release channel must be stable, beta or pinned (or empty to follow the pool).
Agents.EnrollmentTokenInvalid401The enrollment token is invalid, expired or already used. Create a new agent enrollment.
Agents.LocationInvalid400The location must be at most 80 characters.
Agents.NameInvalid400The agent name must be 1–80 characters.
Agents.NameTaken409An agent with this name already exists in the workspace.
Agents.NotFound404The private agent was not found.
Agents.PinnedVersionInvalid400A pinned channel needs a version such as 1.4.0 (and only a pinned channel takes one).
Agents.PoolInvalid400The pool name must be 1–40 lower-case letters, digits, '.', '_' or '-'.
Agents.ReleaseNotFound404The control plane has no agent package of this version for this platform.
Agents.ReleaseUnsupported422Agent … is two or more major versions behind the control plane (…) and would be refused: pin a newer version.
Agents.Revoked403This agent was revoked.
Agents.VersionUnsupported422Keel agent … is two or more major versions behind the control plane (…) and was refused. Update it: …
Agents.WorkNotFound404The work item does not exist, is not assigned to this agent, or the server stopped waiting for it.

Audit ​

CodeHTTPMessage
Audit.InvalidCursor400The cursor is not valid.
Audit.InvalidDateRange400'from' must be before 'to'.
Audit.RetentionFailed500Retention crashed for at least one tenant.
Audit.RetentionOutOfRange400Retention must be between … and … days.
Audit.UnknownExportFormat400Export format must be csv or json.
Audit.VerificationFailed500Verification crashed for at least one tenant.

Authorization ​

CodeHTTPMessage
Authorization.Forbidden403You do not have permission to approve change requests.

Billing ​

CodeHTTPMessage
Billing.AnnualValueInvalid400The contract's annual value is an amount in US dollars of 0 or more, with at most two decimals.
Billing.CheckoutRequired422Choose a paid plan first; add-ons are added to a paid subscription.
Billing.ContactSales422This plan is sold by contract. Talk to sales to switch to it.
Billing.LimitOverrideInvalid400A contract limit names a known limit and is a whole number of 0 or more, or unlimited.
Billing.ManagedByContract422The subscription is managed by contract. Contact Anchor to change it.
Billing.NoSubscription404The tenant has no subscription yet.
Billing.NotTrialing409The subscription is not a Keel trial.
Billing.PaymentProviderFailed500The payment provider did not answer. Try again in a moment.
Billing.PaymentsDisabled422Payments are not configured on this deployment.
Billing.ReadOnly403This workspace is read-only because its trial or subscription has ended. Choose a plan in Settings → Billing to make changes again; nothing has been deleted.
Billing.SamePlan409The tenant is already on this plan.
Billing.TrialExpiryFailed500Expiring trials failed for at least one tenant.
Billing.TrialExtensionClosed409The trial ended more than 30 days ago and can no longer be extended. Put the tenant on a plan or a contract instead.
Billing.TrialExtensionInvalid400A trial is extended by 1 to 90 days.
Billing.TrialNotExpired409The trial has not ended.
Billing.TrialTooLong422A trial lasts at most 90 days from its start, extensions included.
Billing.UnknownAddOn400The catalog has no such add-on.
Billing.UnknownPlan400The catalog has no such plan.
Billing.WebhookPayloadInvalid400The webhook payload is not a valid event.
Billing.WebhookSignatureInvalid401The webhook signature is missing, invalid or too old.

Cutover ​

CodeHTTPMessage
Cutover.AlreadyRolledBack409The cutover switch is already rolled back.
Cutover.AlreadySwitched409The cutover switch is already applied.
Cutover.CertifiedMetricUnmappable422Certified metric(s) … read columns the migration plan drops or transforms into something else.
Cutover.Forbidden403Only a Steward or Owner running the Migrate cutover can switch or roll back serving.
Cutover.InvalidMap400'…' is not a schema-qualified table (schema.table) or column (schema.table.column).
Cutover.InvalidModel422Model … would not be valid on the target: …
Cutover.Pending409The cutover switch did not finish: confirm the switch again to complete it before rolling back.
Cutover.SameSource400The migration's source and target are the same data source.
Cutover.SourceNotFound404The migration's source is not a data source of this workspace.
Cutover.SwitchNotFound404The cutover switch was not found.
Cutover.TargetNotFound404The migration's target is not a data source of this workspace.

Discovery ​

CodeHTTPMessage
Discovery.BusinessNameRequired400A business name is required.
Discovery.ColumnsNotFound400The tables or columns of the relationship do not exist in the latest snapshot.
Discovery.DriftEventNotFound404The drift event was not found.
Discovery.DriftEventResolved422The drift event is already resolved.
Discovery.DriftNoteTooLong400The note can be at most … characters.
Discovery.NoBaseline422Scan the source once before checking it for drift: drift is measured against the last snapshot.
Discovery.NoSnapshot422Scan the source before asserting relationships.
Discovery.ProposalNotDecided422Only accepted or rejected proposals can be undone.
Discovery.ProposalNotFound404The proposal was not found.
Discovery.ProposalSuperseded422The latest scan no longer supports this proposal.
Discovery.RunFinished422The run has already finished.
Discovery.RunInProgress409A scan of this source is already running. Wait for it to finish or cancel it.
Discovery.RunNotFound404The discovery run was not found.
Discovery.RunNotRetryable422Only failed or cancelled runs can be retried.
Discovery.RunNotRunnable422The run cannot be started in its current state.
Discovery.RunNotVisible500The run is not committed yet.
Discovery.SnapshotNotFound404The snapshot was not found.
Discovery.SourceNotFound404The data source was not found.
Discovery.TableNotFound404The table was not found.

Governance ​

CodeHTTPMessage
Governance.AlreadyLinked409The term is already linked to this asset.
Governance.ApprovedTermNeedsSteward403Approved terms can only be changed by stewards and admins.
Governance.CertificationDeprecated422The metric is deprecated.
Governance.CertificationExpiryFailed500Certification expiry failed for at least one tenant.
Governance.DomainNameTaken409A domain with this name already exists under the same parent.
Governance.DomainNotFound404The domain was not found.
Governance.DomainTooDeep422Domains nest at most 5 levels deep.
Governance.EmptySelection400Choose a domain, or a source and schema, to assign in bulk.
Governance.InvalidAssetRef400Asset references look like model:{id}/entity:{name}, metric:{id}/{name}, source:{id}/table:{schema.table} (see docs/02 §6).
Governance.InvalidCertificationRules400The minimum trust score is 0–100 and the validity 30–730 days.
Governance.InvalidDbtManifest400The body is not a dbt manifest.json (metadata and nodes are required).
Governance.InvalidDefinition400A definition is at most 20,000 characters.
Governance.InvalidDomainName400A domain name is 1–80 characters and has no '›'.
Governance.InvalidImport400The file could not be read as a glossary (see the expected columns).
Governance.InvalidLineageDepth400Depth is between 1 and 10.
Governance.InvalidLineageDirection400Direction is up, down or both.
Governance.InvalidMask400A column mask is Full, Hash, Null, or Partial with 1–8 visible trailing characters.
Governance.InvalidOpenLineageEvent400The body is not an OpenLineage RunEvent (job.namespace, job.name, inputs and outputs are required).
Governance.InvalidPerson400Owners and stewards must be members of the workspace.
Governance.InvalidPolicyDescription400A description is at most 2,000 characters.
Governance.InvalidPolicyName400A policy name is 1–120 letters, digits, '_', '.' or '-', starting with a letter or digit.
Governance.InvalidPolicyRoles400Roles are Owner, Admin, Steward, Modeler, Analyst or Viewer, and a role cannot be both targeted and exempt.
Governance.InvalidPolicyScope400The scope is an asset (masks: entity, dimension, table or column; row filters: entity or table), a tag, a domain, or a sensitivity level.
Governance.InvalidRelated400A term has at most 20 related terms of the same workspace.
Governance.InvalidReplacement422The replacement must be another term of the workspace that is not deprecated.
Governance.InvalidRowFilter400A row filter names a dimension, an operator (eq, ne, in, not_in, gt, gte, lt, lte, is_null, is_not_null) and its values.
Governance.InvalidSynonym400Synonyms are 1–120 characters, at most 30 per term, and differ from the term's name.
Governance.InvalidTemplate400Templates are {{user.attributes.name}}, {{user.id}} or {{user.roles}} ({{user.roles}} only as a whole value with eq, ne, in or not_in).
Governance.InvalidTermName400A term name is 1–120 characters.
Governance.LineageModelNotFound404The model was not found in this workspace.
Governance.LineageNodeNotFound404The asset is not part of any model, scanned source or imported lineage of the workspace.
Governance.LineageTooLarge422A lineage scope holds at most … edges.
Governance.LineageWorkspaceRequired400Pass workspaceId, or call with an API key (its workspace is used).
Governance.LinkNotFound404The term is not linked to this asset.
Governance.MemberNotFound404The user is not a member of this workspace.
Governance.MetricNotFound404The metric was not found in this workspace's models.
Governance.ModelNotFound404The model was not found in this workspace.
Governance.NoOwner400Assign an owner, at least one steward, or a domain.
Governance.NotAMetric400Only metrics (metric:{modelId}/{name}) are certified.
Governance.NotCertified422The metric is not at a level this action applies to.
Governance.NotDraft422Only draft terms can be submitted for review.
Governance.NotInReview422Only terms in review can be approved.
Governance.PolicyNameTaken409Another policy in this workspace already has this name.
Governance.PolicyNotAccepted422Accept the suggested policy before enabling or disabling it.
Governance.PolicyNotFound404The access policy was not found.
Governance.PolicyRejected422A rejected suggestion cannot be edited; create a policy instead.
Governance.PolicySuggestionDecided422The policy suggestion was already accepted or rejected.
Governance.ReplacementRequired422The term is linked to certified metrics: choose a replacement term before deprecating it.
Governance.SuggestionDecided422The suggestion was already accepted or rejected.
Governance.SuggestionNotFound404The term suggestion was not found.
Governance.TermDeprecated422The term is deprecated and can no longer change.
Governance.TermNameTaken409Another term in this workspace already has this name.
Governance.TermNotFound404The glossary term was not found.
Governance.UnknownAsset422The asset does not exist in any model or scanned source of the workspace.

Http ​

CodeHTTPMessage
Http.NotThroughFrontDoor403Requests must come through the service's front door.
Http.RateLimited429Too many requests; retry later.

Idempotency ​

CodeHTTPMessage
Idempotency.InProgress409A request with this Idempotency-Key is still being processed.
Idempotency.KeyReused422This Idempotency-Key was already used with a different request.

Identity ​

CodeHTTPMessage
Identity.AlreadyInTenant409You already belong to a tenant.
Identity.AlreadyMember409That person is already a member.
Identity.ApiKeyExpiryInPast400The expiry must be in the future.
Identity.ApiKeyNotFound404The API key was not found.
Identity.ApiKeyScopesRequired400Choose at least one scope.
Identity.AttributesInvalid400At most 20 attributes; names are 1–64 letters, digits, '_' or '-' (unique ignoring case), values 1–200 characters.
Identity.AutoAcceptThresholdInvalid400The auto-accept threshold must be between 0.5 and 1.
Identity.ChannelDeliveryDeadLettered500The channel did not accept the message after every attempt.
Identity.ChannelDeliveryFailed500The channel did not accept the message; retrying.
Identity.ChannelDeliveryNotVisible500The delivery is not committed yet.
Identity.ChannelNameInvalid400The name must be 1–80 characters.
Identity.ChannelNameTaken409A channel with this name already exists in the workspace.
Identity.ChannelNotFound404The notification channel was not found.
Identity.ChannelPruneFailed500Pruning the channel delivery log failed for at least one tenant.
Identity.ChannelSigningSecret422Only generic webhooks have a signing secret.
Identity.ChannelUrlBlocked422The URL points to a private or internal address. Use a public https endpoint.
Identity.ChannelUrlInvalid400Enter the full https:// URL of the incoming webhook.
Identity.DigestFailed500Digest sending failed for at least one tenant.
Identity.DnsUnavailable500DNS lookup failed.
Identity.FeatureInvalid400Unknown feature.
Identity.Forbidden403You do not have permission to perform this action.
Identity.IdpAdminFailed500The identity provider refused or could not be reached.
Identity.IdpAdminNotConfigured500Keel:Keycloak:Admin is not configured.
Identity.InvitationEmailMismatch403The invitation was sent to a different email address.
Identity.InvitationExpired422The invitation has expired.
Identity.InvitationNotFound404The invitation was not found.
Identity.InvitationUsed422The invitation has already been used or revoked.
Identity.LastOwner422The last Owner of a tenant cannot be removed or demoted.
Identity.LastWorkspace422The last active workspace cannot be archived.
Identity.MemberNotFound404The member was not found.
Identity.ModuleInvalid400Unknown module.
Identity.NameInvalid400The name must be 1–80 characters.
Identity.NotificationCursorInvalid400The cursor is not valid.
Identity.NotificationNotFound404The notification was not found.
Identity.NotificationsPeopleOnly403Only people have notifications, not API keys.
Identity.NotificationTypeUnknown400Unknown notification type.
Identity.OnboardingAnswerInvalid400Choose from the listed options.
Identity.OnboardingFinished422Onboarding is already finished.
Identity.OnboardingNotFound404There is no onboarding in progress.
Identity.OnboardingStepInvalid400The step must be 1–4.
Identity.PreferencesInvalid400Choose a theme, a time zone and a number format from the list.
Identity.RegionInvalid400The data region must be US or EU.
Identity.ScimAttributeMappingInvalid400At most 20 mappings; each SCIM attribute (a core attribute or 'urn:…:name') and each Keel attribute (1–64 letters, digits, '_' or '-') once.
Identity.ScimCallerRequired403Only the tenant's SCIM client can call the provisioning API.
Identity.ScimEmailInvalid400A work email is required (emails[primary] or an email-shaped userName).
Identity.ScimGroupExists409A group with this displayName already exists.
Identity.ScimGroupNameInvalid400displayName is required (up to 256 characters).
Identity.ScimGroupNotFound404Resource not found.
Identity.ScimInvalidFilter400Only 'attribute eq "value"' filters are supported.
Identity.ScimNotEnabled404SCIM provisioning isn't set up. Generate a token first.
Identity.ScimOwnerNotMappable400Groups can't grant Owner. Make people Owners in Settings › Members.
Identity.ScimPatchInvalid400The PATCH operation isn't supported.
Identity.ScimTooManyMembers400A group can have at most 50,000 members.
Identity.ScimUserExists409A user with this userName already exists.
Identity.ScimUserNameInvalid400userName is required (up to 256 characters).
Identity.ScimUserNotFound404Resource not found.
Identity.SessionIsCurrent422This is the session you're using. Use Sign out instead.
Identity.SessionNotFound404That session was not found.
Identity.SessionsUnavailable422Your sessions are managed by your identity provider.
Identity.SignupClosed403Keel accounts are by invitation. Request a demo and we'll set up your workspace.
Identity.SignupCompleted409This sign-up is already complete. Sign in to continue.
Identity.SignupEmailInvalid400That email doesn't look right.
Identity.SignupLinkExpired422This sign-up link has expired. Start again to get a new one.
Identity.SignupLinkUsed422This sign-up link has already been used. Start again to get a new one.
Identity.SignupNotFound404This sign-up link isn't valid. Start again to get a new one.
Identity.SignupNotVerified422Verify your email before creating the workspace.
Identity.SignupTurnstileFailed400We couldn't confirm you're not a robot. Please try again.
Identity.SignupUnavailable500Sign-up isn't available right now. Please try again later.
Identity.SignupWorkEmailRequired400Please use your work email.
Identity.SlugInvalid400The slug must be 3–40 lowercase letters, digits or hyphens.
Identity.SlugTaken409That slug is already in use.
Identity.SsoBreakGlassRequired422Choose an Owner who keeps a break-glass sign-in.
Identity.SsoClientIdInvalid400Enter the client ID your identity provider issued (up to 255 characters).
Identity.SsoClientSecretRequired400Enter the client secret your identity provider issued.
Identity.SsoDomainClaimed409That domain is already verified by another organisation.
Identity.SsoDomainExists409That domain is already set up for this tenant.
Identity.SsoDomainFreeMail400Consumer email domains can't be used for single sign-on.
Identity.SsoDomainInvalid400Enter a domain such as example.com.
Identity.SsoDomainNotFound404The domain was not found.
Identity.SsoDomainNotVerified422We couldn't find the TXT record yet. DNS changes can take a few minutes; try again.
Identity.SsoEnforced422Single sign-on is required right now. Turn that off before changing the identity provider.
Identity.SsoIdpAliasInvalid400The identity provider alias must be 1–64 letters, digits, '.', '_' or '-'.
Identity.SsoIdpUnavailable422The identity provider couldn't be registered. Check the URL is reachable and try again.
Identity.SsoNotConfigured422Set up single sign-on first.
Identity.SsoNotTested422Run a successful test sign-in with this configuration before requiring SSO.
Identity.SsoNoVerifiedDomain422Verify at least one domain before requiring SSO.
Identity.SsoRequired403Your organisation requires single sign-on. Sign in with your company SSO.
Identity.SsoTestFailed422The test sign-in didn't come back through your identity provider.
Identity.SsoTestTokenInvalid400The test sign-in token is not valid.
Identity.SsoUrlInvalid400Enter the full https:// URL, without a query string.
Identity.TenantNotFound404Depends on the case, for example: The tenant was not found.
Identity.Unauthenticated401Authentication is required.
Identity.UserNotProvisioned401Sign in again to finish setting up your account.
Identity.WorkspaceArchived422The workspace is archived.
Identity.WorkspaceNameTaken409A workspace with this name already exists.
Identity.WorkspaceNotFound404The workspace was not found.

Imports ​

CodeHTTPMessage
Imports.UploadTooLarge400The upload is too large: at most 10 MB uploaded, 20 MB unzipped, 2 MB per file and 1,000 files.
Imports.UploadUnreadable400A zip in the upload could not be read.

Jobs ​

CodeHTTPMessage
Jobs.NotFound404The job was not found.
Jobs.UnknownEventType500The integration event type is not registered.

Leads ​

CodeHTTPMessage
Leads.ConsentVersionMissing400The consent text version is required.
Leads.EmailInvalid400That email doesn't look right.
Leads.RequiredFieldMissing400Please complete the highlighted fields.
Leads.TurnstileFailed400We couldn't confirm you're not a robot. Please reload the page and try again.

Llm ​

CodeHTTPMessage
Llm.BudgetExceeded429The tenant's LLM token budget (daily guard or the plan's monthly allowance) is used up.
Llm.Disabled422No LLM provider is configured.
Llm.InvalidOutput500The model did not return valid structured output.
Llm.ProviderFailed500The LLM provider did not answer.
Llm.ProviderUnsupported422The tenant's LLM provider is not available.

Migrate ​

CodeHTTPMessage
Migrate.AgentCannotWrite422The write credential's private agent has its migrate write plane turned off (Keel:Agent:MigrateWrite). Turn it on or register the credential on another agent.
Migrate.AgentRequired422A Keel run needs the sources on the same private agent as the write credential (rows move inside your network).
Migrate.ApproverRoleRequired403Only a Steward or Owner can switch serving to the target, approve a cutover step or roll back.
Migrate.ChangeCaptureUnsupported400This change capture mode is not available for the source's engine.
Migrate.CheckNotFailing409An exception can only be recorded for a failing or warning check.
Migrate.CheckNotFound404The reconciliation check was not found in this run.
Migrate.CodeGenerationNotFound404The code generation was not found.
Migrate.CodeMapNotFound404The code map was not found.
Migrate.ColumnMappingNotFound404The column mapping was not found.
Migrate.CutoverNotStarted409Start the cutover first.
Migrate.CutoverStepOutOfOrder409Complete the earlier cutover steps first.
Migrate.ExceptionReasonInvalid400Explain the exception in 10 to 1000 characters.
Migrate.ExecutorInvalid400Only workspace members whose role can run migrations (Owner, Admin or Steward) can be granted migrate:execute.
Migrate.ForceNeedsApproval403Four-eyes is on: the second Steward or Owner forces the switch when they approve it.
Migrate.GitUnavailable422Git delivery is not available: connect a Git repository to the workspace (Settings › Integrations).
Migrate.InvalidRunTransition409The run is not in a state where this is possible.
Migrate.InvalidStatusTransition409The migration is not at a stage where this is possible.
Migrate.MappingDecided409Only a proposed mapping can be decided this way.
Migrate.MappingRejected409A rejected mapping cannot be edited; accept it or mark it as needing work first.
Migrate.NameInvalid400Give the migration a name of 1 to 120 characters.
Migrate.NoTargetDatabase422Reconciliation reads the target database: set the data source that holds the target tables.
Migrate.NotExecutor403You have not been granted migrate:execute on this migration. An Owner or Admin grants it per migration.
Migrate.NothingAccepted422Accept at least one table mapping (with accepted columns) before committing a plan.
Migrate.PlanAlreadyApproved409The plan version is already approved.
Migrate.PlanNotApproved422A Steward or Owner must approve a plan version first.
Migrate.PlanNotFound404The migration plan version was not found.
Migrate.PlanNotLatest409Only the latest plan version can be approved.
Migrate.PlanUnchanged409The accepted mappings are the same as the latest plan version: nothing to commit.
Migrate.ProjectNotFound404The migration project was not found.
Migrate.ProjectSignedOff409The migration is signed off: its mappings and plan can no longer change.
Migrate.ReconciliationNotCompleted409The reconciliation run has not completed.
Migrate.ReconciliationNotLatest409Only the latest completed reconciliation of the approved plan can be signed off.
Migrate.ReconciliationRunNotFound404The reconciliation run was not found.
Migrate.ReconciliationSignedOff409The reconciliation is already signed off.
Migrate.ReconciliationUnsupported422Reconciliation does not run on … sources yet.
Migrate.RecordNotVisible500The record the job works on is not committed yet.
Migrate.ReportIntervalTooLong400The agent must report at least twice per lease (… s): choose a report interval of at most … s.
Migrate.ReportRejected400The run report carries something other than counts, timings, lag, error codes and capped keys: it is rejected.
Migrate.RollbackWindowClosed409The rollback window is closed.
Migrate.RunActive409The migration already has an active run.
Migrate.RunNotActive409The run has ended.
Migrate.RunNotFound404The migration run was not found.
Migrate.SameApprover403Four-eyes is on: a second Steward or Owner, not the person who requested this step, must approve it.
Migrate.ScopeCheckInProgress409The write credential is being checked.
Migrate.ScopeEmpty422None of the tables in the migration's scope is in the sources' latest scans: rescan the sources or widen the scope.
Migrate.ScopeInvalid400The scope lists between 1 and 5,000 tables, each of a source of this migration (or leave it empty for every table).
Migrate.SourceNotFound404A source of the migration was not found in this workspace.
Migrate.SourceNotFrozen409Keel still observes changes on the source: stop the applications writing to it, then confirm again.
Migrate.SourceNotScanned422A source of the migration has not been scanned yet: scan it before inferring mappings.
Migrate.SourcesInvalid400Pick between 1 and 10 distinct source data sources.
Migrate.SupervisionFailed500Supervising migration runs failed for at least one tenant.
Migrate.TableMappingNotFound404The table mapping was not found.
Migrate.TargetDatabaseRequired422A Keel run writes to a registered target data source: set the migration's target database.
Migrate.TargetEmpty422The target has no tables: scan the target source, add entities to the model or upload table definitions.
Migrate.TargetInvalid400The target is not valid: pick a data source, a semantic model or upload DDL or a dbt project.
Migrate.TargetIsSource400The target data source cannot also be a source of the migration.
Migrate.TargetMissing422Set the migration's target first.
Migrate.TargetModelNotFound404The target semantic model was not found in this workspace.
Migrate.TargetSourceNotFound404The target data source was not found in this workspace.
Migrate.TargetUnsupported422Keel runs write to PostgreSQL, SQL Server, Snowflake and BigQuery targets: run the generated code for this target.
Migrate.UnknownColumn400A column does not exist in the target table or in the mapping's source tables.
Migrate.UnknownSourceTable400A source table is not in the latest scan of the migration's sources (name it schema.table).
Migrate.UploadEmpty400Upload CREATE TABLE statements (.sql) or a dbt project (schema .yml files, or a zip of them).
Migrate.WriteCredentialInvalid400Name the write credential's secret on the agent (letters, digits, . _ -), its user name and 1 to 50 target schemas.
Migrate.WriteCredentialMissing422Register the project's write credential on its private agent first.
Migrate.WriteCredentialNotAccepted422The write credential has not passed its scope check: test it and fix what the check reports.
Migrate.WriteCredentialReused400The write credential must be a separate credential: its secret cannot be the one a source or the target reads with (ADR-0021).
Migrate.WriteScopeRefused422The write credential can write outside the target schemas, or lacks rights the run needs: it is refused.

Modeling ​

CodeHTTPMessage
Modeling.BranchExists409A branch with this name already exists.
Modeling.BranchMoved409The branch moved since you loaded it. Reload and try again.
Modeling.BranchNotFound404The branch was not found.
Modeling.BreakingNotAcknowledged422Breaking changes affect consumers: acknowledge them before merging.
Modeling.CannotDeleteMain422main cannot be deleted.
Modeling.ChangeRequestClosed422The change request is no longer open.
Modeling.ChangeRequestExists409An open change request already merges this branch.
Modeling.ChangeRequestNotFound404The change request was not found.
Modeling.ChecksOutdated409A branch moved since the checks ran. Re-run the checks before merging.
Modeling.ExportNotFound404The export was not found.
Modeling.ExportTooLarge422The export is larger than 20 MB.
Modeling.GenerationNotVisible500The generation is not committed yet.
Modeling.GitConnectionNotFound404No Git repository is connected to this workspace. Add one in Settings › Integrations.
Modeling.GitDeliveryUnavailable422Git delivery is not available in this host.
Modeling.GitProviderNotSupported422Pushing to this Git provider is not available yet: GitHub (cloud or Enterprise Server) is supported.
Modeling.GitRepositoryUrlBlocked400The repository host is a private or internal address, which Keel does not connect to.
Modeling.GitRepositoryUrlInvalid400Enter the repository's https URL, e.g. https://github.com/acme/analytics (no credentials in the URL).
Modeling.GitTokenMissing422The repository's access token is missing. Enter it again in Settings › Integrations.
Modeling.GitTokenRequired400An access token is required to connect a repository.
Modeling.ImportBaseMissing422The model has no empty root revision to base the import branch on.
Modeling.ImportNotFound404The import was not found.
Modeling.InvalidApprovalCount400Required approvals is between 1 and 5.
Modeling.InvalidBranchName400Branch names use letters, digits, - _ . and / (no leading or trailing slash).
Modeling.InvalidDefinition400The model document is incomplete: every entity needs a name, source, keys, dimensions and measures lists.
Modeling.InvalidExportPath400The path prefix is a relative folder of letters, digits, - _ . and / (no ".."), at most 200 characters.
Modeling.InvalidModel422The model has validation errors.
Modeling.InvalidModelName400A model name is 1–120 characters.
Modeling.InvalidTitle400A title is 1–200 characters.
Modeling.InvalidVersion400Versions look like v1.2.3 and must be higher than the latest release.
Modeling.MainIsProtected403main is protected: open a change request, or let Owners commit directly in the model settings.
Modeling.MergeConflicts409Both branches changed the same objects. Resolve the conflicts to merge.
Modeling.MetricExists409The model already has a metric named ….
Modeling.ModelNotFound404The model was not found.
Modeling.NoImportFiles400Upload at least one model file (or a zip of the project).
Modeling.NotApproved422The change request needs the required approvals.
Modeling.NothingDiscovered422None of the model's sources has been scanned yet. Scan a source first.
Modeling.NothingToMerge422The branch has no changes against its target.
Modeling.ReleaseNotFound404The release was not found.
Modeling.RevisionNotFound404The revision was not found.
Modeling.SameBranch400Source and target branches must differ.
Modeling.SelfApproval403You cannot approve your own change request.
Modeling.ServingCutoverUnavailable422Repointing serving to the target is not available in this host.
Modeling.StrategyActionNotFound404The strategy report has no such action.
Modeling.UnknownExportTarget400Unknown export target. Use dbt, cube, looker, powerbi or osi.
Modeling.UnknownImportFormat400Unknown import format. Use dbt, lookml or cube.
Modeling.WorkingCopyNotFound404You have no working copy on this branch.
Modeling.WorkingCopyOutdated409The branch moved since you started editing and your changes conflict with it (…). Rebase your working copy.
Modeling.WorkingCopyStale412Your working copy was saved elsewhere (another tab?) since you loaded it. Reload it and try again.

Modules ​

CodeHTTPMessage
Modules.NotLicensed404The module is not licensed for this tenant.

Operations ​

CodeHTTPMessage
Operations.ConfirmationMismatch400Type the tenant's slug exactly to confirm offboarding.
Operations.DeletionAlreadyScheduled409This organization's deletion is already scheduled.
Operations.DeletionNotCancellable422The deletion can no longer be cancelled: it was cancelled already or its date has passed.
Operations.DeletionNotDue422The deletion's grace period has not ended.
Operations.DeletionNotScheduled404No deletion is scheduled for this organization.
Operations.ImmediateReasonRequired400Deleting without the grace period needs a reason of …–… characters (the legal or abuse case).
Operations.InvalidCursor400The page cursor is not valid.
Operations.InvalidDateRange400The start of the range must be before its end.
Operations.OffboardingIncomplete500Rows of the tenant remain after the purge; see the operator log.
Operations.OffboardingPayloadInvalid400The offboarding job has no tenant.
Operations.OperatorRequired403Only platform operators can do this.
Operations.PlatformMemberAsCustomerOwner422A platform member can't be the first Owner of a customer tenant. Invite the customer's own Owner, or mark the tenant internal.
Operations.PlatformOwnerRequired403Only the platform owner can do this.
Operations.TenantNotFound404The tenant does not exist.

Persistence ​

CodeHTTPMessage
Persistence.Concurrency412The resource was changed by someone else. Reload and try again.
Persistence.UniqueViolation409Something with the same unique value already exists.

Platform ​

CodeHTTPMessage
Platform.AlreadyMember409This person is already a platform member.
Platform.AmrInvalid400A required sign-in method is 1–20 lower-case letters, digits, '-' or '_' (e.g. hwk, otp, mfa).
Platform.AmrNotInUse422Sign in with this method before requiring it for yourself, or you would lose platform access.
Platform.ConfirmationMismatch400Type the new owner's email address exactly to confirm.
Platform.EmailInvalid400Enter a valid email address.
Platform.EmailUnknown422This operator's email address is not known yet: they need to sign in once first.
Platform.MemberNotFound404The platform member does not exist.
Platform.MemberRemoved422This person is no longer a platform member.
Platform.NotOwner422Only the current owner can hand over ownership.
Platform.OwnerCannotBeRemoved422The platform owner cannot be removed: transfer ownership first.
Platform.SubjectInvalid400The identity provider subject is missing or too long.
Platform.TransferTargetInvalid422Ownership can only go to another active operator.

Quality ​

CodeHTTPMessage
Quality.IncidentNotFound404The incident was not found.
Quality.IncidentNotOpen409Only an open incident can be acknowledged.
Quality.IncidentResolved409The incident is already resolved.
Quality.InvalidAsset400The asset reference is not valid.
Quality.MetricNotFound404The metric was not found on the model's main branch.
Quality.NoImportFiles400Upload at least one dbt schema file, Great Expectations suite or a zip of them.
Quality.NothingScanned409The source has not been scanned yet: scan it first.
Quality.RegexUnsupported422This source has no regular expressions: give the rule a LIKE pattern.
Quality.RuleNotActive409Only an active rule can be paused.
Quality.RuleNotFound404The quality rule was not found.
Quality.RuleNotPaused409Only a paused rule can be resumed.
Quality.RuleNotProposed409Only a suggested (proposed) rule can be accepted or rejected.
Quality.RuleRejected409A rejected rule cannot be changed or run.
Quality.RunNotFound404The quality run was not found.
Quality.SourceNotFound404The data source was not found.
Quality.SourceNotScanned422The source has not been scanned yet: imported checks are mapped onto its scanned tables.
Quality.UnknownColumns400The table or a column does not exist in the latest scan of the source.
Quality.UnknownImportFormat400Unknown import format. Use dbt or great_expectations.

Query ​

CodeHTTPMessage
Query.AmbiguousJoinPath422"…" can be reached from … in more than one way (…). Address it through a role name.
Query.DimensionNotAllowed422"…" is not an allowed dimension of …; it can be sliced by ….
Query.DimensionNotReachable422"…" cannot be reached from … through many-to-one joins; slicing … by it would repeat (fan out) its rows.
Query.DuplicateField422"…" is requested more than once.
Query.ExecutionFailed422The source rejected the query (…).
Query.InvalidFilter422Filter on "…": …
Query.InvalidGrain422"…": …
Query.InvalidLimit400The limit must be between 1 and ….
Query.MultipleSources422The query reads entities from more than one source; federated queries are not supported yet.
Query.NoMetrics400A query needs at least one metric.
Query.NoRelease404The model has no release to serve yet. Publish a release first.
Query.SourceNotFound422The source of the model's entities was not found.
Query.Timeout422The query ran longer than the time limit and was cancelled on the source.
Query.TooLarge400A query can name at most … metrics, dimensions, filters, segments and orderings.
Query.UnknownOperator400Unknown filter operator '…'.
Query.UnsupportedDialect422Compiling for … sources is not supported yet.
Query.UnsupportedMetric422Metric …: …
Query.ViewAsNotMember404The user to view as is not a member of this workspace.
Query.ViewAsUnknownRole400View as Owner, Admin, Steward, Modeler, Analyst or Viewer.

Serving ​

CodeHTTPMessage
Serving.ApiKeyNotAllowed403This API key may not query this endpoint.
Serving.ConversationFull422This conversation is full. Start a new conversation to keep asking.
Serving.ConversationNotFound404The conversation was not found.
Serving.EndpointDisabled403The serving endpoint is disabled.
Serving.EndpointNotFound404The serving endpoint was not found.
Serving.InvalidCacheTtl400The cache TTL is 0 (no caching) to … seconds.
Serving.InvalidExposure400Exposed metrics and dimensions are at most 500 names each, 1–200 characters.
Serving.InvalidName400An endpoint name is 1–120 characters.
Serving.InvalidQuestion400A question is 1–2000 characters.
Serving.InvalidRateLimit400The rate limit is …–… requests per minute.
Serving.InvalidSlug400An endpoint slug is 2–63 characters: lower-case letters, digits and hyphens, starting with a letter or digit.
Serving.McpScopeRequired403This API key needs the mcp:use scope to use the MCP server.
Serving.ModelNotFound404The model was not found in this workspace.
Serving.NoProposal422This answer does not propose a metric.
Serving.NoReleasedModel422No model of this workspace has a release yet. Publish a release to ask questions about it.
Serving.ProposalAlreadyDrafted409This proposal is already in a change request.
Serving.PruneFailed500Pruning the query log failed for at least one tenant.
Serving.SlugTaken409Another endpoint already uses this slug.
Serving.SqlInterfaceDisabled403The SQL interface is not enabled for this tenant. An Owner can turn it on in Settings › Serving.
Serving.SqlNotPermitted403This endpoint does not expose compiled SQL to you (ask a modeler to enable "Expose SQL").
Serving.SqlScopeRequired403This API key needs the serving:query scope to use the SQL interface.
Serving.TurnNotFound404The answer was not found in this conversation.
Serving.UnknownResource404There is no such resource.

Sources ​

CodeHTTPMessage
Sources.AgentNotAllowed400Only sources connected through a private agent name an agent.
Sources.AgentPoolUnavailable422The chosen agent pool has no enrolled agent in this workspace.
Sources.AgentRequired400Choose the private agent this source connects through.
Sources.AgentSecretNameInvalid400Enter the name of the secret on the agent: letters, digits, '.', '_' or '-' (up to 100 characters).
Sources.AgentTargetAmbiguous400Choose either one private agent or an agent pool, not both.
Sources.AgentUnavailable422The chosen private agent does not exist in this workspace or was revoked.
Sources.BlockedHost422That address is on a private or internal network. Use a public address, or connect through a private agent.
Sources.Deleted422The data source has been deleted.
Sources.HostNotAllowed422… sources connect only to …. Enter the provider host, or ask an administrator to allow this one.
Sources.HostRequired400Enter the host name.
Sources.KindUnsupported422This kind of source is not available yet.
Sources.NameInvalid400The name must be 1–80 characters.
Sources.NameTaken409A data source with this name already exists in the workspace.
Sources.NotFound404The data source was not found.
Sources.ProfilingInvalid400The profiling policy is out of range.
Sources.SampleUnavailable422Sample data isn't available here. Connect your own database instead.
Sources.SecretHeldByAgent400This source connects through a private agent: its secret stays on the agent. Do not send it to Keel.
Sources.SecretRequired400Enter the password or key.

Status ​

CodeHTTPMessage
Status.ComponentsInvalid400Pick at least one affected component from the status page's list.
Status.EmailInvalid400Enter a valid email address.
Status.IncidentNotFound404The incident does not exist.
Status.IncidentResolved422The incident is resolved; open a new one.
Status.LinkInvalid400This link is invalid or has expired.
Status.MessageInvalid400Write an update of 3–… characters.
Status.NoticeNotReady500The incident update is not visible yet.
Status.NoticePayloadInvalid400The status notice job has no incident.
Status.TitleInvalid400Give the incident a title of 3–… characters.

Support ​

CodeHTTPMessage
Support.AuditUnavailable500The customer's audit log could not record this support session's activity, so nothing was done. Try again shortly.
Support.DurationInvalid400Support access lasts between 1 and … hours.
Support.GrantNotActive422There is no active support access to revoke.
Support.NoConsent403The tenant's Owner has not granted support access, or it has expired or been revoked.
Support.NotConfigured422Contact support is not set up for this deployment. Ask your administrator for the support address.
Support.ReadOnly403A support session is read-only: changes are refused.
Support.ReasonInvalid400Give a reason of …–… characters.
Support.SessionEnded422The support session has already ended.
Support.SessionInvalid403The support session is not active: it ended, expired, or the customer withdrew consent.
Support.SessionNotFound404The support session does not exist.

Tenancy ​

CodeHTTPMessage
Tenancy.Missing401The request has no tenant context.

Tool ​

CodeHTTPMessage
Tool.Unknown400There is no tool named '…'. Tools: ….

Anchor Keel is a working product name: one platform, a shared core and licensed modules (Keel Semantic, Keel Migrate). Documentation built from the repository — facts are derived from code, ADRs and the decisions log.