Ir a la documentación
API

Errores

Una sola forma, dos niveles y un id de solicitud en todo.

El sobre

type es un conjunto congelado sobre el que puedes ramificar y que nunca crecerá. code es específico y aditivo, así que trata uno que no reconozcas como su type. requestId está en todas las respuestas, incluidas las exitosas, y es lo que vincula un informe con una línea de registro.

422 Unprocessable Entity
{  "error": {    "type": "validation_error",    "code": "invalid_email_address",    "message": "Not a valid email address: ada@",    "param": "to.0",    "docUrl": "https://openemail.uk/docs/api/errors#invalid_email_address",    "requestId": "req_e103790543af4…"  }}

param usa puntos e índices, de modo que señala el elemento exacto (to.0, attachments.2.filename) y no el campo que lo contiene.

Códigos de estado

EstadotypeCódigos comunes
400invalid_request_errormalformed_json, invalid_idempotency_key
401authentication_errormissing_api_key, invalid_api_key, revoked_api_key, invalid_credential_type
403permission_errorinsufficient_scope, from_address_forbidden
404not_found_errorresource_not_found
409conflict_erroremail_not_cancellable, translation_not_configured
422validation_errorinvalid_email_address, reserved_header, too_many_recipients, unknown_parameter, idempotency_key_reuse, label_not_directly_settable, unknown_language, translation_too_long
429rate_limit_errorsend_quota_exceeded, too_many_inboxes
500api_errorinternal_error
503api_errortranslation_failed

Un 404 nunca distingue entre «no existe» y «pertenece a otro espacio de trabajo». Es deliberado: la diferencia es, en sí misma, información.

Un 429 nunca lleva Retry-After, así que elige tú mismo cuánto esperar. send_quota_exceeded es el cupo mensual de envíos y se restablece el día uno del mes, así que muéstraselo a una persona en lugar de aplicar una espera progresiva. too_many_inboxes es el tope de creación de buzones desechables, y ampliar un buzón que ya tienes no cuenta para él.

500 y 503 comparten type y significan cosas distintas para quien llama. Un 503 es una dependencia que no respondió (hoy, el traductor), y vale la pena reintentar la solicitud sin cambios; un 500 es nuestro y conviene reportarlo con su requestId.

Cómo gestionarlos

Ramifica sobre type para el comportamiento y lee code para el mensaje que muestras a una persona. Un code no reconocido no es un error de tu cliente: significa que hemos nombrado un fallo con más precisión que antes.

TypeScript
const res = await fetch(`${BASE}/emails`, { method: 'POST', headers, body }); if (!res.ok) {  const { error } = await res.json();   switch (error.type) {    case 'rate_limit_error':      throw new RateLimited(error.code);    case 'validation_error':      // error.param points at the offending field      throw new BadRequest(`${error.param}: ${error.message}`);    case 'authentication_error':      // revoked_api_key and expired_api_key are worth telling an operator apart      throw new AuthFailed(error.code);    default:      // quote requestId when you report it      throw new Unexpected(error.message, error.requestId);  }}