Skip to main content
Every error response from the v1 API follows RFC 7807 application/problem+json. Branch on the code field — it’s stable. The title and detail are for humans and may be reworded over time.

Shape

Always log the instance (request id) — when you open a support ticket, that’s the first thing we’ll ask for.

Code catalog

insufficient_credits

The most common failure for active projects. Returned whenever a write or generation costs more credits than the project has on hand. The body includes cost (credits the operation needs) and balance (credits the project had on hand) so clients can render an exact top-up prompt:
Every mutating write returns this shape on a broke project — including the 1-credit operations (content_update, page_update, image_register) as well as the larger generations (image, blog, video, website). Watch the credits_remaining field on GET /v1/projects/me/usage (or react to a 402 in your client) to alert your team or auto-top-up before mutating writes start failing.

validation_failed

Field-level errors are returned as an errors map; arrays of strings keyed by the offending field. Mirror the keys back to the user.

rate_limited

The response carries Retry-After (seconds) and the standard rate-limit headers. See rate-limits for the full backoff strategy.

slot_unavailable

A booking-specific 409: the slot was taken between the time you ran an availability check and the time you posted the booking. Refresh availability and let the user pick again. Don’t auto-retry.

Retry strategy

For retryable error classes, use exponential backoff with full jitter. Cap retries at 5 attempts; cap any single delay at 30 seconds.
A few rules of thumb:
  • Never retry 400, 401, 403, 404, 409 (except slot_unavailable, which means “refresh and let the user choose”), or 422. They are deterministic.
  • Always honour Retry-After if present; the platform sets it precisely.
  • Long-running jobs are submitted via 202 Accepted and tracked via /jobs/{id}. The submit call is idempotent if you pass an Idempotency-Key; the job itself is the right place to handle failures, not the submit endpoint.

Idempotency

POST and other mutating endpoints accept an Idempotency-Key header (any unique string up to 255 chars). Retries with the same key within 24 hours return the original response without re-executing the side effect.
If you reuse a key with different parameters (different body, different path), the request fails with 409 idempotency_conflict. Use one key per logical operation; UUIDs are fine.

When to ask for help

Open a ticket with info@neuraldraft.io or the dashboard support widget and include:
  1. The instance (request id) — also X-Request-Id on the response.
  2. The exact request URL and method.
  3. The response status and code.
  4. The approximate timestamp (UTC).
We’ll trace the request end-to-end and respond within one business day on the free tier, four hours on Build, and one hour on Scale.