API SIRE y TRA para tu PMS
Conecta tu PMS con Digitra Rentals y reporta cada huésped a la TRA del MinCIT y al SIRE de Migración Colombia: crea reservas con tu propio identificador, envía el enlace de registro al huésped y recibe cada avance por webhook.
Primeros pasos en 1:22: dónde está la documentación, cómo creas tu llave en Configuración → API y tu primera llamada.
Esta guía explica cómo conectar tu PMS (Guesty u otro) con la API de Digitra Rentals para reportar automáticamente a la TRA del MinCIT (Tarjeta de Registro de Alojamiento) y al SIRE de Migración Colombia, sin integrar tú mismo cada sistema del Estado. Con ella:
- cada reserva nueva de tu PMS se cree en Digitra con tu propio identificador;
- Digitra te devuelva el enlace de registro para enviárselo al huésped;
- Digitra te avise por webhook de cada avance (registro, firma, reportes a TRA y SIRE);
- puedas consultar el estado de cualquier reserva y modificarla o cancelarla.
Digitra no se conecta a tu PMS: tu sistema llama a Digitra, y Digitra le avisa a tu sistema.
- Especificación completa (OpenAPI 3): la referencia de la API (openapi.yaml)
- Webhooks en detalle: Webhooks
- Ejemplos de verificación de firma:
verificar-firma.jsyverificar_firma.py - Colección de Postman:
digitra-api.postman_collection.json
1. Autenticación
Cada petición lleva tu llave en el header Authorization:
Authorization: Bearer dgt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Hay dos tipos de llave, y la llave decide el ambiente:
| Prefijo | Ambiente | Qué pasa con los reportes |
|---|---|---|
dgt_test_ |
Pruebas (sandbox) | Opera sobre propiedades de prueba. TRA y SIRE se simulan: nada sale hacia MinCIT ni Migración Colombia. |
dgt_live_ |
Producción | Opera sobre tus propiedades reales. TRA y SIRE se reportan de verdad. |
- La URL base es la misma para los dos ambientes:
https://digitra.rentals. - Cada llave solo ve las propiedades, reservas y webhooks de tu cuenta.
- Una llave de pruebas no puede tocar propiedades reales, y una de producción no puede tocar las de prueba.
- Cada llave se muestra una sola vez, al crearla. Guárdala como un secreto (en variables de entorno o en un gestor de secretos, nunca en el código ni en el navegador). Si se pierde o se filtra, revócala y crea otra.
Cómo obtener tus llaves
Las creas tú mismo en el panel de Digitra, en Configuración → API. Si no ves esa pestaña, escríbenos para habilitar la API en tu cuenta.
- Pruebas: el botón Crear ambiente de pruebas te arma dos propiedades de prueba y te entrega tu primera llave
dgt_test_. Ahí mismo ves losproperty_idde esas propiedades. - Producción: al crear una llave
dgt_live_te enviamos un código a tu correo para confirmar que eres tú, y cuando la creas te avisamos por correo. Si recibes ese aviso y no fuiste tú, revoca la llave de inmediato. - Puedes tener hasta 3 llaves activas de cada tipo, por ejemplo una por sistema. Revocar una llave no afecta a las demás.
2. Flujo completo
Reserva nueva en tu PMS
│
▼
POST /api/partners/reservations ← con tu reservation_id como external_id
│ 201: { reservation_id, checkin_url, ... }
▼
Tu PMS le envía checkin_url al huésped (correo, WhatsApp, mensaje de la OTA)
│
▼
El huésped se registra en Digitra (datos, documento, firma si aplica)
│
▼
Webhooks a tu URL:
registration.completed → contract.signed → sire.reported → tra.reported
│
▼
GET /api/partners/registrations?external_id=... ← cuando quieras el detalle
Paso 0 — Conocer tus propiedades
curl https://digitra.rentals/api/partners/properties \
-H "Authorization: Bearer $DIGITRA_KEY"
{
"properties": [
{
"property_id": "3f1c2b9a-0d4e-4a51-9a7e-2b6f0c8d1e23",
"external_id": null,
"rnt_id": "123456",
"name": "Apartamento 501",
"internal_name": "501",
"checkin_enabled": true,
"compliance": { "tra": true, "sire": true },
"requires_contract_signature": false,
"requires_document_photos": true
}
]
}
compliance te dice si esa propiedad reporta TRA y SIRE. Si alguna aparece en false y debería reportar, escríbenos antes de empezar.
Paso 1 — Asociar tus listings (una sola vez)
Para crear reservas con el id de la propiedad en tu PMS (en Guesty, el listing_id), asocia cada propiedad de Digitra con ese id:
curl -X PATCH https://digitra.rentals/api/partners/properties \
-H "Authorization: Bearer $DIGITRA_KEY" \
-H "Content-Type: application/json" \
-d '{
"mappings": [
{ "property_id": "3f1c2b9a-0d4e-4a51-9a7e-2b6f0c8d1e23", "external_id": "64f1a2b3c4d5e6f7a8b9c0d1" }
]
}'
- Se aplica todo o nada: si un mapeo falla, no se cambia ninguno.
external_id: nullquita la asociación.- Un mismo
external_idno puede estar en dos propiedades.
También puedes identificar la propiedad por property_id (el de Digitra) o por rnt_id. Solo se envía uno de los tres.
Paso 2 — Crear la reserva
curl -X POST https://digitra.rentals/api/partners/reservations \
-H "Authorization: Bearer $DIGITRA_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_id": "65a1b2c3d4e5f6a7b8c9d0e1",
"source": "guesty",
"property_external_id": "64f1a2b3c4d5e6f7a8b9c0d1",
"check_in": "2026-10-10",
"check_out": "2026-10-12",
"guest_name": "María Pérez",
"guests_count": 2,
"guest_email": "huesped@ejemplo.com",
"guest_phone": "+573001234567",
"total_amount": 850000,
"currency": "COP",
"metadata": { "guesty_listing": "64f1a2b3c4d5e6f7a8b9c0d1", "canal": "airbnb" }
}'
| Campo | Obligatorio | Descripción |
|---|---|---|
external_id |
Sí | Tu identificador de la reserva (en Guesty, el reservation_id). Máx. 120 caracteres. |
source |
No | De dónde viene ("guesty", "booking"…). Se devuelve en la consulta y en los webhooks. |
property_external_id / property_id / rnt_id |
Uno de los tres | La propiedad. |
check_in, check_out |
Sí | YYYY-MM-DD. La salida debe ser posterior a la entrada. |
guest_name |
Sí | Nombre del titular. |
guests_count |
Sí | Número de huéspedes. El check-in no se cierra hasta que estén todos registrados. |
guest_email, guest_phone |
No | Contacto del titular. |
total_amount, currency |
No | Valor de la estadía; COP o USD (USD se convierte con la TRM oficial del día). Se usa en el reporte TRA. |
room_number |
No | Habitación, si aplica. |
notes |
No | Notas internas. |
metadata |
No | Objeto libre (máx. 4 KB). Te lo devolvemos tal cual en la consulta y en cada webhook. |
Respuesta 201:
{
"ok": true,
"reservation_id": "manual-1727650000000",
"external_id": "65a1b2c3d4e5f6a7b8c9d0e1",
"status": "pending_checkin",
"reservation_status": "confirmed",
"checkin_token": "8b0c4f7e-2a1d-4c3b-9e5f-6a7b8c9d0e1f",
"checkin_status": "pending",
"guests_registered": 0,
"tra": { "status": "not_applicable", "sends_on": "2026-10-12", "reported_at": null, "mincit_code": null,
"warning": "Aún no hay huéspedes registrados. El TRA se programa cuando el huésped complete el check-in." },
"sire": { "status": "not_applicable", "foreign_guests": 0, "reported_at": null },
"source": "guesty",
"metadata": { "guesty_listing": "64f1a2b3c4d5e6f7a8b9c0d1", "canal": "airbnb" },
"checkin_url": "https://digitra.rentals/checkin/8b0c4f7e-2a1d-4c3b-9e5f-6a7b8c9d0e1f",
"created_at": "2026-09-30T15:04:05.000Z"
}
checkin_url es el enlace que le envías al huésped. Digitra no se lo envía por su cuenta en este flujo: lo decides tú, desde tu PMS.
Paso 3 — Recibir los avisos
Registra tu URL una vez (ver Webhooks) y Digitra te avisará de cada avance.
Paso 4 — Consultar cuando lo necesites
curl "https://digitra.rentals/api/partners/registrations?external_id=65a1b2c3d4e5f6a7b8c9d0e1" \
-H "Authorization: Bearer $DIGITRA_KEY"
Agrega &include=guests para recibir los datos de cada huésped registrado (documento, nacionalidad, residencia, contacto y fecha de registro). Sin ese parámetro la respuesta trae solo estados, sin datos personales.
Cada huésped trae document_uploaded: true si subió la foto del documento y false si no. La imagen nunca viaja por la API. Treinta días después de la salida las fotos se borran por política de retención de datos y el campo pasa a null.
También existe GET /api/partners/registrations/{external_id}. Si tu identificador puede llevar /, usa la forma con ?external_id=.
El campo status
Es el único campo que necesitas mirar para saber en qué va la reserva:
status |
Significado |
|---|---|
pending_checkin |
Nadie se ha registrado todavía. |
pending_signature |
Los huéspedes se registraron, pero falta firmar el contrato. |
pending_compliance |
Registro completo; los reportes aún no se envían (el TRA sale el día de llegada del huésped). |
compliant |
Todo lo que aplica se reportó y fue aceptado. |
partial |
Un reporte aceptado y otro rechazado. |
failed |
Algún reporte fue rechazado. Revisa tra.warning o sire.warning. |
cancelled |
Cancelaste la reserva. |
tra.status y sire.status traen el detalle de cada reporte. Cuando un reporte no va a salir por un motivo de configuración, warning lo explica.
3. Idempotencia: reintentar sin miedo
La combinación (tu llave, external_id) es única y está garantizada en la base de datos.
| Situación | Respuesta |
|---|---|
| Primera vez | 201, reserva creada. |
Mismo external_id y mismos datos (por ejemplo, reintentaste por un timeout) |
200, la misma reserva, con "idempotent_replay": true. No se crea otra. |
Mismo external_id con datos distintos |
409 reservation_conflict. Para cambiarla usa PATCH. |
Dos peticiones simultáneas con el mismo external_id |
Una gana; la otra recibe 409 creation_in_progress. Reintenta en unos segundos y recibirás la reserva. |
Ejemplo: tu servidor envía el POST, se corta la conexión y no sabes si llegó. Reenvía exactamente el mismo cuerpo: si ya se había creado, recibes 200 con la misma reserva y el mismo checkin_url.
4. Cambios y cancelaciones
Modificar
curl -X PATCH https://digitra.rentals/api/partners/reservations \
-H "Authorization: Bearer $DIGITRA_KEY" \
-H "Content-Type: application/json" \
-d '{ "external_id": "65a1b2c3d4e5f6a7b8c9d0e1", "check_out": "2026-10-13", "guests_count": 3 }'
Campos modificables: check_in, check_out, guests_count, guest_name, guest_email, guest_phone, notes, metadata. La respuesta trae el estado actualizado y changed con lo que cambió.
Reglas:
- Una reserva cancelada no admite cambios (
409reservation_cancelled). - El TRA se reporta a MinCIT el día de llegada del huésped. Después de eso, lo único que se puede cambiar por API es ampliar la salida: Digitra registra las noches nuevas ante MinCIT automáticamente. Mover la llegada, acortar la estadía o cambiar fechas cuya entrada ya se reportó a Migración Colombia no se puede por API (
409already_reported). Escríbenos: hay que corregirlo también ante la autoridad. guests_countno puede ser menor que los huéspedes ya registrados (409guests_already_registered).
Cancelar
curl -X POST https://digitra.rentals/api/partners/reservations/cancel \
-H "Authorization: Bearer $DIGITRA_KEY" \
-H "Content-Type: application/json" \
-d '{ "external_id": "65a1b2c3d4e5f6a7b8c9d0e1", "reason": "Cancelada en Guesty" }'
- Una reserva cancelada no se reporta a TRA ni a SIRE. Si ya estaba incluida en un reporte SIRE pendiente, sale de él.
- Es idempotente: cancelar dos veces devuelve
200las dos (already_cancelled: truela segunda). - Si algo ya se había reportado antes de cancelar,
already_reportedlo indica ywarninglo explica. Ese reporte no se anula automáticamente; escríbenos para corregirlo ante la autoridad.
Cancela siempre en Digitra cuando cancelen en tu PMS. Si no, la reserva se reportará como si el huésped hubiera llegado.
5. Ambiente de pruebas
Con tu llave dgt_test_ trabajas sobre propiedades de prueba. El contrato es idéntico al de producción, con estas diferencias:
- TRA y SIRE se simulan. Las respuestas y los webhooks traen
"sandbox": truey cada reporte trae"simulated": true. Cuando el registro se completa, los dos reportes pasan asuccessal instante (en producción, el TRA sale el día de llegada del huésped). - Nada sale del sistema hacia MinCIT, Migración Colombia ni la aseguradora.
- Para probar el manejo de errores, crea una reserva con
"sandbox_simulate": "tra_failed"o"sandbox_simulate": "sire_failed". El reporte correspondiente queda enerrory recibes el webhooktra.failedosire.failed. - Puedes abrir el
checkin_urly registrarte como huésped de prueba. Usa datos ficticios.
6. Errores
Todas las respuestas de error tienen esta forma:
{ "error": "Mensaje legible", "code": "reservation_conflict", "details": { } }
Programa contra code, que es estable. error es un texto para humanos y puede cambiar.
| HTTP | code |
Qué significa |
|---|---|---|
| 400 | invalid_json |
El cuerpo no es JSON válido. |
| 400 | invalid_request |
Falta un campo o tiene un formato inválido. El mensaje dice cuál. |
| 400 | invalid_webhook_url |
La URL del webhook no es HTTPS pública. |
| 400 | registration_rejected |
El registro de huéspedes no se aceptó; el mensaje dice por qué. |
| 401 | unauthorized |
Falta la llave, es inválida o fue revocada. |
| 403 | property_out_of_scope |
La propiedad no pertenece a tu cuenta. |
| 403 | sandbox_property_required |
Usaste una llave de pruebas sobre una propiedad real. |
| 403 | live_property_required |
Usaste una llave de producción sobre una propiedad de prueba. |
| 404 | property_not_found |
La propiedad no existe o no tiene el check-in habilitado. |
| 404 | registration_not_found |
No hay ninguna reserva tuya con ese external_id. |
| 404 | webhook_not_found / delivery_not_found |
El endpoint o la entrega no existen o no son tuyos. |
| 409 | reservation_conflict |
Ese external_id ya existe con otros datos. Usa PATCH. |
| 409 | creation_in_progress |
Hay otra creación en curso con ese external_id. Reintenta. |
| 409 | registration_open |
Ese external_id se creó sin huéspedes; se registran por el enlace. |
| 409 | reservation_cancelled |
La reserva está cancelada. |
| 409 | already_reported |
Ya se reportó a la autoridad; no se puede cambiar por API. |
| 409 | guests_already_registered |
guests_count menor que los huéspedes ya registrados. |
| 409 | duplicate_document |
Un número de documento se repite entre los huéspedes. |
| 409 | external_id_in_use |
Ese id externo ya está asignado a otra propiedad. |
| 409 | webhook_limit_reached |
Máximo 5 endpoints activos por llave. |
| 429 | rate_limited |
Superaste el límite. Espera lo que indica Retry-After. |
| 500 | internal_error |
Error nuestro. Reintenta; si persiste, escríbenos. |
| 503 | trm_unavailable |
No se pudo obtener la TRM para convertir USD. Reintenta en unos minutos. |
7. Límites de peticiones
| Operaciones | Límite por llave |
|---|---|
| Escritura (crear, registrar, modificar, cancelar, mapear, gestionar webhooks) | 60 por minuto, compartido |
| Lectura (consultas, propiedades, historial de webhooks) | 120 por minuto |
| Evento de prueba de webhook | 10 por minuto |
Cada respuesta incluye:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1727650060
Al superarlo recibes 429 con Retry-After (segundos).
8. Buenas prácticas
- Guarda nuestro
reservation_idjunto a tu reserva. No es obligatorio (todo funciona con tuexternal_id), pero ayuda cuando nos escribes por soporte. - Procesa los webhooks de forma idempotente: deduplica por
X-Digitra-Event-Id. - No uses los webhooks como única fuente. Si tu receptor estuvo caído, consulta el estado con
GETo reenvía los eventos desde el historial (Webhooks). - Cancela en Digitra cada reserva que se cancele en tu PMS.
- Nunca pongas la llave en el navegador ni en una app móvil: las llamadas se hacen desde tu servidor.
9. Preguntas frecuentes sobre la API de SIRE y TRA
¿Migración Colombia tiene una API pública para reportar el SIRE?
Para alojamientos, el SIRE se reporta en el portal de Migración Colombia, huésped por huésped o con carga de un archivo plano; no hay una API pública documentada para hoteles y viviendas turísticas. La API de Digitra Rentals cubre ese hueco: tu PMS envía los datos del huésped y Digitra Rentals hace el reporte SIRE por ti.
¿Cómo se conecta un PMS con la TRA del MinCIT?
La TRA tiene una integración oficial para PMS que usa un token por RNT. El token se pide en pms.mincit.gov.co/token y llega al correo registrado en el RNT. Con la API de Digitra Rentals no programas esa integración: guardas el token en tu propiedad y Digitra Rentals envía la TRA el día de llegada del huésped, y las noches nuevas si se amplía la estadía.
¿A quién se reporta cada huésped?
Todo huésped va a la TRA. Los extranjeros, además, van al SIRE. Tú envías los mismos datos para todos y Digitra Rentals decide a dónde va cada uno; el estado de los dos reportes te llega en la consulta y por webhook.
¿Qué necesito para empezar?
- RNT activo y su token TRA.
- Si recibes extranjeros, tu código SIRE de Migración Colombia. Si aún no lo tienes, el asistente gratuito de digitra.rentals/sire te ayuda a pedirlo.
- La API habilitada en tu cuenta de Digitra Rentals. Tus llaves las creas en Configuración → API.
¿Puedo probar la integración sin reportar nada real?
Sí. Con una llave dgt_test_ trabajas sobre propiedades de prueba: TRA y SIRE se simulan y nada sale hacia el MinCIT ni hacia Migración Colombia (ver Ambiente de pruebas).