Guías

Respuestas

Las respuestas correctas envuelven su contenido en data; las listas añaden pagination; algunas operaciones añaden meta; los errores son problemas RFC 9457. Las respuestas de la API comparten un mismo conjunto de cabeceras.

Una lista devuelve sus registros en data y el estado de paginación en pagination. nextCursor es null en la última página. total aparece solo cuando lo pides con includeTotal.

GET /api/v1/orders?limit=1 (recortado a unos pocos campos)
{
  "data": [
    {
      "id": "5e8d1a9c",
      "orderNumber": "ORD-0412",
      "status": "reserved",
      "startDate": "2026-10-17T08:00:00.000Z",
      "endDate": "2026-10-19T17:00:00.000Z",
      "contact": { "id": "c71f40b2", "name": "Acme Rentals" },
      "grossPrice": "1234.50"
    }
  ],
  "pagination": { "nextCursor": "opaque-cursor", "hasMore": true }
}

Una lectura de detalle, una creación y una actualización devuelven el recurso en data. Las operaciones que crean un recurso responden 201; las lecturas y las actualizaciones responden 200.

Unas pocas operaciones también te informan, en meta, de lo que la llamada hizo en otros registros. POST /api/v1/orders/{orderId}/reserve informa meta.tasksCreated, las tareas de entrega y devolución que creó la reserva; POST /api/v1/orders/{orderId}/cancel informa meta.tasksDeleted. Ambas devuelven el pedido completo en data.

La mayoría de los borrados y las dos operaciones de archivado (PUT /api/v1/orders/{orderId}/archive y PUT /api/v1/projects/{projectId}/archive) responden 204 sin cuerpo. Cuatro borrados responden 200 y devuelven en su lugar el registro que han cambiado: DELETE /api/v1/contacts/{contactId}/addresses/{addressId} y DELETE /api/v1/contacts/{contactId}/related-contacts/{relatedContactId} devuelven el contacto, DELETE /api/v1/tags/{tagId}/assignments devuelve el resultado de la desasignación y DELETE /api/v1/projects/{projectId}/orders/{orderId} devuelve el proyecto. Una lectura condicional cuyo ETag está vigente responde 304, también sin cuerpo.

POST /api/v1/orders/line-items/returns es un lote. Responde 200 con un resultado por elemento, en el orden de la petición. Con atomic: false responde 207 y cada elemento lleva su propio status y error. Consulta la tabla de reintentos en Errores.

Los errores son application/problem+json y llevan type, title, status, code, detail y requestId, además de errors, requiredScope, requiredAddon o retryAfter cuando corresponden. Se describen en Errores.

Estas cabeceras provienen del documento OpenAPI, más la estándar Date.

CabeceraDóndeQué te dice
X-Request-IdTodas las respuestas de la API. No los endpoints de OAuth, ni el 401 del descubrimiento de MCPEl identificador de la petición (req_…), generado por el servidor. Los cuerpos de error lo repiten como requestId; el 401 del endpoint MCP lo lleva solo en el cuerpo. Regístralo y cítalo al contactar con soporte.
RateLimit-LimitToda respuesta que consumió cuota (todas salvo un 401 y un 403 insufficient_scope)Peticiones permitidas por minuto en la cuota más estricta que consumió la petición.
RateLimit-RemainingIgualPeticiones restantes en la ventana actual de un minuto de esa cuota.
RateLimit-ResetIgualSegundos hasta que esa ventana se reinicia.
Retry-AfterRespuestas 429Segundos que esperar antes de reintentar; el problema 429 repite el valor en retryAfter. Consulta Límites de peticiones.
ETagLecturas de detalle y escrituras que devuelven el recursoUna etiqueta fuerte de la representación. Devuélvela como If-Match en una escritura, o como If-None-Match en una lectura.
Content-LanguageRespuestas de errorEl idioma de detail y errors[].message, negociado a partir de Accept-Language.
Idempotent-ReplayDeclarado por las operaciones de escritura; presente en una respuesta reproducida para un Idempotency-Key repetidotrue cuando es la respuesta almacenada del primer intento, no una ejecución nueva. Está ausente en la primera ejecución, y un error almacenado también se reproduce.
DateTodas las respuestasLa hora de los servidores de Filmo. Úsala, y no tu propio reloj, siempre que calcules una ventana para lecturas incrementales.
Deprecation, Sunset, LinkRespuestas de una operación obsoletaAnuncia que la operación está obsoleta, el día en que se retirará y dónde está el aviso (rel="deprecation").

