Skip to content
Idioma: Español

API para desarrolladores

Formato de error y códigos de error de la API

Actualizado el 1 de noviembre de 2026 6 min de lectura

Cómo son las respuestas de error de la API de LinkHarbor, qué significan los códigos de error más importantes y cómo debe reaccionar tu código.

Todas las respuestas de error de la API tienen el mismo formato. Tu código debe basarse en el código de error del campo error, no en el texto de message: el código se mantiene estable, mientras que el texto puede cambiar y se traduce al idioma de la cuenta.

Estructura de una respuesta de error

Ejemplo: 422 validation_failed
{
  "error": "validation_failed",
  "message": "Some of the information provided is invalid. Please check and try again.",
  "details": [
    { "field": "title", "reason": "minLength", "message": "…" }
  ],
  "request_id": "6b1f0c2e-…"
}
error
Código legible por máquinas, por ejemplo not_found. En la mayoría de los errores también aparece en el encabezado X-Error-Code, pero básate en el campo del cuerpo.
message
Descripción legible para personas en el idioma de la cuenta: con una clave de API, el del propietario del espacio de trabajo; con una app conectada, el de la persona que la conectó. Sin un token válido (por ejemplo, el 401 de la comprobación del token), el idioma sigue a Accept-Language; si no, es inglés. El encabezado Content-Language indica el idioma.
details
Solo aparece cuando hay algo más que decir. Para un 422 de la validación de la entrada, una lista con field, reason y message para cada problema; para un 422 de la lógica de negocio y todos los demás errores, un objeto, por ejemplo con reason, retry_after_sec o una lista de issues. Cuando se supera un tamaño contiene field, reason y limit, y en 413 request_too_large, max_bytes y max_kb. Así que comprueba si details es una lista.
request_id
El ID de la petición. También está en el encabezado X-Request-Id. Inclúyelo cuando contactes con soporte.

Excepciones: la respuesta 429 rate_limited tiene el campo retry_after_sec en lugar de details; con 429 y con 403 insufficient_scope, falta request_id en el cuerpo. El 401 de la comprobación del token y el 422 de la comprobación del esquema no llevan el encabezado X-Error-Code; en la comprobación del esquema solo se traduce el message principal, los textos de details siguen en inglés. El encabezado X-Request-Id siempre está presente.

Los códigos más importantes

HTTPerrorSignificadoQué hacer
400invalid_jsonEl cuerpo no es un JSON válidoRevisa el JSON
400bad_requestContent-Type incorrecto o petición mal formadaPon Content-Type: application/json
401missing_bearer_tokenNo hay token en el encabezado AuthorizationPon el encabezado Authorization: Bearer …
401invalid_tokenToken caducado o no válido, o clave eliminadaPide un token nuevo; si no ayuda, revisa la clave
401invalid_api_keyID o secreto de la clave incorrectos en el intercambio de tokenRevisa las credenciales
402plan_limit_reachedLímite del plan alcanzado, por ejemplo de enlaces cortosMejora el plan o elimina entradas
403insufficient_scopeFalta el scope o el endpoint no está habilitado para claves de APICrea una clave con el scope adecuado
403forbiddenSin permiso para esta acciónHazlo en el panel
403feature_not_availableFunción no incluida en el planRevisa el plan
403block_type_requires_planTipo de bloque disponible solo en un plan superiorElige otro tipo de bloque o mejora el plan
403template_lockedPlantilla premium no disponible en el plan actualElige una plantilla de GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredEspacio de trabajo bloqueado o de solo lectura por un pago pendienteResuelve el pago en el panel
404not_foundEl recurso no existe o no pertenece a tu espacio de trabajoRevisa el ID
409conflictConflicto general con el estado actualVuelve a cargar el estado y cambia la entrada
409workspace_template_in_useHay páginas que todavía usan la plantilla del espacio de trabajo; el número está en details.countCambia las páginas a otra plantilla y después elimínala
409handle_taken, slug_takenEl handle o el slug del enlace corto ya está en usoElige otro valor
409form_in_use, page_not_private, page_not_published, never_publishedConflicto con el estado: el formulario sigue en una página, la página no es privada o no está publicada, nunca se ha publicadoCambia el estado y vuelve a intentarlo
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedSe ha alcanzado el límite de cantidad o de almacenamiento del planQuita entradas o mejora el plan
409draft_not_publishableEl borrador tiene problemas; la lista está en details.issuesCorrige los problemas y vuelve a publicar
413request_too_largeCuerpo mayor de lo permitido para este endpoint (64 KB, 1 MB o 2 MB); el límite está en details.max_kbEnvía menos datos por petición; consulta Límites de peticiones
413payload_too_largeArchivo subido mayor de 10 MBReduce el tamaño del archivo
422validation_failedEntrada no válida o campo desconocido; los detalles están en detailsCorrige los campos como se indica en details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostHandle reservado, o URL de destino no válida o no permitidaElige otro valor
422workspace_template_disabledLa plantilla del espacio de trabajo elegida está desactivadaActiva la plantilla en «Dominios y plantillas» o elige otra
422template_css_external, template_section_invalidPlantilla del espacio de trabajo: el CSS carga desde servidores externos, o una sección {{#if}}/{{#unless}}/{{#each}} está mal colocadaQuita las direcciones externas o cierra la sección dentro de la misma etiqueta o del mismo texto
422custom_css_externalEl CSS personalizado carga algo desde servidores externosQuita las direcciones externas del CSS
429rate_limited, api_key_lockedDemasiadas peticiones, o clave bloqueada tras intentos fallidosEspera lo que indique Retry-After o details.retry_after_sec
500internal_errorError inesperadoVuelve a intentarlo más tarde y anota el request_id
503service_unavailableServicio no disponible temporalmenteVuelve a intentarlo tras una pausa

Leer los errores de entrada

Con 422 validation_failed, details enumera cada problema por separado: field es la ruta del campo (con barras para los objetos anidados, por ejemplo theme_config/button_style) y reason es la regla incumplida, como required, minLength, maxLength, enum o additionalProperties. Con additionalProperties, el mensaje dice qué campos son desconocidos; a menudo es una errata en el nombre del campo.

Gestión recomendada en tu código

  • 400, 413 y 422: no repitas la petición; corrígela
  • 401 invalid_token: pide un token nuevo una vez y repite la petición
  • 403: no repitas la petición; revisa el scope, el plan o quién puede hacer esto
  • 404: revisa el ID; después de una eliminación es lo normal
  • 409: vuelve a cargar el estado y decide si la acción sigue haciendo falta
  • 429: espera lo que indique Retry-After y repite la petición; consulta Límites de peticiones
  • 500 y 503: repite unas pocas veces con pausas cada vez más largas

¿No has encontrado nada?

Cuéntanos qué necesitas y nuestro equipo de soporte te ayudará personalmente.

Contactar con soporte