Errors
Every failed call to the ReputeCast REST API answers with an RFC 9457 problem document: the API errors below share
one JSON shape, served as application/problem+json, with a stable code your program can branch on. The format is
defined in RFC 9457 (Checked October 2026).
Problem fields
Section titled “Problem fields”| Field | Type | Meaning |
|---|---|---|
status |
integer | The HTTP status code, the same as the response’s. |
title |
string | The HTTP status text, such as Forbidden. |
detail |
string | A sentence a person can act on. It can change between releases and can be in Vietnamese, so show it, don’t parse it. |
code |
string | The stable machine-readable code, such as permission_denied. See error codes. |
permission |
string | The missing permission key, on permission_denied and on escalation_denied when one permission is missing. |
helpers |
string[] | Up to two members who hold the missing permission, so a person knows whom to ask. |
errors |
object[] | For invalid requests: one entry per problem, with message, location (such as body.email or query.pageSize) and value. |
meta |
object | Extra details for some codes, for example lockedUntil and failures on locked, attemptsLeft on sign-in errors, retryAfter on store rate limits, rules on approval_required. |
type and instance belong to the RFC 9457 model but ReputeCast leaves them out. Without type, the problem type
is about:blank, which means the HTTP status says it all. A few errors the framework produces itself, such as a
server error, carry no code: use status for those.
Unknown paths under /api/ answer 404 with the code not_found and the detail “No such API endpoint.”
Example bodies
Section titled “Example bodies”Missing permission
Section titled “Missing permission”A key or member without the permission an operation needs gets 403. The permission and up to two members who
hold it are in the body:
{ "title": "Forbidden", "status": 403, "detail": "Sending needs the campaigns:send permission. Ask Marcus Chen or Linh Nguyen.", "code": "permission_denied", "permission": "campaigns:send", "helpers": ["Marcus Chen", "Linh Nguyen"]}Create a key that holds the permission, or ask one of the helpers. A key never has more permissions than the member who created it (see authentication and API keys).
Invalid request
Section titled “Invalid request”A parameter or body field that breaks the schema answers 422 with one entry per problem in errors. Malformed
requests, such as JSON that doesn’t parse, answer 400 with the same code.
{ "title": "Unprocessable Entity", "status": 422, "detail": "validation failed", "errors": [{ "message": "expected number <= 100", "location": "query.pageSize", "value": 500 }], "code": "validation_failed"}Checks that ReputeCast makes itself put the sentence in detail and the field in errors, for example
"detail": "Use a work email." with "location": "body.email".
Rate limit reached
Section titled “Rate limit reached”Over the per-key request rate, the API answers 429 with a Retry-After header:
{ "code": "rate_limited", "detail": "Rate limit reached. Requests resume within a minute; batch endpoints accept up to 1,000 items per call.", "status": 429, "title": "Too Many Requests"}The “1,000 items” in this message holds for adding suppressions; the transactional batch operation takes up to 100
messages. Wait for the number of seconds in Retry-After, then send again. Rate limits
lists every limit.
Language of detail
Section titled “Language of detail”The sentences ReputeCast writes in detail (such as missing permissions, sign-in problems, things not found and its
own validation checks) are in the request’s language when ReputeCast has it (en or vi): the language the
Accept-Language header asks for, else the signed-in member’s own app language, else English. API keys get English
unless you send the header. What the framework writes stays English, such as validation failed and errors
messages like expected number <= 100. With Accept-Language: vi, a missing campaign’s detail reads
Không tìm thấy chiến dịch., and the missing-permission detail reads, for example:
{ "title": "Forbidden", "status": 403, "detail": "Để quản lý khóa API, bạn cần quyền apikeys:manage. Hãy hỏi Marcus Chen hoặc Linh Nguyen.", "code": "permission_denied", "permission": "apikeys:manage", "helpers": ["Marcus Chen", "Linh Nguyen"]}code, permission and the other fields never change with the language.
Handle errors
Section titled “Handle errors”- Branch on
statusandcode. Treatdetailas text for a person. 401: the key is missing, unknown, revoked or expired. Fix the key; retrying doesn’t help.403: a permission is missing (permission_denied), the operation needs a signed-in person (humans_only), or an integration key called something its integration doesn’t use (integration_operation_denied).404,409,410,422: fix the request.409codes such asversion_conflictandidempotency_key_reusedsay what changed.429: wait forRetry-After. For transactional sends, retry with the sameIdempotency-Keyso a message is sent once (see send transactional email with the API).502and503: an outside service or a part of the server didn’t answer. Retry with a growing delay.
Error codes
Section titled “Error codes”Codes are grouped by area. A code can answer with a different HTTP status in some operations; the table gives the usual one.
Authentication
Section titled “Authentication”| Code | HTTP status | Meaning |
|---|---|---|
unauthenticated | 401 | No valid session or API key: you aren't signed in, or the key is unknown, revoked or expired (an expired key's detail names the date). 401 answers carry WWW-Authenticate: Bearer realm="reputecast". |
session_expired | 401 | The session timed out or ended. Sign in again; unsaved work in the tab is kept. |
Permissions
Section titled “Permissions”| Code | HTTP status | Meaning |
|---|---|---|
permission_denied | 403 | The caller lacks a permission. permission names the missing key and helpers lists up to two members who hold it. Also returned for a key used in another workspace and for operations only integration keys may call. |
escalation_denied | 403 | You can't grant a permission you don't hold, for example on a role, an API key or an agent. permission names the key when only one is missing. |
humans_only | 403 | Only a signed-in person can take this action, not an API key or an MCP agent. |
forbidden | 403 | Filtering contacts by paid status needs earn:view. |
Requests
Section titled “Requests”| Code | HTTP status | Meaning |
|---|---|---|
workspace_not_found | 404 | The workspace in the path doesn't exist or the caller isn't a member of it. |
not_found | 404 | The resource in the path doesn't exist in this workspace. The detail names what is missing, such as "Campaign not found." |
conflict | 409 | The request conflicts with the resource's current state. The detail says what to change. |
validation_failed | 422 | The request body or parameters are invalid. errors[] lists each problem with its location, such as body.email. Malformed requests answer 400 with the same code. |
rate_limited | 429 | Too many requests: over the rate limit of the IP or the API key, a key's own transactional or conversions rate, or a reminder sent again within the hour. Wait for the Retry-After header. |
idempotency_key_reused | 409 | The same Idempotency-Key came with a different request: within 24 hours for transactional sends, or for another conversion. Use a new key for a new request. |
slug_taken | 409 | The address (slug) is used by another post, tag, page or product, now or before. Pick another address. |
version_conflict | 409 | Someone saved a newer version since you opened it (a campaign, text, email, language version, page or transactional draft). Reload to see their changes, then save again. |
Service
Section titled “Service”| Code | HTTP status | Meaning |
|---|---|---|
provider_unavailable | 502 | A sending provider or another outside service didn't accept the change or couldn't be reached. The detail has the provider's answer; nothing else was changed. Some actions answer 409 or 503 with this code. |
unavailable | 503 | A part of the server can't answer right now, for example the sign-in policy check. Try again in a moment. A feature missing from this build answers 501. |
Sign-in and account
Section titled “Sign-in and account”| Code | HTTP status | Meaning |
|---|---|---|
password_change_required | 403 | The account still has its temporary password. Replace it to continue. |
two_factor_setup_required | 403 | The instance requires two-factor authentication. Add a passkey or an authenticator app to continue. |
locked | 429 | Too many failed sign-ins: the account is locked until the time in the detail. meta carries lockedUntil and failures. |
invalid_credentials | 401 | The email or password is wrong (the detail says how many attempts are left). Connecting a sending provider answers 422 with this code when the provider rejects the credentials. |
account_deactivated | 403 | The account is deactivated. An instance admin can reactivate it; nothing was deleted. |
challenge_expired | 401 | The sign-in or passkey request expired, or there were too many wrong codes. Start again. Passkey requests answer 400. |
email_change_expired | 410 | The email change confirmation link expired, was already used or belongs to another account. Change the email again from Account & security. |
identity_managed | 409 | Single sign-on is enforced for the email domain, so the sign-in identity is managed by the organization and can't be unlinked. |
invalid_code | 401 | The two-factor code is wrong. meta.attemptsLeft says how many tries are left. |
invite_accepted | 410 | The invitation was already used. Sign in to continue. |
invite_expired | 410 | The invitation expired. Ask the person who invited you for a new one. |
invite_not_found | 404 | The invitation link isn't valid. Check that the whole link was copied, or ask for a new invitation. |
invite_revoked | 410 | The invitation was revoked, so the link no longer works. |
invite_sign_in | 409 | The invited email already has an account. Sign in to accept the invitation. |
invite_wrong_account | 409 | The invitation is for another email than the account you are signed in with. Sign out and continue, or ask for an invitation for this account. |
last_method | 409 | This is the account's only way to sign in. Add a passkey or a password before removing or unlinking it. |
last_second_factor | 409 | Two-factor is required for the account, and this is its last second factor. Set up an authenticator app or another passkey first. |
method_disabled | 403 | This sign-in method (password or passkey) is turned off on the instance. Use another one, such as single sign-on. |
passkey_failed | 401 | The passkey didn't work for this account. Try again, or sign in with email and password. |
passkey_rejected | 422 | The passkey couldn't be verified. Try again, or use another device or security key. |
public_url_invalid | 409 | Passkeys need the instance's public URL, with a domain name rather than an IP address. An instance admin sets it in Instance admin. |
reset_expired | 410 | The password reset link is older than 15 minutes or was already used. Request a new one; the current password keeps working. |
setup_incomplete | 409 | An earlier setup step is not done: replace the temporary password, add a passkey or authenticator app and confirm the instance basics first. |
sso_required | 403 | The email's domain signs in with single sign-on, so password and passkey sign-in are turned off for it. |
Instance admin
Section titled “Instance admin”| Code | HTTP status | Meaning |
|---|---|---|
agency_off | 403 | Agency mode is off on this instance. An instance admin turns it on in Instance admin › Instance & updates. |
last_admin | 409 | The user is the last instance admin. Make someone else an instance admin first. |
lockout_risk | 409 | The sign-in policy change would leave you no way to sign in. Add a passkey or link a sign-in that stays on, then save again. |
reauth_required | 403 | Sign in again first: with your identity provider before transferring ownership (within 10 minutes), or with two-factor before resetting someone's two-factor. |
restore_expired | 410 | The workspace was deleted more than 7 days ago and can't be restored. |
Single sign-on
Section titled “Single sign-on”| Code | HTTP status | Meaning |
|---|---|---|
sso_incomplete | 409 | The SSO connection is missing settings needed for a test sign-in or to enable it. The detail lists them. |
sso_unreachable | 502 | The identity provider couldn't be reached for a test sign-in. The detail has the error. |
| Code | HTTP status | Meaning |
|---|---|---|
last_owner | 409 | The member is the last Owner: a workspace always keeps at least one Owner, so their role can't be changed and they can't be removed or deactivated. Transfer ownership first. |
Sending providers and routing
Section titled “Sending providers and routing”| Code | HTTP status | Meaning |
|---|---|---|
bulk_terms | 409 | The provider's terms don't allow bulk or marketing mail on this route. Choose another provider, or keep it and acknowledge the terms. meta.issues lists the routes. |
no_route | 422 | The route tester found no provider for this mail: the route has no primary provider yet, or it points at a provider that is no longer connected. |
Campaigns and Send Readiness
Section titled “Campaigns and Send Readiness”| Code | HTTP status | Meaning |
|---|---|---|
accessibility_unchecked | 422 | The email's accessibility couldn't be checked because the MJML doesn't compile. Edits are saved. |
readiness_blocked | 409 | Send Readiness still blocks the send (a campaign, digest issue, text, push or WhatsApp campaign). Fix every blocking check first. |
readiness_changed | 409 | Send Readiness ran again since you looked. Review the new results and confirm again. |
readiness_incomplete | 409 | Some checks couldn't run. Retry them, or continue with provider data only. |
readiness_running | 409 | Send Readiness is already running. Try again when it finishes. |
readiness_stale | 409 | The campaign changed since the checks ran. Run them again before sending. |
readiness_unavailable | 503 | Send Readiness isn't available in this server process. Try again on a process that runs it. |
sending_unavailable | 503 | The sending engine isn't running in this installation, so nothing was scheduled. The checks, the schedule and the approval are kept. |
Approvals
Section titled “Approvals”| Code | HTTP status | Meaning |
|---|---|---|
approval_invalidated | 409 | The approval no longer covers the campaign because something changed since it was approved. Ask for approval again. |
approval_not_required | 409 | No approval rule matches this send, so you can schedule it yourself. |
approval_required | 409 | The send or publish needs an approval first. The detail names the rule; ask for approval, then try again. Also returned when publishing a post, a landing page or a transactional template that an approval rule covers. |
no_approvers | 409 | The send needs more approvals from other people than the workspace has approvers. An Owner can give campaigns:approve to another role. |
no_client_approver | 409 | The send needs client sign-off, and nobody in the client workspace holds the Client approver role yet. Invite the client's approver in Settings › Team. |
restore_incomplete | 409 | The campaign still differs from the approved version. Ask for approval again. |
Audience
Section titled “Audience”| Code | HTTP status | Meaning |
|---|---|---|
no_system_provider | 409 | No sending provider is connected to the System stream, so opt-in confirmation emails can't go out yet. Connect one in Sending providers. |
Imports
Section titled “Imports”| Code | HTTP status | Meaning |
|---|---|---|
file_columns | 422 | Some rows of the file don't match its columns. The detail lists them; fix the file or skip those rows. |
file_unreadable | 422 | The uploaded CSV or XLSX file can't be read. The detail says why. |
source_auth_failed | 422 | The platform you import from (contacts or transactional templates) rejected the API key or credentials. meta.sourceStatus has its HTTP status. |
source_bad_response | 502 | The platform you import from answered with something ReputeCast can't read. The detail has what it answered. |
source_not_found | 422 | The transactional template platform has no such template or version, or the account has nothing to import. |
source_rate_limited | 429 | The platform you import from is limiting requests. The import slows down; try again later. meta.sourceStatus has its HTTP status. |
source_unavailable | 502 | The platform you import from didn't answer. Try again in a few minutes. |
Segments
Section titled “Segments”| Code | HTTP status | Meaning |
|---|---|---|
count_timeout | 504 | Counting the segment took longer than 10 seconds. The segment still works at send time. |
sql_disabled | 409 | SQL segments are turned off on this database. Create the reputecast_segments role and grant it to the app user, then run reputecast migrate up. |
sql_error | 422 | The SQL segment's query is invalid. The detail has the database message and, when known, the position of the error. |
Address verification
Section titled “Address verification”| Code | HTTP status | Meaning |
|---|---|---|
no_verification_service | 409 | No address verification service is connected. Connect one in Settings › Integrations. |
nothing_to_check | 409 | There is nothing to verify: every selected address was checked in the last 90 days, or the selection is empty. |
Automations
Section titled “Automations”| Code | HTTP status | Meaning |
|---|---|---|
accessibility_blocked | 409 | The workspace accessibility policy is set to Block and an email in the flow has serious accessibility issues. The detail names the email; fix it, then publish. |
Transactional API
Section titled “Transactional API”| Code | HTTP status | Meaning |
|---|---|---|
template_not_found | 422 | The template ID doesn't exist in this workspace. Check the ID on Templates. |
template_not_published | 422 | The template has a draft but no live version. Publish it first. |
missing_variables | 422 | A required variable isn't in data. The answer lists which ones. |
invalid_recipient | 422 | The address isn't a valid email address. Validate it in your app. |
recipient_suppressed | 422 | The address bounced, complained or is a spam trap. The answer gives the reason and date. |
sender_not_verified | 422 | The from address isn't a verified Transactional sender. Verify it in Settings › Senders. |
attachments_too_large | 422 | The message, attachments included, is over the route's size limit: the smallest limit of the route's sending providers. |
no_healthy_route | 503 | Every sending provider in the route is down. Retry with the same idempotency key. |
template_not_allowed | 403 | The key can't send this template or category. Use a key that can, or widen the key's scope. |
agents_never_send | 403 | MCP agents never send transactional mail. Send from your app with a send-only key. |
content_removed | 410 | The message's rendered content is no longer kept (content retention), or it was never rendered. The summary and events stay until metadata retention ends. |
resend_unavailable | 409 | The message can't be sent again from ReputeCast: sensitive variables or attachments weren't stored, or it arrived by SMTP. Send it again from your app. |
Transactional templates
Section titled “Transactional templates”| Code | HTTP status | Meaning |
|---|---|---|
breaking_change | 409 | The draft changes variables in a way that would break calls made in the last 7 days. Make the variable optional with a default, update your app first, or publish anyway. meta.breaking lists the changes. |
template_does_not_render | 422 | The template doesn't render with the given data, or the draft can't be published yet. The detail says what fails. Publishing and asking for approval answer 409. |
Integration keys
Section titled “Integration keys”| Code | HTTP status | Meaning |
|---|---|---|
key_revoked | 401 | The integration's key was revoked. Reconnect the integration in Settings › Integrations to get a new key. |
key_expired | 401 | The integration's key expired. Reconnect the integration in Settings › Integrations to get a new key. |
owner_deactivated | 403 | The member who owns the integration's key left the workspace, so the key lost its permissions. Someone with integrations:manage can take it over in Settings › Integrations; the key stays the same. |
integration_operation_denied | 403 | The key belongs to an integration and works only for that integration's turned-on triggers and actions. Change what it can do in Settings › Integrations. |
instance_unreachable | 409 | The integration can't reach the instance's public URL. Give the instance a public address, or run the tool on your own network. |
managed_by_integration | 409 | The API key or webhook endpoint belongs to an integration (Zapier, Make, n8n, WordPress). Change it in Settings › Integrations or in the workflow. |
Integration actions
Section titled “Integration actions”| Code | HTTP status | Meaning |
|---|---|---|
unsubscribed | 409 | The contact left the list, and ReputeCast doesn't add people back to a list they left. |
suppressed | 409 | The address is on the suppression list, and ReputeCast doesn't add suppressed addresses. The detail gives the date and reason. |
private_address | 422 | The webhook address points to a private network. It stays blocked until an instance admin allows private addresses (webhooks.allow_private_networks). |
Website
Section titled “Website”| Code | HTTP status | Meaning |
|---|---|---|
certificate_failing | 409 | The custom domain's certificate is failing, so the website can't go live there. Fix it in Branding & domain first. |
featured_full | 409 | The home page features up to 3 posts. Unfeature one in Home & navigation first. |
header_full | 409 | The website header holds up to 6 links. Remove one first. |
Landing pages
Section titled “Landing pages”| Code | HTTP status | Meaning |
|---|---|---|
nothing_to_publish | 409 | Nothing changed since the live version, so there's nothing to publish. |
reminders_exist | 409 | The reminder automation for this page already exists. |
Landing pages and products
Section titled “Landing pages and products”| Code | HTTP status | Meaning |
|---|---|---|
checks_failed | 409 | A publish check still blocks the page or product. The checks list what is missing. |
Digital products
Section titled “Digital products”| Code | HTTP status | Meaning |
|---|---|---|
file_mismatch | 422 | The file's extension doesn't match its content, so buyers would get a file their computer can't open. Upload the right file, or rename it. |
file_program | 422 | The file is a program. Programs can't be sold or offered as downloads. |
price_change | 409 | Publishing changes the price. Confirm it: existing buyers keep their access and nobody is charged again. |
stripe_key_rejected | 409 | Stripe refused the key. Replace it in Earn › Settings › Payments, then publish again. |
stripe_not_connected | 409 | Stripe is not connected. Connect it in Earn › Settings › Payments first: nothing can be bought, and Stripe coupon rewards can't be given, without it. |
stripe_permission | 409 | The Stripe key can't create products and prices. Give it those permissions in Stripe, then publish again. |
stripe_unavailable | 503 | Stripe didn't answer, so nothing was published or no checkout started and no payment was taken. Try again in a minute. |
upload_gone | 404 | The upload stopped and nothing was kept. Choose the file again. |
upload_incomplete | 409 | The upload isn't finished: only part of the file arrived. |
upload_offset | 409 | Part of the upload arrived twice. The upload continues from the offset in the detail. |
Earn and Stripe
Section titled “Earn and Stripe”| Code | HTTP status | Meaning |
|---|---|---|
already_complimentary | 409 | The contact already has complimentary access. Change it instead. |
import_not_matched | 409 | Match the import rows with Stripe first. |
import_started | 409 | The paid members import has already started. |
key_format | 422 | The value doesn't look like a Stripe key. Restricted keys start with rk_live_ or rk_test_. |
key_rejected | 422 | Stripe says the key isn't valid: it may have been rolled, deleted or copied only in part. |
missing_permissions | 422 | The Stripe key is missing permissions ReputeCast needs. Edit the key in Stripe, then try again. |
mode_connected | 409 | A live or test key is already connected. Replace it from Earn › Settings › Payments. |
no_email_column | 422 | No email column was found in the paid members file. Pick the column that holds addresses. |
not_cancelable | 409 | The subscription can't be canceled here: it already ended, or it isn't billed through Stripe. |
not_connected | 409 | Stripe isn't connected, so paid members can't be imported or subscriptions canceled from ReputeCast. |
other_account | 422 | The key belongs to another Stripe account than the one connected. Use a key from that account, or disconnect first. |
provider_not_available | 422 | This payment provider isn't available yet. Stripe is the supported provider. |
public_url_unreachable | 409 | Stripe can't reach the instance's public URL to register the webhook. Set REPUTECAST_PUBLIC_URL to an address on the internet, or add the webhook by hand. |
secret_key | 422 | Stripe secret keys are refused because they give full access to the Stripe account. Create a restricted key instead; nothing was sent to Stripe or stored. |
tier_has_members | 409 | Members have this tier, so it can't be deleted. Archive it instead: they keep access and nobody new can buy it. |
unmapped_price | 422 | A Stripe price in the import isn't mapped to a tier yet. Map it, or keep it as a legacy price. |
unsettled_conflict | 422 | A row matches more than one Stripe customer. Pick the customer the person pays with, or skip the row. |
webhook_first | 409 | Set up the Stripe webhook first. Without it, paid status can't stay in step with Stripe. |
Conversions
Section titled “Conversions”| Code | HTTP status | Meaning |
|---|---|---|
invalid_currency | 422 | Send an ISO 4217 currency code, such as USD, EUR or GBP. |
invalid_value | 422 | Send the value as a decimal string, such as "29.00", with no more decimals than its currency allows. |
missing_identity | 422 | The conversion names nobody: send the reader's email, the click token (rc_click), or both. |
occurred_at_out_of_range | 422 | occurred_at must be within the last 30 days and not in the future. |
Referrals
Section titled “Referrals”| Code | HTTP status | Meaning |
|---|---|---|
checks_failing | 409 | Fix the failing checks to turn the referral program on. |
last_milestone | 409 | The program needs at least one milestone while it is on. Add another one first, or turn the program off. |
link_active | 409 | The referrer's link is already active. |
link_paused | 409 | The referrer's link is already paused. |
list_fixed | 409 | A program's list can't change once the program has been on. |
not_codes | 409 | The milestone's reward isn't a code from a list. |
not_held | 409 | Some of the referrals aren't held for review any more. Reload the queue. |
program_exists | 409 | The list already has a referral program. Each list has one. |
program_on | 409 | Turn the referral program off before deleting it. |
stale_settings | 409 | Someone saved the program settings since you opened them. Reload to see their changes, then save yours. |
undo_late | 409 | Undo is no longer possible: the decision was made more than 10 seconds ago, or a reward has gone out. |
Recommendations and partners
Section titled “Recommendations and partners”| Code | HTTP status | Meaning |
|---|---|---|
code_expired | 422 | The partner code expired. Partner codes work for 7 days; ask the newsletter for a new one. |
code_revoked | 422 | The newsletter revoked the partner code. Ask them for a new one. |
code_unknown | 422 | The partner instance doesn't know the code. Check that all of it was copied. |
code_used | 422 | The partner code was already used. Each code connects once; ask for a new one. |
link_ended | 409 | The partnership has ended. Reconnecting needs a new partner code. |
link_invalid | 409 | The partner link is no longer valid, so it can't be paused, resumed or given a new secret. Reconnecting needs a new partner code. |
no_public_url | 409 | Partner links need the instance's public URL. An instance admin sets it. |
not_a_code | 422 | The value isn't a partner code (it may be a link to a subscribe page). Partner codes look like https://reputecast.example/p/XXXX-XXXX-XXXX. |
not_recommending_you | 409 | Only partners that recommend you have a daily limit you set. |
partner_link | 409 | A partner recommendation is paused with its partner link, which needs grow:connect. |
partner_private | 422 | The partner address is private. Partner instances must answer at a public HTTPS address. |
partner_unreachable | 422 | The partner instance didn't answer over HTTPS. Check the address, or try again in a few minutes. Answers 502 for an existing link. |
partner_unsupported | 422 | The partner instance runs a ReputeCast version without partner links. Ask them to update, or recommend their subscribe page as a link. |
paused_by_partner | 409 | The partner paused this link. Only they can resume it. |
Web push
Section titled “Web push”| Code | HTTP status | Meaning |
|---|---|---|
not_a_push_site | 409 | The prompt's site isn't a push site yet. Add it in Push setup; readers can't subscribe until it is. |
push_off | 409 | Turn push on in Sending providers › Push first: prompts subscribe readers with the workspace's keys. |
Web push and WhatsApp
Section titled “Web push and WhatsApp”| Code | HTTP status | Meaning |
|---|---|---|
stale_version | 409 | The campaign changed since you opened or reviewed it. Reload or review it again. |
| Code | HTTP status | Meaning |
|---|---|---|
credentials_rejected | 422 | The SMS provider rejected the credentials. Check them and try again. |
no_sender | 409 | No sender can text the country of this number yet. Add a route for it in Routing & rules. |
opted_out_by_text | 409 | The number opted out by text. Only the person can come back, by texting START. |
provider_unreachable | 502 | The SMS provider didn't answer. Try again in a minute. |
review_changed | 409 | The text, audience, routes or costs changed since you reviewed them. Look again and confirm. |
| Code | HTTP status | Meaning |
|---|---|---|
meta_error | 502 | Meta answered with an error. The detail has its message. |
meta_unavailable | 502 | Meta's Graph API didn't answer. Try again in a moment. |
token_rejected | 502 | Meta rejected the access token. Replace it to sync templates. |
window_closed | 409 | The 24-hour customer service window is closed, so a free-form reply can't be sent. Send an approved template instead. |
AI assistant
Section titled “AI assistant”| Code | HTTP status | Meaning |
|---|---|---|
ai_cap_reached | 409 | This month's AI token cap or budget is used up. AI features return on the date in the detail, or someone with integrations:manage can raise the cap. |
ai_demo_model | 409 | The demo's sample model only answers in development and only translates into Spanish and German. Connect your own model. |
ai_feature_off | 409 | This AI feature is turned off for the workspace. Someone with integrations:manage can turn it on in Settings › Integrations · AI assistant. |
ai_key_rejected | 409 | The model provider rejected the workspace's key, so nothing was sent. Someone with integrations:manage can replace it. A key rejected during the call answers 502. |
ai_no_image_input | 409 | Alt text needs a model that reads images, and the connected model does not. |
ai_not_configured | 409 | No AI model is connected to the workspace. Connect one in Settings › Integrations · AI assistant. |
ai_not_sent | 409 | The campaign hasn't sent anything yet, so there are no results to summarize. |
ai_one_model | 409 | A workspace has one AI model. Disconnect the current provider first to switch. |
ai_private_address | 422 | The model's address is private and the instance doesn't allow private addresses. An instance admin can allow them. Answers 502 when found during a call. |
ai_provider_error | 502 | The model provider's answer couldn't be read or it failed, so nothing was changed. A timeout answers 504. |
ai_rate_limited | 503 | The model provider is limiting requests from the workspace. Try again after the time in the detail; nothing was changed. |
ai_source_changed | 409 | The email changed since the translation was made. Translate it again. |
ai_suggestion_gone | 409 | The suggestion isn't yours or is older than a day. Ask for a new one. |
ai_test_failed | 422 | The test call to the model failed, so the settings were not saved. meta.test has the result. |
HostRepute and deliverability
Section titled “HostRepute and deliverability”| Code | HTTP status | Meaning |
|---|---|---|
hostrepute_error | 502 | HostRepute answered with an error. Nothing was saved. |
hostrepute_reconnect | 409 | HostRepute rejected the token. Reconnect HostRepute, then try again. |
hostrepute_required | 409 | Delisting requests go through HostRepute, which isn't connected. Request delisting on the blocklist's own page instead (meta.delistUrl). |
hostrepute_scope | 409 | The HostRepute connection lacks the assets:write scope, so assets can't be added to monitoring. Reconnect HostRepute and approve it. |
hostrepute_unavailable | 503 | HostRepute couldn't be reached. Nothing was saved. |
monitor_limit_reached | 409 | The HostRepute team's plan monitors no more assets. This is a HostRepute limit, not a ReputeCast one. |
Placement tests
Section titled “Placement tests”| Code | HTTP status | Meaning |
|---|---|---|
oauth_not_set_up | 409 | The provider's sign-in app isn't set up for seed mailboxes. An instance admin adds its client ID and secret in Instance admin › Authentication. |
placement_copies_gone | 409 | The copies were already deleted from the seed mailboxes. |
placement_not_ready | 409 | The placement test can't start yet. The detail and meta.problems say what is missing. |
placement_not_waiting | 409 | The test isn't waiting for copies any more. |
Recurring digests
Section titled “Recurring digests”| Code | HTTP status | Meaning |
|---|---|---|
digest_feed_unread | 409 | The digest's feed hasn't been read yet. Read it once before turning the digest on. |
digest_needs_audience | 409 | Pick an audience before turning the digest on. |
tests_unavailable | 503 | Test sends aren't available in this server process. |
Polls and surveys
Section titled “Polls and surveys”| Code | HTTP status | Meaning |
|---|---|---|
survey_incomplete | 422 | Every survey question must be complete before publishing. The detail lists what is missing. |
Stores
Section titled “Stores”| Code | HTTP status | Meaning |
|---|---|---|
store_not_connected | 409 | No WooCommerce store is connected at the address the plugin calls from. Connect it in Settings › Integrations first. |
store_rate_limited | 429 | Shopify or WooCommerce is limiting requests. The sync slows down and carries on by itself. |
store_unavailable | 503 | Shopify or WooCommerce didn't answer. Try again in a few minutes. |