beatraDocs

Beatra troubleshooting: sign-in, credits, timeouts, errors

Fix the six common Beatra problems: sign-in, credits, slow or timed-out tasks, rejected parameters, version mismatch, and missing tasks, files, or voices.

Every Beatra failure carries an error code and a retryable flag: in a REST error body, in a failed MCP tool result, and in a failed task. Find the symptom below and work through its steps in order. Each section ends with the error codes that belong to it and what to do about each one. The error envelope and the retry rules are on Errors & retries.

Sign-in fails

Agents sign in to Beatra once, in the browser: the Beatra Skill requests a device code, opens an approval page, and waits while you approve. Its sign-in helper, scripts/authorize.py in the installed Skill folder, prints Beatra is ready when the connection works.

  1. The helper printed BEATRA_AUTH_PENDING. The approval is still open. Open the approval link it printed, sign in, and choose Allow, then let the agent run the same command again. Every run continues the same approval, so you approve only once. An approval page stays open for up to an hour.
  2. The helper printed access_denied or expired_token. The approval was declined, or the page expired before Allow was chosen. Ask the agent to run python3 scripts/authorize.py again for a new approval page.
  3. Beatra worked before and now reports BEATRA_AUTH_REQUIRED. The sign-in on this computer has ended: it was unused for 15 days, or the computer was disconnected under Devices in the console. Ask the agent to run python3 scripts/authorize.py again and approve once.
  4. A tool call returns insufficient_scope. The connection lacks access a tool needs, and missing_scopes names it. Reconnect with python3 scripts/authorize.py --force and approve once. Retrying without reconnecting returns the same error.
  5. The sign-in page will not load, or a verification code never arrives. Sign-in troubleshooting covers the WeChat QR code, email and phone codes, and signing in to the wrong account.
  6. Your own app gets 401. Send Authorization: Bearer <API key> with a key from the console (Developer → API keys), on the API host that matches the key's region. See Authentication & request conventions.
codeHTTPretryabledescription
unauthorized401noMissing or malformed authentication credentials. Send Authorization: Bearer <API key>.
invalid_api_key401noAPI key is invalid, disabled, revoked, or unknown. Create or rotate keys in the console (Developer → API keys) and retry with the new key.
api_key_region_mismatch400noAPI key region prefix does not match this endpoint. Call the API host matching the key's region, or use a key issued for this region.
tenant_disabled403noTenant has been suspended or disabled. Contact support; retrying cannot succeed.
forbidden403noCaller does not have permission for this operation. Use a credential with the required permission; retrying unchanged cannot succeed.
email_send_failed502yesLogin-code email could not be delivered (transient send failure). Request a new code after a brief backoff.

Not enough credits

Paid tools check the balance before they start. When it is short, the call returns insufficient_balance (HTTP 402): the work did not start and nothing was charged.

  1. Top up in the console at console.beatra.ai/wallet. Credits take effect immediately. The wallet's "Adding credits to: …" line names the account that receives them.
  2. Retry the same request unchanged: the same arguments and the same client_request_id or Idempotency-Key. No reinstall or new sign-in is needed.
  3. In an agent, tell it you have topped up. After a refusal, the Beatra Skill answers further calls to the same tool on this computer with the same message (details.local_hold) until you say you have topped up, so a long batch stops at the first refusal. The hold also lifts by itself after 30 minutes.
  4. The top-up went through but the balance has not moved. The credits most likely went to another account. Open the top-up link from the agent again and check "Adding credits to: …", or merge the two accounts: see Accounts and merging.
  5. The balance is negative after a task. A task's measured usage can exceed its estimate. The result stays valid; new paid work waits for a top-up.

Prices per model are live in beatra.models.list and GET /v1/catalog/models; plans and top-up packs are on the pricing page. How charging and refunds work: Billing & usage.

codeHTTPretryabledescription
insufficient_balance402noInsufficient credits: this request was not started and nothing was charged. Add credits at https://console.beatra.ai/wallet?intent=buy — they take effect immediately; then retry this same request. No reinstall or re-authorization is needed.
billing_failed500yesCharge or refund attempt failed after retries. Retry with the same Idempotency-Key / client_request_id; the identity guarantees no double charge.
payment_provider_unavailable503noPayment checkout provider is not configured for this payment method. Choose another payment method in the console.
voice_activation_required422noThis voice is a free preview and can't be used for speech until it is activated. Confirm the activation price with the user, then call beatra.voices.activate.
price_confirmation_required422noThe activation quote has expired or changed. Show the new quote to the user, get their consent, then call beatra.voices.activate again with the new confirmation_token and confirm_credits.

Slow tasks and timeouts

