Digitra Rentals para desarrolladores

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:

  1. cada reserva nueva de tu PMS se cree en Digitra con tu propio identificador;
  2. Digitra te devuelva el enlace de registro para enviárselo al huésped;
  3. Digitra te avise por webhook de cada avance (registro, firma, reportes a TRA y SIRE);
  4. 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.


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.

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.


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" }
    ]
  }'

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:

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" }'

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:


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


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?

¿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).