Skip to content

URLs y Dominios

Concepto

Cada tenant tiene un alias unico que se usa como subdominio. El hostname identifica implicitamente al tenant sin que el usuario lo digite. Los clientes pueden configurar dominios custom (CNAME) para white-labeling completo.

Estructura de URLs

URLs de plataforma (gestionadas por Reimagine Tech)

ComponentePatronEjemplo
Panel Admindash.{tenant-alias}.reimaginetech.iodash.fintech-abc.reimaginetech.io
Ejecucion publicavalidate.{tenant-alias}.reimaginetech.io/{token}validate.fintech-abc.reimaginetech.io/abc123
APIapi.{tenant-alias}.reimaginetech.io/v1/{resource}api.fintech-abc.reimaginetech.io/v1/credits
Documentaciondocs.reimaginetech.iodocs.reimaginetech.io

Con organizaciones

PatronEjemploResolucion
{org}.{tenant}.reimaginetech.iodigital.fintech-abc.reimaginetech.iotenant: fintech-abc, org hint: digital
{tenant}.reimaginetech.iofintech-abc.reimaginetech.iotenant: fintech-abc, sin org hint

URLs con CNAME del cliente (white-label)

El cliente configura en su DNS:

validacion.clienteabc.com      CNAME  validate.fintech-abc.reimaginetech.io
panel.clienteabc.com           CNAME  dash.fintech-abc.reimaginetech.io
api.clienteabc.com             CNAME  api.fintech-abc.reimaginetech.io

El usuario final ve el dominio del cliente, no el de Imagy.

Versionamiento de API

La version se incluye en el path de la URL:

api.{tenant-alias}.reimaginetech.io/v1/credits
api.{tenant-alias}.reimaginetech.io/v1/flows
api.{tenant-alias}.reimaginetech.io/v2/credits
ReglaDescripcion
Version en URL/v1/, /v2/, etc.
Version actualv1 (MVP)
Backward compatibleAgregar campos o endpoints nuevos no requiere nueva version
Breaking changeEliminar campos o cambiar estructura requiere nueva version
Soporte paraleloAl lanzar v2, v1 sigue activa minimo 6 meses
DeprecationHeader Sunset: {date} en respuestas de version deprecated

Resolucion de Tenant desde Hostname

Orden de resolucion

  1. Cache en Valkey (domain_resolve:{hostname})
  2. Buscar hostname exacto en tabla tenant_domains (soporta CNAMEs custom)
  3. Parsear patron {app}.{tenant-alias}.reimaginetech.io
  4. Buscar tenant por alias
  5. Si no se encuentra: 404

Resolucion por Header (APIs internas)

Para llamadas programaticas y service-to-service, el tenant se resuelve del JWT:

PrioridadFuenteUso
1JWT claim tenant_idSiempre presente en requests autenticados
2Hostname (subdominio)Apps web, white-label
3Query param cidFallback para desarrollo/testing

Modelo de Datos

sql
CREATE TABLE tenant_domains (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    tenant_id UUID NOT NULL REFERENCES tenants(id),
    domain_type VARCHAR(20) NOT NULL
        CHECK (domain_type IN ('primary', 'cname', 'custom')),
    hostname VARCHAR(255) NOT NULL,
    is_verified BOOLEAN NOT NULL DEFAULT false,
    verified_at TIMESTAMPTZ,
    ssl_status VARCHAR(20) NOT NULL DEFAULT 'pending'
        CHECK (ssl_status IN ('pending', 'active', 'failed')),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    CONSTRAINT uq_tenant_domains_hostname UNIQUE (hostname)
);

CREATE INDEX idx_tenant_domains_lookup
    ON tenant_domains(hostname) WHERE is_verified = true;

Tipos de Dominio

TipoDescripcionVerificacionEjemplo
primaryGenerado automaticamente al crear tenantNo requierefintech-abc.reimaginetech.io
cnameCNAME del cliente apuntando a nuestro dominioVerificacion DNSvalidacion.clienteabc.com
customDominio completamente customVerificacion DNS + TLSid.empresa.co

Verificacion de Dominio Custom

Certificados TLS

EscenarioSolucion
Subdominios propios *.reimaginetech.ioWildcard certificate en ACM
Subdominios de tenant *.fintech-abc.reimaginetech.ioWildcard por tenant o SAN
CNAME del clienteACM con DNS validation

En AWS

CloudFront / ALB
├── Default cert: *.reimaginetech.io (wildcard)
├── SNI cert: *.fintech-abc.reimaginetech.io
├── SNI cert: *.cooperativa-xyz.reimaginetech.io
└── SNI cert: validacion.clienteabc.com (ACM DNS validation)

Cache de Resolucion

KeyTTLContenidoInvalidacion
domain_resolve:{hostname}5 min{tenant_id, alias, verified}Al agregar/verificar/eliminar dominio
tenant_cache:{code}5 min{id, code, name, status}Al crear/actualizar/suspender tenant

Endpoints API

MetodoEndpointDescripcionRol
GET/api/v1/tenants/{id}/domainsListar dominios del tenanttenant_admin
POST/api/v1/tenants/{id}/domainsAgregar dominio customtenant_admin
POST/api/v1/tenants/{id}/domains/{domainId}/verifyVerificar dominiotenant_admin
DELETE/api/v1/tenants/{id}/domains/{domainId}Eliminar dominiotenant_admin
GET/api/v1/domains/resolve/{hostname}Resolver hostname a tenant (interno)system

Consideraciones Multi-Region

Para tenants en diferentes regiones (data residency):

RegionDominio baseInfraestructura
Americasreimaginetech.ious-east-1
Europeeu.reimaginetech.ioeu-west-1
APACap.reimaginetech.ioap-southeast-1

El tenant se asigna a una region al momento del onboarding. Los datos nunca salen de la region configurada. Route 53 con latency-based routing dirige al cluster correcto.

Reglas

  • El alias del tenant es inmutable despues de crearse (se usa en URLs)
  • Los alias deben ser unicos globalmente
  • Formato de alias: ^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$
  • Aliases reservados: admin, api, auth, dash, docs, validate, www, app, system
  • Un tenant puede tener multiples dominios custom
  • Solo un dominio primary (generado automaticamente)
  • Los dominios custom requieren verificacion DNS antes de activarse
  • El certificado TLS se provisiona automaticamente via ACM despues de la verificacion

Reimagine Tech LLC — Documentacion Interna