Las cabeceras de cuota se explican en Límites de peticiones, Idempotent-Replay en Idempotencia y ETag en Concurrencia.

Las lecturas de detalle devuelven un ETag. Envía el que ya tienes en If-None-Match: si sigue vigente, la respuesta es 304 sin cuerpo y con la cabecera ETag, y tu copia está al día. Si el recurso cambió, recibes el 200 completo con un ETag nuevo.

# First read: note the ETag header.
curl -sS -D - -o /dev/null "https://app.filmo.io/api/v1/account" \
  -H "Authorization: Bearer $FILMO_API_KEY"

# Later: ask only for a newer version (paste the ETag you received, quotes included).
curl -sS -i "https://app.filmo.io/api/v1/account" \
  -H "Authorization: Bearer $FILMO_API_KEY" \
  -H 'If-None-Match: "<the ETag you received>"'

Una operación marcada como obsoleta lleva las cabeceras Deprecation y Sunset, y cada cuerpo JSON que devuelve lleva meta.warnings[] con una entrada cuyo code es deprecated. Registra esos avisos y configura alertas sobre ellos: el día de la retirada es al menos seis meses posterior a la entrada en vigor de la obsolescencia. Más adelante pueden añadirse entradas con otros códigos; ignora las que no conozcas.

{ "data": { "id": "5e8d1a9c" }, "meta": { "warnings": [{ "code": "deprecated" }] } }
EstadoSignificado
200Éxito. Lecturas, actualizaciones, acciones y consultas.
201Se creó un recurso.
204Éxito sin cuerpo: la mayoría de los borrados y las operaciones de archivado. Cuatro borrados responden 200 con el registro modificado.
207Resultado parcial de un lote: solo POST /api/v1/orders/line-items/returns con atomic: false. Lee el status de cada elemento.
304No modificado: el ETag que enviaste en If-None-Match está vigente.
400validation_error: la consulta o el cuerpo no son válidos.
401La clave falta o no se puede usar: unauthorized y los códigos api_key_*.
402addon_required: la cuenta no tiene el add-on de ese módulo.
403insufficient_scope o forbidden.
404not_found: no existe o queda fuera del aislamiento de la clave.
409conflict (su causa está en errors[0].code), contact_in_use, address_in_use o insufficient_stock.
412precondition_failed: If-Match no coincidió.
422idempotency_key_reused.
429rate_limited.
500internal_error.
503service_unavailable: la funcionalidad está desactivada para la cuenta.

Dentro de v1, Filmo añade propiedades a las respuestas y valores a las uniones, como los estados, sin previo aviso. Ignora las propiedades que no uses, trata un valor de enum desconocido como desconocido y no como un error, y no valides las respuestas con un esquema que rechace propiedades adicionales. Los clientes generados con enums cerrados se rompen con los cambios aditivos: consulta Versionado.

  • Guías

    Errores

    Los errores son documentos de problema RFC 9457. Ramifica según el code estable, nunca según el texto, y usa la tabla de reintentos para decidir si volver a intentarlo.

  • Guías

    Paginación

    Las listas devuelven una página cada vez. Pide una página con limit y, mientras pagination.hasMore sea true, vuelve a llamar con el nextCursor que te dieron.

  • Guías

    Tipos de datos

    El dinero es una cadena decimal, las fechas son ISO 8601, una propiedad puede estar presente y ser null, y los campos personalizados son mapas. Interpreta cada tipo una sola vez, en el borde de tu integración.

  • Guías

    Versionado y obsolescencia

    Dentro de v1 Filmo solo añade cosas. Cualquier cosa que pueda romper tu integración se anuncia antes, ya sea como una nueva versión mayor o como una obsolescencia con al menos seis meses antes de la retirada.

¿Te ha resultado útil esta página?