Generation runs as an asynchronous task: queued, then running, then succeeded, failed, or canceled. A task that is still queued or running is working, and the result arrives when it reaches a final state.

  1. The task is still queued or running. Keep checking the same task with beatra.tasks.get or GET /v1/tasks/{task_id}, about every 5 seconds. Submitting the request again creates a second task that is billed separately.
  2. progress.stage is finalizing. The model has finished and Beatra is storing the files. Beatra keeps trying to fetch them for up to about 40 minutes without generating or charging again. If they still cannot be fetched, the task fails with model_output_invalid and its credits are refunded.
  3. The call timed out or the connection dropped. Retry with the same client_request_id (MCP) or Idempotency-Key (REST) and exactly the same arguments: Beatra returns the original task instead of starting a new one. If the task ID was lost, list recent tasks with beatra.tasks.list or GET /v1/tasks first.
  4. The error has retryable: true. Wait for the Retry-After interval when there is one, then retry the same request. 429 responses carry X-RateLimit-* headers; see Rate limits.
  5. Your plan's creations in progress are all in use. A new request does not start and nothing is charged. Wait for one to finish and retry the same request; see How many at a time.
  6. model_unavailable. Pick another model from beatra.models.list, or use model: "auto" so Beatra picks one that is available.
  7. Cancel returned 409. Execution has started and continues. Keep checking the same task until it reaches a final state.
codeHTTPretryabledescription
model_timeout504yesThe model request timed out. Retry with backoff.
model_request_failed502yesThe model request failed after retryable service errors. Retry with backoff; if it persists, adjust inputs or choose another model.
model_unavailable503yesThe requested model is not currently available. Retry with backoff, switch to another selectable model (beatra.models.list or GET /v1/catalog/models), or use model=auto. When present, details.reason and details.available_at give the cause and the expected recovery time.
model_rate_limited429yesModel capacity was rate-limited. Retry after a backoff.
rate_limited429yesCaller-side rate limit exceeded. Retry after the Retry-After interval; X-RateLimit-* headers report the active budget.
voice_activation_daily_limit429noThis account has activated 3 voices today, the daily limit. Nothing was charged. To activate more voices today, contact Beatra support; the limit resets at 00:00 UTC (08:00 Beijing time).
request_in_progress409yesSame idempotency identity matches an in-flight request. Retry later with the same identity; the original response will be returned.
conflict409noThe operation conflicts with the resource's current state — for task cancellation this means execution continues. Follow details.action (usually: keep polling the same task); do not resubmit the work.
upload_stalled408yesAn upload stopped sending data for too long, or ran past the upload time limit. Send the same PUT to the same upload URL again; if the upload grant has expired, request a new one with beatra.assets.upload.
model_output_invalid502yesThe model returned a result that cannot be delivered, such as missing or corrupt audio, or a generated file that could not be retrieved. The task fails and its charge is refunded; submit a new request.
internal_error500yesUnclassified server-side error. Retry with the same idempotency identity; if it persists, report the request_id.

Invalid parameters

A rejected request names the field: error.param is a JSON Pointer to it, and details.errors (validation) or details.candidate_failures[] (model options) say what each field accepts.

  1. Change the named field and send the corrected request with a new client_request_id. The inputs changed, so it is new work; reusing the old identity returns idempotency_conflict.
  2. Check the model's current limits (resolution, duration, aspect ratio, input types) in beatra.models.list or GET /v1/catalog/models, or use model: "auto" so Beatra picks a model that supports the whole request. A model you name explicitly is never replaced.
  3. Media inputs: pass an HTTPS URL Beatra can reach, or upload the file with beatra.assets.upload and pass the artifact ID it returns. See Upload source media.
  4. Content review: safety_rejected and content_filtered mean the prompt or an input needs to change. The same content is rejected again.
  5. Argument lists: every MCP tool's arguments are in the MCP tool reference, and every REST body in the API reference.
codeHTTPretryabledescription
invalid_request422noRequest body fails structural validation. param points to the first offending field; details.errors lists every failure with its loc and reason. Fix the named fields and resend.
unsupported_capability400noCapability does not exist or is disabled. GET /v1/catalog/capabilities lists the currently available capabilities.
unsupported_model400noModel does not exist or is not selectable for this capability. Discover selectable models with beatra.models.list or GET /v1/catalog/models, or use model=auto.
unsupported_option422noThe selected concrete model does not support a requested value or control. param identifies the field and details.candidate_failures[] carries a specific failure code such as unsupported_resolution, unsupported_duration, or unsupported_aspect_ratio, plus the received and supported values. Change the named field or choose a different model; with model=auto this is returned only when no candidate can satisfy the request.
no_eligible_model422noNo live model can honor the complete model=auto request. details.candidate_failures[] lists each provider-neutral rejection; change only the incompatible fields or pick a listed concrete model.
voice_model_incompatible422noThe requested voice does not resolve on the requested model. Use model=auto, a compatible model, or another voice from the voices list.
unsupported_input_modality422noThe selected model does not support an input modality in the request (such as image, audio, or file input). param points to the first offending field; remove it or choose a model that supports it.
context_length_exceeded422noThe request exceeds the selected model's context window. Shorten the input or choose a model with a larger context window.
invalid_media422noMedia input is malformed or cannot be decoded. Re-export or re-encode the file and submit it again; param names the offending field.
unsupported_media_type422noMedia input type is not supported for this capability. Convert to a supported format (see the capability page or model constraints) and resend.
media_too_large413noMedia input exceeds the allowed size. Compress or trim the input, or upload it first and pass an artifact reference.
media_fetch_failed422yesBeatra could not access an input resource. Check that the resource is reachable over HTTPS, or upload it and pass an artifact reference.
safety_rejected400noThe request did not pass content safety review. Ask the user to review the prompt and every input resource, then edit or replace content that may be unsafe before submitting a new task with a new client_request_id. Retrying the same content will not help.
content_filtered502noA safety filter blocked the output mid-generation. Rephrase the prompt or switch models; an identical retry is usually blocked again.
idempotency_conflict409noSame Idempotency-Key / client_request_id was used with a different request body. Submit changed work with a NEW identity; to retry identical work unchanged, reuse the original. Inspect the existing task before choosing.
callback_url_required422noA callback URL is required when a callback signing key is selected. Add callback_url or remove callback_signing_key_id.
callback_signing_key_not_found404noCallback signing key does not exist or is not visible to this account. List signing keys in the console and pass a current key id.
callback_signing_key_inactive422noCallback signing key is retired and cannot be selected for a new task. Select an active key, or omit the key id for unsigned delivery.
invalid_window422noTime range is invalid.
invalid_cursor400noPagination cursor is malformed.

