Referencia de la API

Acceso programático a las declaraciones de aduana de Uruguay. URL base https://uytrades.com/api/v1. Las respuestas son application/json; las fechas siguen ISO 8601.

Autenticación

Enviá un token de acceso personal en el header Authorization: Bearer <token>. Los tokens se crean en /account. El valor en texto plano se devuelve una sola vez, al crearlo, y no se puede recuperar después.

curl -H "Authorization: Bearer uytr_a1b2c3d4_xxxxxxxxxxxx" \
     "https://uytrades.com/api/v1/me"

El token hereda el plan de la cuenta que lo creó. Si la suscripción vence, los endpoints Pro devuelven 402 para ese token; no hace falta revocarlo.

También se acepta autenticación por cookie de sesión, de modo que los endpoints se pueden abrir en un navegador con sesión iniciada. Para clientes no interactivos, usá un token.

Límites de uso

Los límites se aplican por cuenta, sumando todos sus tokens. Crear tokens adicionales no los aumenta.

Endpoints Por minuto Por hora
/dua, /dua/summary 20 60
/me, /dua/meta 60 600
Sin autenticar (alcanza solo /dua/meta) 10 60

Las dos ventanas se aplican en simultáneo. Los dos grupos de endpoints se miden por separado: agotar uno no afecta al otro.

Las respuestas de estos endpoints incluyen:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1755792000
X-RateLimit-Limit-Minute: 20
X-RateLimit-Remaining-Minute: 19

Superar cualquiera de las dos ventanas devuelve 429. Retry-After indica los segundos que faltan para que esa ventana se reinicie.

HTTP/1.1 429 Too Many Requests
Retry-After: 412

{
  "error": {
    "code": "rate_limited",
    "message": "60 requests/hour exceeded.",
    "limit": 60,
    "window": "hour",
    "reset": 1755792000
  }
}

Endpoints

GET /api/v1/me

Devuelve el id, el email, el plan y el vencimiento de la cuenta autenticada.

curl -H "Authorization: Bearer $TOKEN" "https://uytrades.com/api/v1/me"

{"id": 42, "email": "you@example.com", "tier": "pro",
 "is_pro": true, "pro_until": "2027-01-14T00:00:00+00:00"}

GET /api/v1/dua/meta

Opciones de filtro, topes de filas y nombres de columnas. No requiere autenticación.

curl "https://uytrades.com/api/v1/dua/meta"

{"row_limit_max": 10000, "default_limit": 100,
 "regimens": ["ALL", "EXPORT", "IMPORT", "TRANSIT"],
 "columns": ["anio", "fecha_dua", "aduana_ing_egr", ...],
 "requires_pro": true, "is_pro": false}

GET /api/v1/dua

Devuelve las filas de declaraciones que coinciden con los filtros, ordenadas por fecha_dua DESC, nro_publico. Requiere Pro.

Parámetro Obligatorio Descripción
yearsíEntero. 2016 o posterior.
regimensíUno de IMPORT, EXPORT, TRANSIT, ALL.
aduananoCódigo de aduana de tres dígitos. Omitido significa todas las aduanas.
searchnoCoincidencia de subcadena sin distinguir mayúsculas sobre el nombre de la empresa, o por prefijo sobre el código NCM. Los comodines se escapan. Se trunca a 100 caracteres.
limitnoFilas por página. De 1 a 10,000. Por defecto 100.
offsetnoFilas omitidas antes de la primera fila devuelta. Por defecto 0.
curl -H "Authorization: Bearer $TOKEN" \
  "https://uytrades.com/api/v1/dua?year=2026&regimen=IMPORT&limit=100"

{"data": [{"anio": 2026, "fecha_dua": "2026-03-04", "nombre": "ACME SA", ...}],
 "pagination": {"limit": 100, "offset": 0, "returned": 100, "has_more": true},
 "query": {"year": 2026, "aduana": null, "regimen": "IMPORT", "search": null},
 "meta": {"elapsed_ms": 84.2}}

has_more es false en la última página, incluso cuando el total es múltiplo exacto de limit. Los offsets son estables dentro de una secuencia de páginas mientras los filtros no cambien.

