Errors & Rate Limits

Formato de errores, codigos HTTP y limites / Error format, HTTP codes, and limits

Error Format

All API errors return JSON with this structure:

json
{
  "error": "Human-readable error message",
  "errors": ["Optional array of field-level details"],
  "code": "OPTIONAL_MACHINE_READABLE_CODE"
}

The errors array is only present on 400 validation errors. It contains specific details about which fields failed validation.

The code field is optional and present on some 403 responses (plan limit reached, account inactive) and on the 429 monthly-capacity response. It's a stable, machine-readable identifier you can switch on in your integration instead of parsing the error message. Values come from ErrorCode in lib/domain/errors.ts:

El campo code es opcional y aparece en algunas respuestas 403 (limite de plan alcanzado, cuenta inactiva) y en el 429 de capacidad mensual. Es un identificador estable para tu integracion, en vez de parsear el mensaje.

CodeStatusMeaning
FORM_LIMIT_REACHED403Plan's max number of forms reached
QUESTION_LIMIT_REACHED403Plan's max questions-per-form reached
AI_GENERATION_LIMIT_REACHED429Plan's monthly AI generation quota reached
CONVERSATION_LIMIT_REACHED403Plan's monthly conversation quota reached
SUBSCRIPTION_INACTIVE403Form owner's subscription is not active
FEATURE_NOT_AVAILABLE403Feature (e.g. pipelines) not available on this plan
PIPELINE_LIMIT_REACHED403Plan's max number of pipelines reached
DEAL_LIMIT_REACHED403Plan's max number of deals reached

HTTP Status Codes

StatusMeaningWhen it happens
200OKSuccessful request
201CreatedResource created (new form, new webhook config)
400Bad RequestValidation failure, missing fields, wrong form type
401UnauthorizedNot authenticated (session expired/missing, or invalid API key)
403ForbiddenDomain not allowed, plan limit reached, account inactive
404Not FoundResource doesn't exist, form not published
500Internal Server ErrorUnexpected server error
502Bad GatewayWebhook delivery failed (test endpoint only)

Common Errors

Public endpoints

ErrorStatusCause & solution
Form not found404Form doesn't exist or is not published
Domain not allowed403Add your domain to the form's Allowed Domains
Account inactive403The form owner's subscription has expired
Classic forms do not support chat400Use /api/forms/:id/submit for CLASSIC forms
This endpoint is only for classic forms400Use /api/chat for CONVERSATIONAL forms
Missing required field: {field}400A required question was not answered
Invalid data400Request body doesn't match the expected schema

Authenticated endpoints

ErrorStatusCause & solution
Unauthorized401Session cookie missing/expired, or the API key is invalid. Log in again or check your Authorization: Bearer rvk_... header
Form with id "{id}" not found404Form doesn't exist or you don't own it
Plan limit error403Upgrade your plan to create more forms (code identifies the limit)

Plan Limits

Los limites dependen del plan del usuario / Limits depend on the user's plan.

ResourceFREEPROBUSINESS
Forms110Unlimited
Conversations / month1005002,500
WebhooksNoYesYes
Email notificationsNoYesYes

When a per-form/plan resource limit is reached the API returns 403; the monthly conversation cap returns 429 (code: CONVERSATION_LIMIT_REACHED).

Pagination

All list endpoints use consistent pagination:

Request parameters:

ParamTypeDefaultMaxDescription
pagenumber1-Page number
limitnumber10100Items per page

Response format:

json
{
  "items": [...],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 42,
    "totalPages": 5
  }
}

The actual items key varies by endpoint (forms, conversations, etc.).

Rate Limits

Rate limiting is not yet enforced. When implemented, the following limits will apply:

EndpointLimitScope
POST /api/chat20 requests / minutePer IP
POST /api/forms/:id/submit10 requests / minutePer IP
POST /api/forms/generate5 requests / minutePer user

Rate-limited requests will return 429 Too Many Requests.