Version mismatch

The Beatra Skill on your computer stays at the version you installed until you update it. At most once a day it checks the store or tool you installed it from, and when a newer version is there it prints one line with the command that updates it.

  1. Check by hand from the installed Skill folder with python3 scripts/mcp_client.py update --check. It reports what your store offers and installs nothing.

  2. Update through the place you installed from, then start a new agent session so the agent loads the new version:

    Installed withUpdate with
    The Beatra install messageSend the install message again
    skills CLInpx skills update <package> -g -y for a global install, or npx skills update <package> -p -y in the project folder
    GitHub CLIgh skill update <package>
    ClawHub CLIclawhub update <package> --workdir <dir> --dir <skills-dir>
    SkillHub CLIskillhub install <package> --force --dir <skills-dir>
    WorkBuddyUpdate the Skill in WorkBuddy
  3. Public social data says schema_hash does not match the current tool. The tool's arguments changed after the agent read them. Call beatra.social.tools.get again and submit with the new schema_hash and a new client_request_id.

  4. An older integration calls a path or option the API no longer serves. Compare the call with the API reference and the MCP tool reference.

codeHTTPretryabledescription
skill_package_format_invalid422noSkill package identity is malformed. Use a lowercase hyphenated slug of at most 64 characters and a valid SemVer package version.
streaming_not_yet_implemented501noLegacy compatibility code for older deployments where stream=true was recognized but not enabled.
not_found404noRequested HTTP resource or endpoint was not found. Check the path and identifier; retrying unchanged cannot succeed.

Missing tasks, files, and voices

A *_not_found code means the ID does not exist, or it belongs to another Beatra account. Use the ID returned when the task, file, or voice was created, and check that the agent or API key belongs to the account that created it (Accounts and merging).

  • Tasks: list recent ones with beatra.tasks.list or GET /v1/tasks.
  • Uploaded files: upload the file again and use the new artifact ID.
  • Voices: list the voices you can use with beatra.voices.list or GET /v1/voices. A cloned voice that waits for activation expires after 7 days.
codeHTTPretryabledescription
task_not_found404notask_id does not exist or does not belong to this account. Use the task_id returned at creation; list recent tasks with GET /v1/tasks or beatra.tasks.list.
artifact_not_found404noartifact_id does not exist or does not belong to this account. Upload the media again and use the newly returned artifact id.
result_undeliverable502noThe completed result could not be delivered because it is too large, too deeply nested, or not valid JSON. Do not resubmit the same lookup.
voice_not_found404novoice_id does not exist or does not belong to this account. List available voices with GET /v1/voices or beatra.voices.list.
voice_preview_expired422noThis preview voice has expired and can no longer be activated or used. Clone the voice again.
voice_sample_rejected422noThe voice sample was rejected. See details.reason, fix the sample, and clone again with a new client_request_id.
voice_limit_reached409noThis account already has the maximum number of cloned voices waiting for activation. Activate one, or delete one in the desktop app or with DELETE /v1/voices/{voice_id}; waiting voices also expire after 7 days.
voice_retired422noThis voice is no longer supplied. Select another voice; details may name a replacement. The selected voice is never silently replaced. This request is not charged or is refunded.
voice_unavailable422noThe cloned voice can no longer be restored from its saved sample. This is permanent; do not retry. Contact support. This request is not charged or is refunded; the original clone fee is not refunded.

Still stuck

Email support@beatra.ai, or use Feedback in the console. Include:

  • the request_id from the error (the same value as the X-Request-Id response header), and the task ID when there is one;
  • the error code and message;
  • when it happened, and whether you used the Skill, MCP, or the REST API.

Support needs none of your API keys, the files under ~/.beatra/, or verification codes; leave them out.

Last updated

On this page

Markdown