GET /api/v1/dua/summary

Agrega el mismo conjunto de filtros sin devolver las filas: cantidad total, valor en aduana total en USD, las diez aduanas de mayor valor y un conteo por régimen. Requiere Pro.

curl -H "Authorization: Bearer $TOKEN" \
  "https://uytrades.com/api/v1/dua/summary?year=2026&regimen=IMPORT"

{"row_count": 148230, "total_usd": 2841993022.14,
 "by_aduana": [{"aduana": "001", "rows": 91204, "usd": 1922841003.5}],
 "by_regimen": [{"regimen_tipo": "I", "rows": 148230}],
 "query": {"year": 2026, "aduana": null, "regimen": "IMPORT", "search": null}}

GET POST DELETE /api/v1/keys

Lista, crea y revoca tokens de la cuenta autenticada. POST devuelve el token en texto plano en el cuerpo de la respuesta; después no se puede recuperar. Crear requiere Pro.

curl -X POST -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name": "nightly-etl"}' \
  "https://uytrades.com/api/v1/keys"

{"id": 7, "name": "nightly-etl", "prefix": "a1b2c3d4",
 "created_at": "2026-08-21T16:04:11+00:00", "last_used_at": null,
 "token": "uytr_a1b2c3d4_xxxxxxxxxxxx"}

curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "https://uytrades.com/api/v1/keys/7"

Máximo 20 tokens activos por cuenta. Revocá uno antes de crear otro.

Errores

Todos los errores usan el mismo formato. code es estable y sirve para ramificar; status repite el estado HTTP. Algunos errores agregan campos, como upgrade_url en 402 y reset en 429.

{"error": {"code": "unauthorized", "status": 401, "message": "Authentication required. ..."}}
Estado code Cuándo
400bad_requestParámetro faltante o mal formado. message indica cuál.
401unauthorizedToken ausente, mal formado, desconocido o revocado, o cuenta deshabilitada.
402payment_requiredAutenticado, pero el endpoint requiere Pro. El cuerpo incluye upgrade_url.
404not_foundEndpoint o recurso inexistente.
429rate_limitedLímite de uso excedido. Ver Retry-After.
500server_errorError del servidor.

Los fallos de autenticación devuelven 401 con cuerpo JSON y un header WWW-Authenticate: Bearer. Ningún endpoint bajo /api/v1 responde con una redirección, así que un cliente puede seguir redirecciones sin que eso enmascare un error de autenticación.

Descargas masivas

Esta API está diseñada para consultas acotadas. Con 60 requests por hora y 10,000 filas por request, bajar un año completo de declaraciones no es viable.

Para eso usá la exportación CSV en /app/export. Acepta el mismo token Bearer y entrega hasta 1,000,000 filas en un solo request.

curl -H "Authorization: Bearer $TOKEN" \
  "https://uytrades.com/app/export?year=2026&regimen=IMPORT&search=ACME" \
  -o acme-2026.csv

Qué es estable

Los endpoints de esta página son estables. Los campos de sus respuestas no se van a eliminar ni a cambiar de tipo sin aviso.

Cualquier otra ruta bajo /api/v1 sirve a la aplicación web o está en beta. No están versionadas y pueden cambiar o retirarse sin aviso:

  • /api/v1/alerts
  • /api/v1/watches
  • /api/v1/views
  • /api/v1/export-schedules

Aceptan la misma autenticación pero no están cubiertas por la garantía anterior.

Beta

GET /api/v1/stories/candidate recalcula un candidato de historia para el paso de reconciliación del pipeline de video. Requiere Pro, consume el presupuesto expensive y devuelve application/json. Su respuesta sigue a los formatos de historia y puede cambiar sin aviso.

Parámetros: format, period (year:YYYY o ytd:YYYY), los parámetros propios del formato, y opcionalmente through (una fecha ISO 8601) y page_size. Un parámetro desconocido devuelve 400.

curl -H "Authorization: Bearer $TOKEN" \
  "https://uytrades.com/api/v1/stories/candidate?format=A&period=year:2025&ncm=4011&regimen=I&page_size=10"