<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edgardo Genini</title>
    <description>The latest articles on DEV Community by Edgardo Genini (@edgardo_genini).</description>
    <link>https://dev.to/edgardo_genini</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3928203%2F27f3b1f6-140c-4040-9fe6-9bddde21d168.png</url>
      <title>DEV Community: Edgardo Genini</title>
      <link>https://dev.to/edgardo_genini</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edgardo_genini"/>
    <language>en</language>
    <item>
      <title>[ES] Cómo organizar el árbol de APIs REST para que sobreviva al tiempo (y a los cambios de organigrama)</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Tue, 16 Jun 2026 19:29:10 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/es-como-organizar-el-arbol-de-apis-rest-para-que-sobreviva-al-tiempo-y-a-los-cambios-de-4e6g</link>
      <guid>https://dev.to/edgardo_genini/es-como-organizar-el-arbol-de-apis-rest-para-que-sobreviva-al-tiempo-y-a-los-cambios-de-4e6g</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/edgardo_genini/en-how-to-organize-a-rest-api-tree-to-survive-time-and-org-chart-changes-3p6"&gt;También disponible en inglés&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Antes de diseñar un endpoint, clasificá su naturaleza. Recién después elegí su ubicación.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema silencioso
&lt;/h2&gt;

&lt;p&gt;Existen muchos artículos que explican cómo escribir una API REST. Aquí, en cambio, nos vamos a centrar en una pregunta previa: ¿cómo decidir &lt;strong&gt;dónde debe vivir un endpoint&lt;/strong&gt; antes de escribirlo?&lt;/p&gt;

&lt;p&gt;Cuando ese criterio no existe, la ubicación de cada nuevo endpoint termina dependiendo de la intuición, del precedente o de una negociación entre desarrolladores. El resultado suele ser un árbol de APIs que funciona al principio, pero que se vuelve cada vez más difícil de navegar y mantener.&lt;/p&gt;

&lt;p&gt;Los síntomas son conocidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoints casi iguales, creados por equipos distintos.&lt;/li&gt;
&lt;li&gt;Frontends que deben ensamblar múltiples llamadas para una sola pantalla.&lt;/li&gt;
&lt;li&gt;URLs que reflejan el organigrama y no la actividad principal de la organización.&lt;/li&gt;
&lt;li&gt;Convenciones implícitas que solo conocen quienes llevan años en el proyecto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No suele haber un gran error arquitectónico. Hay cientos de pequeñas decisiones inconsistentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  La idea central
&lt;/h2&gt;

&lt;p&gt;Este artículo propone un criterio de clasificación &lt;strong&gt;previo al diseño del endpoint&lt;/strong&gt;. La idea es sencilla: antes de pensar la URL, hay que entender qué tipo de necesidad estamos resolviendo.&lt;/p&gt;

&lt;p&gt;La tesis que atraviesa todo el texto es:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Antes de diseñar un endpoint, hay que clasificar su naturaleza. Recién después decidir dónde debe vivir.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No se trata de una convención de nombres ni de una discusión más sobre REST. Se trata de un marco de decisión que puede aplicarse independientemente del estilo arquitectónico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seis clasificaciones posibles
&lt;/h2&gt;

&lt;p&gt;El framework establece seis categorías. Cada una responde a una naturaleza distinta de endpoint.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Clasificación&lt;/th&gt;
&lt;th&gt;Ubicación sugerida&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dominio Core&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/{dominio}/{recurso}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vista&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/vistas/{nombre}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integración&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/integraciones/externos/...&lt;/code&gt; y &lt;code&gt;/integraciones/webhooks/...&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Procesos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/procesos/{nombre}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuración&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/configuracion/{tabla}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sistema&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/sistema/{operacion}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Como regla general, cuando un requerimiento parece encajar en más de una clasificación, conviene priorizar la más específica y restrictiva. &lt;strong&gt;Estas seis categorías son el mecanismo mediante el cual resolvemos el problema de la falta de criterio.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dominios Core: la fuente de verdad
&lt;/h2&gt;

&lt;p&gt;Los &lt;strong&gt;Dominios Core&lt;/strong&gt; representan la fuente de verdad de la actividad principal. Contienen operaciones atómicas sobre sus entidades fundamentales. Habitualmente se corresponden con los conceptos centrales que maneja la organización: clientes, pedidos, productos, cuentas, etc.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/ventas/pedidos/{id}
POST /api/v1/ventas/pedidos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aquí las operaciones son atómicas, afectan a una sola entidad y respetan el principio de que el método HTTP define la acción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vistas: desacoplar al consumidor
&lt;/h2&gt;

&lt;p&gt;Las Vistas no existen únicamente para simplificar consultas. Su propósito más valioso es &lt;strong&gt;desacoplar al consumidor de la estructura interna de los dominios core&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Una pantalla, un reporte o un sistema externo no deberían necesitar conocer cómo están organizados internamente los dominios. Las Vistas actúan como una capa de desacople: si mañana un dominio se divide o se reorganiza, el consumidor puede seguir utilizando la misma Vista mientras el backend adapta su implementación.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/vistas/resumen-ventas-por-cliente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ese resumen puede combinar datos de pedidos, pagos y envíos. El frontend recibe exactamente lo que necesita, sin ensamblar llamadas ni conocer la estructura interna.&lt;/p&gt;

&lt;h2&gt;
  
  
  Procesos: cuando el objetivo es ejecutar, no operar sobre una entidad
&lt;/h2&gt;

&lt;p&gt;La categoría &lt;strong&gt;Procesos&lt;/strong&gt; agrupa endpoints cuya naturaleza no es operar sobre una entidad del dominio core, sino &lt;strong&gt;ejecutar una secuencia coordinada de acciones&lt;/strong&gt;. Puede tratarse de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un cierre mensual&lt;/li&gt;
&lt;li&gt;Una conciliación bancaria&lt;/li&gt;
&lt;li&gt;Una reversión o compensación de una operación compleja&lt;/li&gt;
&lt;li&gt;Un recálculo de saldos&lt;/li&gt;
&lt;li&gt;Una liquidación&lt;/li&gt;
&lt;li&gt;Una sincronización de padrones&lt;/li&gt;
&lt;li&gt;Un proceso batch pesado&lt;/li&gt;
&lt;li&gt;Cualquier otra rutina que no encaje naturalmente en un CRUD de entidad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El nombre "procesos" es intencionalmente amplio. No asume masividad ni cantidad de entidades afectadas. Solo asume que el endpoint existe para &lt;strong&gt;poner en marcha un proceso&lt;/strong&gt;, no para leer o modificar un recurso atómico.&lt;/p&gt;

&lt;p&gt;Ejemplos:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/v1/procesos/cierre-mensual
POST /api/v1/procesos/revertir-operacion/{id}
POST /api/v1/procesos/conciliacion-bancaria
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;La pregunta que define esta categoría es:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;¿El endpoint existe para operar sobre una entidad del dominio core, o para ejecutar un proceso?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si la respuesta es "proceso", su lugar es &lt;code&gt;/procesos&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un ejemplo práctico: importar clientes
&lt;/h2&gt;

&lt;p&gt;Supongamos que aparece el siguiente requerimiento:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"El sistema debe permitir importar clientes desde un archivo Excel."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sin un criterio claro, distintos equipos podrían proponer ubicaciones diferentes para el endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /clientes/importacion
POST /clientes/importar
POST /admin/importacion-clientes
POST /batch/clientes/importacion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todas las alternativas parecen razonables, pero responden a intuiciones distintas. El resultado es que, con el tiempo, el árbol de APIs termina creciendo de forma inconsistente.&lt;/p&gt;

&lt;p&gt;Aplicando el flujo de decisión de este framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;¿Interactúa con un sistema externo?&lt;/strong&gt; → No.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿Es una lectura que compone múltiples dominios?&lt;/strong&gt; → No.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿El objetivo es operar sobre una entidad del dominio core?&lt;/strong&gt; → No. No se está creando, modificando ni consultando un cliente de forma atómica. El endpoint no recibe la representación de un recurso Cliente para operarlo de forma atómica; recibe un archivo binario (Excel) que requiere parsing, validaciones de lote y una lógica de coordinación pesada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;¿El objetivo es ejecutar un proceso?&lt;/strong&gt; → Sí.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por lo tanto, la clasificación correcta es &lt;strong&gt;Procesos&lt;/strong&gt;, y una ubicación coherente sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /procesos/importacion-clientes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo importante es observar que la decisión &lt;strong&gt;no depende de la entidad involucrada&lt;/strong&gt;, sino de la &lt;strong&gt;naturaleza del endpoint&lt;/strong&gt;. Aunque el proceso trabaje sobre clientes, el endpoint existe para poner en marcha una importación, no para operar sobre el recurso &lt;code&gt;clientes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este ejemplo ilustra el objetivo principal del framework: que dos arquitectos distintos, enfrentados al mismo requerimiento, lleguen a la misma decisión siguiendo el mismo razonamiento, en lugar de depender de preferencias personales o convenciones implícitas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integraciones, Configuración y Sistema
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integraciones externas&lt;/strong&gt;: para invocar sistemas externos (cliente activo). Ejemplo: &lt;code&gt;/integraciones/externos/salesforce/contactos&lt;/code&gt;. El contrato lo define el tercero, y eso determina tanto la ubicación como la política de versionado: no es el ciclo de vida interno del sistema el que gobierna esta interfaz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: para recibir notificaciones desde sistemas externos. Ejemplo: &lt;code&gt;/integraciones/webhooks/paypal/pago-completado&lt;/code&gt;. La misma lógica aplica en sentido inverso: es el tercero quien impone la URL que debe exponerse, razón por la cual forzarlo dentro de &lt;code&gt;/api/v1/&lt;/code&gt; sería una convención vacía.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuración&lt;/strong&gt;: para tablas paramétricas o globales. Ejemplo: &lt;code&gt;/configuracion/impuestos&lt;/code&gt;. Estos datos existen como carril separado porque son transversales a varios dominios y no tienen un dueño de dominio claro; meterlos dentro de cualquier dominio core sería una decisión arbitraria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sistema&lt;/strong&gt;: para operaciones técnicas del propio API. Ejemplo: &lt;code&gt;/sistema/health&lt;/code&gt;. La regla de inclusión es la ausencia de semántica de negocio: si el endpoint tiene sentido para el negocio, no pertenece acá.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿De dónde salen los dominios? APQC y TM Forum
&lt;/h2&gt;

&lt;p&gt;Definir los dominios de alto nivel suele ser un desafío. Inventar una taxonomía propia para cada organización puede llevar a discusiones interminables y a que el árbol termine reflejando el organigrama en lugar de la actividad real.&lt;/p&gt;

&lt;p&gt;Para evitarlo, el framework se apoya en &lt;strong&gt;taxonomías maduras y ampliamente probadas&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APQC PCF&lt;/strong&gt; (Process Classification Framework): ideal para organizaciones con operaciones físicas, logística, manufactura y procesos corporativos tradicionales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TM Forum eTOM&lt;/strong&gt; (enhanced Telecom Operations Map): pensado para organizaciones de servicios digitales, telecomunicaciones, plataformas y suscripciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apoyarse en estos modelos no es un detalle secundario. Es una de las mayores fortalezas del enfoque, porque reduce discusiones de nomenclatura y hace que el árbol refleje la realidad operativa.&lt;/p&gt;

&lt;p&gt;A modo de ilustración, algunos ejemplos de cómo se traducen estas taxonomías a URLs concretas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Taxonomía&lt;/th&gt;
&lt;th&gt;Ejemplos de dominios y recursos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APQC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/finanzas/cuentas-contables&lt;/code&gt;&lt;br&gt;&lt;code&gt;/logistica/inventarios&lt;/code&gt;&lt;br&gt;&lt;code&gt;/comercial/oportunidades&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TM Forum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/cliente/abonados&lt;/code&gt;&lt;br&gt;&lt;code&gt;/operaciones/facturacion&lt;/code&gt;&lt;br&gt;&lt;code&gt;/recursos/licencias&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://dev.to/edgardo_genini/catalogo-de-arboles-de-contexto-estandares-de-referencia-20eb"&gt;En catálogo&lt;/a&gt; se encuentran los árboles de contexto detallados basados en APQC PCF y TM Forum eTOM, con una lista mucho más extensa de dominios y recursos.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Regla: APQC y TM Forum solo se utilizan para estructurar los dominios core. Las demás categorías son transversales y no siguen ninguna taxonomía de negocio, porque su naturaleza no es operar sobre entidades del dominio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flujo de decisión
&lt;/h2&gt;

&lt;p&gt;Para aplicar la clasificación en el día a día, conviene seguir un flujo de decisión práctico:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;¿Interactúa con un sistema externo?
│
├── Sí → ¿Es una llamada activa o un webhook?
│         ├── Llamada activa → /integraciones/externos/{sistema}
│         └── Webhook → /integraciones/webhooks/{origen}/{evento}
│
└── No → ¿Es una lectura que compone múltiples dominios?
         │
         ├── Sí → /vistas/{nombre}
         │
         └── No → ¿El objetivo es operar sobre una entidad del dominio core?
                  │
                  ├── Sí → /{dominio}/{recurso}
                  │
                  └── No → ¿El objetivo es ejecutar un proceso?
                           │
                           ├── Sí → /procesos/{nombre}
                           │
                           └── No → ¿Es configuración global?
                                    │
                                    ├── Sí → /configuracion/{tabla}
                                    │
                                    └── No → /sistema/{operacion}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este árbol no es un dogma. Es una herramienta práctica que ayuda a mantener consistencia cuando distintos equipos o personas diseñan nuevos endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Algunas convenciones útiles
&lt;/h2&gt;

&lt;p&gt;Más allá de la clasificación, hay buenas prácticas que conviene adoptar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usar &lt;code&gt;kebab-case&lt;/code&gt; en toda la URL (ejemplo: &lt;code&gt;procesos/cierre-mensual&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Evitar verbos en la ruta; la acción la define el método HTTP.&lt;/li&gt;
&lt;li&gt;Mantener una semántica uniforme para los identificadores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sobre el prefijo &lt;code&gt;/api&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El prefijo &lt;code&gt;/api&lt;/code&gt; se utiliza para separar los endpoints de la interfaz programática de otros recursos del servidor (archivos estáticos, páginas administrativas, etc.). No es obligatorio, pero es una práctica ampliamente extendida que permite aplicar políticas específicas (autenticación, rate limiting, logging) sobre todo el árbol de la API de forma consistente. En este artículo se asume su uso, pero cada organización puede decidir si lo incluye o no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sobre el versionado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La convención &lt;code&gt;/api/v1/&lt;/code&gt; al inicio de la URL es útil cuando todos los endpoints de una categoría comparten el mismo ciclo de vida. Esto aplica naturalmente a &lt;strong&gt;Dominios Core&lt;/strong&gt; y &lt;strong&gt;Vistas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sin embargo, otras categorías responden a contratos cuyo propietario y evolución son externos al sistema. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un webhook de PayPal o Stripe impone la URL que debe exponerse. No tiene sentido forzarlo dentro de &lt;code&gt;/api/v1/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Una integración activa con Salesforce puede necesitar su propio versionado, por ejemplo &lt;code&gt;/integraciones/externos/salesforce/v2/...&lt;/code&gt;, independiente del versionado global.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Regla general&lt;/strong&gt;: el prefijo &lt;code&gt;/api/v1/&lt;/code&gt; no debe aplicarse mecánicamente a todas las categorías. Cada clasificación puede definir su política de versionado según su naturaleza. Para integraciones y webhooks, la estrategia de versionado se deriva del contrato que gobierna esa interfaz, no necesariamente del versionado global de la API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para cerrar
&lt;/h2&gt;

&lt;p&gt;Una buena arquitectura de APIs no consiste en encontrar un lugar para cada endpoint. Consiste en tener un criterio que haga evidente cuál es ese lugar &lt;strong&gt;antes de escribirlo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cuando dos arquitectos distintos llegan a la misma decisión siguiendo el mismo razonamiento, el árbol deja de depender de la intuición y pasa a formar parte de la arquitectura del sistema. Las discusiones sobre dónde colocar un nuevo endpoint se vuelven rápidas, predecibles y fundamentadas.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este trabajo pretende ser un punto de partida. Más que establecer reglas inmutables, busca proponer un criterio de clasificación que pueda enriquecerse con la experiencia y el debate de la comunidad. Ningún framework sobrevive sin evolución, y este tampoco.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Nota final&lt;/strong&gt;: la propuesta de las seis clasificaciones y el flujo de decisión es abierta. Si tu organización encuentra que una categoría adicional o una variante funciona mejor, el principio fundamental —clasificar antes de diseñar— sigue siendo lo que realmente importa.&lt;/p&gt;

</description>
      <category>api</category>
      <category>architecture</category>
      <category>spanish</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Catálogo de Árboles de Contexto: Estándares de Referencia</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Tue, 16 Jun 2026 19:27:51 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/catalogo-de-arboles-de-contexto-estandares-de-referencia-20eb</link>
      <guid>https://dev.to/edgardo_genini/catalogo-de-arboles-de-contexto-estandares-de-referencia-20eb</guid>
      <description>&lt;p&gt;A fin de evitar deducciones en el día a día, se exponen los dos árboles oficiales basados en taxonomías internacionales para estructurar los Niveles 1 y 2 de los &lt;strong&gt;Dominios Core&lt;/strong&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  Árbol A: Taxonomía Corporativa Universal (Base APQC PCF)
&lt;/h2&gt;

&lt;p&gt;Recomendado para flujos de gestión tradicional, operaciones lineales, logística física y entornos administrativos pesados. Cubre fielmente las 13 categorías de procesos del Cross-Industry Framework de APQC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Es posible que en algunas ramas se puedan interpretar como procesos, vistas, etc, siempre es necesario ir al flujo de decisión para saber dónde corresponde, cualquiera de estas ramas podría contener un dominio core, pero también un proceso, vista, etc, en esos casos se agrega la rama en procesos, vistasm, etc para mantener cada servcio en su categoría&lt;/strong&gt;&lt;br&gt;
No se eliminan para que no dar la idea de que no está por error.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/estrategia&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 1: Develop Vision and Strategy)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/objetivos-corporativos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/planificacion-estrategica&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/indicadores-macro&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/producto&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 2: Develop and Manage Products and Services)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/productos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tarifas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/ciclo-vida&lt;/code&gt; &lt;em&gt;(Gestión de versiones, lanzamiento y retiro)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/comercial&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 3: Market and Sell Products and Services)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/prospectos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/oportunidades&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/acuerdos-comerciales&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/campanas&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/cadena-suministro&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 4: Deliver Services / Manage Supply Chain)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/ordenes-compra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/inventarios&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/depositos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/despachos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/proveedores&lt;/code&gt; &lt;em&gt;(Gestión de la relación y desempeño)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/atencion-cliente&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 5: Manage Customer Service)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/solicitudes-servicio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/devoluciones&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/satisfaccion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/capital-humano&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 6: Develop and Manage Human Capital)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/empleados&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/contratos-laborales&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/liquidaciones&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/desempeno&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/capacitacion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/tecnologia&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 7: Manage Information Technology)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/activos-ti&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/servicios-informaticos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/seguridad-informatica&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/finanzas&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 8: Manage Financial Resources)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/cuentas-corrientes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/asientos-contables&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/comprobantes-fiscales&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/flujos-caja&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/presupuestos&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/activos&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 9: Acquire, Construct, and Manage Assets)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/inmuebles&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/maquinaria-equipos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mantenimiento&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/legal-compliance&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 10: Manage Enterprise Risk, Compliance, Remediation, and Resiliency)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/auditorias-normativas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/declaraciones-juradas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/contratos-legales&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/gestion-riesgos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/continuidad-negocio&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/relaciones-externas&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 11: Manage External Relationships)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/relaciones-institucionales&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/responsabilidad-social&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/capacidades&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 12: Develop and Manage Business Capabilities)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/arquitectura-empresarial&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/gestion-proyectos&lt;/code&gt; &lt;em&gt;(PMO)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/conocimiento&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Cat. 13: Develop and Manage Knowledge, Improvement, and Change)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/gestion-cambios&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mejora-continua&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/documentacion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Árbol B: Arquitectura de Ciclo de Servicio (Ingeniería TM Forum / eTOM)
&lt;/h2&gt;

&lt;p&gt;Recomendado para modelos basados en suscripciones, activos intangibles, plataformas SaaS, aprovisionamiento automatizado e infraestructura lógica. Se enfoca exclusivamente en el núcleo distintivo de eTOM (FAB, Partes, Servicios y Recursos), evitando solapamientos con la gestión corporativa genérica del Árbol A.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/partes&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Party Management: Dominio unificado distinguiendo roles)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/clientes&lt;/code&gt; &lt;em&gt;(Entidad que contrata y paga)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usuarios&lt;/code&gt; &lt;em&gt;(Entidad que consume el servicio, ej. empleado de un cliente B2B)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/socios-comerciales&lt;/code&gt; &lt;em&gt;(Partners B2B2X)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/acuerdos-nivel-servicio&lt;/code&gt; &lt;em&gt;(SLAs contractuales vinculados a la parte)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/servicios&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Service Management: Capa intermedia entre Cliente y Recurso)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/catalogo-servicios&lt;/code&gt; &lt;em&gt;(Definición comercial y técnica de lo que se vende)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/inventario-servicios&lt;/code&gt; &lt;em&gt;(Instancias de servicios activos y asignados)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/configuraciones&lt;/code&gt; &lt;em&gt;(Parámetros específicos de cada instancia)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/realizacion&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Fulfillment: Flujo completo de entrega)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/ordenes-servicio&lt;/code&gt; &lt;em&gt;(Ciclo de vida de la orden: crear, validar, descomponer)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/calificacion&lt;/code&gt; &lt;em&gt;(Service Qualification: validar viabilidad técnica antes de vender)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/aprovisionamiento&lt;/code&gt; &lt;em&gt;(Activación lógica y despliegue de recursos)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/garantia&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Assurance: Operación y soporte proactivo/reactivo)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/incidentes&lt;/code&gt; &lt;em&gt;(Gestión de fallas reportadas)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/alarmas&lt;/code&gt; &lt;em&gt;(Eventos proactivos detectados desde la red/plataforma)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/telemetria&lt;/code&gt; &lt;em&gt;(Métricas de calidad en tiempo real)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/gestion-sla&lt;/code&gt; &lt;em&gt;(Monitoreo y penalización por incumplimiento)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/problemas&lt;/code&gt; &lt;em&gt;(Gestión de causa raíz de incidentes recurrentes)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/facturacion&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Billing / Revenue Management)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/tasacion&lt;/code&gt; &lt;em&gt;(Rating: cálculo del costo basado en el uso en tiempo real)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/ciclos-cobro&lt;/code&gt; &lt;em&gt;(Generación de facturas recurrentes)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/conciliacion&lt;/code&gt; &lt;em&gt;(Cruce de datos de uso vs. datos facturados)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/gestion-cobranza&lt;/code&gt; &lt;em&gt;(Manejo de morosidad y disputas)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/api/recursos&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Resource Management: Inventario lógico/de red, aislado de TI corporativa)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/inventario-red&lt;/code&gt; &lt;em&gt;(Topología y elementos de red lógicos/físicos)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/direcciones-ip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/licencias&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/instancias-servidor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/capacidad&lt;/code&gt; &lt;em&gt;(Gestión de umbrales y disponibilidad antes del agotamiento)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>resources</category>
      <category>spanish</category>
    </item>
    <item>
      <title>[EN] How to Organize a REST API Tree to Survive Time (and Org Chart Changes)</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Tue, 16 Jun 2026 19:25:11 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/en-how-to-organize-a-rest-api-tree-to-survive-time-and-org-chart-changes-3p6</link>
      <guid>https://dev.to/edgardo_genini/en-how-to-organize-a-rest-api-tree-to-survive-time-and-org-chart-changes-3p6</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/edgardo_genini/es-como-organizar-el-arbol-de-apis-rest-para-que-sobreviva-al-tiempo-y-a-los-cambios-de-4e6g"&gt;Also available in Spanish&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before designing an endpoint, classify its nature. Only then choose its location.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0mmdaagcp8iw5g61mia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0mmdaagcp8iw5g61mia.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Silent Problem
&lt;/h2&gt;

&lt;p&gt;There are many articles explaining how to write a REST API. Here, instead, we will focus on a prior question: how to decide &lt;strong&gt;where an endpoint should live&lt;/strong&gt; before writing it?&lt;/p&gt;

&lt;p&gt;When that criterion does not exist, the placement of each new endpoint ends up depending on intuition, precedent, or negotiation among developers. The result is usually an API tree that works at first, but becomes increasingly difficult to navigate and maintain.&lt;/p&gt;

&lt;p&gt;The symptoms are well known:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nearly identical endpoints, created by different teams.&lt;/li&gt;
&lt;li&gt;Frontends that must assemble multiple calls for a single screen.&lt;/li&gt;
&lt;li&gt;URLs that reflect the org chart rather than the organization's core activity.&lt;/li&gt;
&lt;li&gt;Implicit conventions known only to those who have been on the project for years.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is usually no grand architectural mistake. There are hundreds of small, inconsistent decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Central Idea
&lt;/h2&gt;

&lt;p&gt;This article proposes a &lt;strong&gt;pre-design classification criterion&lt;/strong&gt;. The idea is simple: before thinking about the URL, you must understand what type of need you are solving.&lt;/p&gt;

&lt;p&gt;The thesis that runs through the entire text is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before designing an endpoint, classify its nature. Only then decide where it should live.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not about naming conventions or yet another REST discussion. It is about a decision framework that can be applied regardless of architectural style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Possible Classifications
&lt;/h2&gt;

&lt;p&gt;The framework establishes six categories. Each one responds to a different endpoint nature.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Classification&lt;/th&gt;
&lt;th&gt;Suggested Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core Domain&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/{domain}/{resource}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/views/{name}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/integrations/external/...&lt;/code&gt; and &lt;code&gt;/integrations/webhooks/...&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/processes/{name}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/configuration/{table}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/system/{operation}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As a general rule, when a requirement seems to fit more than one classification, it is best to prioritize the most specific and restrictive one. &lt;strong&gt;These six categories are the mechanism through which we solve the lack-of-criterion problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Domains: The Source of Truth
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Core Domains&lt;/strong&gt; represent the source of truth for the main activity. They contain atomic operations on their fundamental entities. They usually correspond to the central concepts managed by the organization: customers, orders, products, accounts, etc.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/sales/orders/{id}
POST /api/v1/sales/orders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here the operations are atomic, affect a single entity, and respect the principle that the HTTP method defines the action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Views: Decouple the Consumer
&lt;/h2&gt;

&lt;p&gt;Views do not exist solely to simplify queries. Their most valuable purpose is to &lt;strong&gt;decouple the consumer from the internal structure of the core domains&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A screen, a report, or an external system should not need to know how the core domains are organized internally. Views act as a decoupling layer: if tomorrow a domain is split or reorganized, the consumer can continue using the same View while the backend adapts its implementation.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/v1/views/sales-summary-by-customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;That summary may combine data from orders, payments, and shipments. The frontend receives exactly what it needs, without assembling calls or knowing the internal structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Processes: When the Goal Is to Execute, Not to Operate on an Entity
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Processes&lt;/strong&gt; category groups endpoints whose nature is not to operate on a core domain entity, but to &lt;strong&gt;execute a coordinated sequence of actions&lt;/strong&gt;. This may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A month-end close&lt;/li&gt;
&lt;li&gt;A bank reconciliation&lt;/li&gt;
&lt;li&gt;A reversal or compensation of a complex operation&lt;/li&gt;
&lt;li&gt;A balance recalculation&lt;/li&gt;
&lt;li&gt;A settlement&lt;/li&gt;
&lt;li&gt;A registry synchronization&lt;/li&gt;
&lt;li&gt;A heavy batch process&lt;/li&gt;
&lt;li&gt;Any other routine that does not naturally fit into an entity CRUD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The name "processes" is intentionally broad. It does not assume massiveness or the number of entities affected. It only assumes that the endpoint exists to &lt;strong&gt;trigger a process&lt;/strong&gt;, not to read or modify an atomic resource.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/v1/processes/month-end-close
POST /api/v1/processes/reverse-operation/{id}
POST /api/v1/processes/bank-reconciliation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The question that defines this category is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does the endpoint exist to operate on a core domain entity, or to execute a process?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is "process," its place is &lt;code&gt;/processes&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example: Importing Customers
&lt;/h2&gt;

&lt;p&gt;Suppose the following requirement appears:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The system must allow importing customers from an Excel file."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without a clear criterion, different teams might propose different locations for the endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /customers/import
POST /customers/import
POST /admin/customer-import
POST /batch/customers/import
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All alternatives seem reasonable, but they respond to different intuitions. The result is that, over time, the API tree ends up growing inconsistently.&lt;/p&gt;

&lt;p&gt;Applying this framework's decision flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Does it interact with an external system?&lt;/strong&gt; → No.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it a read that composes multiple domains?&lt;/strong&gt; → No.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the goal to operate on a core domain entity?&lt;/strong&gt; → No. It is not creating, modifying, or querying a customer atomically. The endpoint does not receive a representation of a Customer resource to operate on it atomically; it receives a binary file (Excel) that requires parsing, batch validations, and heavy coordination logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the goal to execute a process?&lt;/strong&gt; → Yes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, the correct classification is &lt;strong&gt;Processes&lt;/strong&gt;, and a coherent location would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /processes/customer-import
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing to observe is that the decision &lt;strong&gt;does not depend on the entity involved&lt;/strong&gt;, but on the &lt;strong&gt;nature of the endpoint&lt;/strong&gt;. Even though the process works on customers, the endpoint exists to trigger an import, not to operate on the &lt;code&gt;customers&lt;/code&gt; resource.&lt;/p&gt;

&lt;p&gt;This example illustrates the main goal of the framework: that two different architects, faced with the same requirement, reach the same decision by following the same reasoning, instead of depending on personal preferences or implicit conventions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrations, Configuration, and System
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;External Integrations&lt;/strong&gt;: to invoke external systems (active client). Example: &lt;code&gt;/integrations/external/salesforce/contacts&lt;/code&gt;. The contract is defined by the third party, and that determines both the location and the versioning policy: it is not the system's internal lifecycle that governs this interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: to receive notifications from external systems. Example: &lt;code&gt;/integrations/webhooks/paypal/payment-completed&lt;/code&gt;. The same logic applies in reverse: it is the third party that imposes the URL that must be exposed, which is why forcing it inside &lt;code&gt;/api/v1/&lt;/code&gt; would be an empty convention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt;: for parametric or global tables. Example: &lt;code&gt;/configuration/taxes&lt;/code&gt;. These data exist as a separate lane because they are cross-cutting across multiple domains and do not have a clear domain owner; placing them inside any core domain would be an arbitrary decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System&lt;/strong&gt;: for technical operations of the API itself. Example: &lt;code&gt;/system/health&lt;/code&gt;. The inclusion rule is the absence of business semantics: if the endpoint makes sense to the business, it does not belong here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Do Domains Come From? APQC and TM Forum
&lt;/h2&gt;

&lt;p&gt;Defining high-level domains is usually a challenge. Inventing a proprietary taxonomy for each organization can lead to endless discussions and a tree that ends up reflecting the org chart rather than the actual activity.&lt;/p&gt;

&lt;p&gt;To avoid this, the framework relies on &lt;strong&gt;mature and widely tested taxonomies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APQC PCF&lt;/strong&gt; (Process Classification Framework): ideal for organizations with physical operations, logistics, manufacturing, and traditional corporate processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TM Forum eTOM&lt;/strong&gt; (enhanced Telecom Operations Map): designed for digital services organizations, telecommunications, platforms, and subscriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Relying on these models is not a secondary detail. It is one of the greatest strengths of the approach, because it reduces naming discussions and makes the tree reflect operational reality.&lt;/p&gt;

&lt;p&gt;By way of illustration, some examples of how these taxonomies translate into concrete URLs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Taxonomy&lt;/th&gt;
&lt;th&gt;Examples of Domains and Resources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APQC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/finance/chart-of-accounts&lt;/code&gt;&lt;br&gt;&lt;code&gt;/logistics/inventories&lt;/code&gt;&lt;br&gt;&lt;code&gt;/sales/opportunities&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TM Forum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/customer/subscribers&lt;/code&gt;&lt;br&gt;&lt;code&gt;/operations/billing&lt;/code&gt;&lt;br&gt;&lt;code&gt;/resources/licenses&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In the catalog &lt;a href="https://dev.to/edgardo_genini/context-tree-catalog-reference-standards-5fmj"&gt;available at&lt;/a&gt; you will find the detailed context trees based on APQC PCF and TM Forum eTOM, with a much more extensive list of domains and resources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rule: APQC and TM Forum are only used to structure the core domains. The other categories are cross-cutting and do not follow any business taxonomy, because their nature is not to operate on domain entities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision Flow
&lt;/h2&gt;

&lt;p&gt;To apply the classification in day-to-day work, it is useful to follow a practical decision flow:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does it interact with an external system?
│
├── Yes → Is it an active call or a webhook?
│         ├── Active call → /integrations/external/{system}
│         └── Webhook → /integrations/webhooks/{source}/{event}
│
└── No → Is it a read that composes multiple domains?
         │
         ├── Yes → /views/{name}
         │
         └── No → Is the goal to operate on a core domain entity?
                  │
                  ├── Yes → /{domain}/{resource}
                  │
                  └── No → Is the goal to execute a process?
                           │
                           ├── Yes → /processes/{name}
                           │
                           └── No → Is it global configuration?
                                    │
                                    ├── Yes → /configuration/{table}
                                    │
                                    └── No → /system/{operation}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This tree is not dogma. It is a practical tool that helps maintain consistency when different teams or people design new endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Useful Conventions
&lt;/h2&gt;

&lt;p&gt;Beyond classification, there are good practices worth adopting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;kebab-case&lt;/code&gt; throughout the URL (example: &lt;code&gt;processes/month-end-close&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Avoid verbs in the path; the action is defined by the HTTP method.&lt;/li&gt;
&lt;li&gt;Maintain uniform semantics for identifiers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On the &lt;code&gt;/api&lt;/code&gt; prefix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/api&lt;/code&gt; prefix is used to separate programmatic interface endpoints from other server resources (static files, admin pages, etc.). It is not mandatory, but it is a widely adopted practice that allows applying specific policies (authentication, rate limiting, logging) over the entire API tree consistently. This article assumes its use, but each organization can decide whether to include it or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Versioning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/api/v1/&lt;/code&gt; convention at the beginning of the URL is useful when all endpoints in a category share the same lifecycle. This naturally applies to &lt;strong&gt;Core Domains&lt;/strong&gt; and &lt;strong&gt;Views&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, other categories respond to contracts whose owner and evolution are external to the system. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A PayPal or Stripe webhook imposes the URL that must be exposed. It makes no sense to force it inside &lt;code&gt;/api/v1/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An active integration with Salesforce may need its own versioning, for example &lt;code&gt;/integrations/external/salesforce/v2/...&lt;/code&gt;, independent of the global versioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;General rule&lt;/strong&gt;: the &lt;code&gt;/api/v1/&lt;/code&gt; prefix should not be applied mechanically to all categories. Each classification may define its versioning policy according to its nature. For integrations and webhooks, the versioning strategy derives from the contract that governs that interface, not necessarily from the global API versioning.&lt;/p&gt;

&lt;h2&gt;
  
  
  To Close
&lt;/h2&gt;

&lt;p&gt;A good API architecture is not about finding a place for every endpoint. It is about having a criterion that makes that place obvious &lt;strong&gt;before writing it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When two different architects reach the same decision by following the same reasoning, the tree stops depending on intuition and becomes part of the system's architecture. Discussions about where to place a new endpoint become fast, predictable, and grounded.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This work is intended as a starting point. Rather than establishing immutable rules, it seeks to propose a classification criterion that can be enriched by the community's experience and debate. No framework survives without evolution, and neither will this one.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final note&lt;/strong&gt;: the proposal of the six classifications and the decision flow is open. If your organization finds that an additional category or a variant works better, the fundamental principle —classify before designing— remains what really matters.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>api</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Context Tree Catalog: Reference Standards</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Tue, 16 Jun 2026 19:19:52 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/context-tree-catalog-reference-standards-5fmj</link>
      <guid>https://dev.to/edgardo_genini/context-tree-catalog-reference-standards-5fmj</guid>
      <description>&lt;p&gt;In order to avoid deductions in day-to-day operations, the two official trees based on international taxonomies are presented to structure Levels 1 and 2 of the Core Domains.&lt;/p&gt;

&lt;p&gt;Tree A: Universal Corporate Taxonomy (APQC PCF Based)&lt;br&gt;
Recommended for traditional management flows, linear operations, physical logistics, and heavy administrative environments. It faithfully covers the 13 process categories of the APQC Cross-Industry Framework.&lt;br&gt;
It is possible that in some branches they can be interpreted as processes, views, etc.; it is always necessary to refer to the decision flow to determine where they belong. Any of these branches could contain a core domain, but also a process, view, etc. In those cases, the branch is added to processes, views, etc., to keep each service in its category.&lt;br&gt;
They are not deleted so as not to give the impression that they are missing by mistake.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/strategy&lt;/code&gt; (Cat. 1: Develop Vision and Strategy)&lt;br&gt;
&lt;code&gt;/corporate-objectives&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/strategic-planning&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/macro-indicators&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/products&lt;/code&gt; (Cat. 2: Develop and Manage Products and Services)&lt;br&gt;
&lt;code&gt;/products&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/rates&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/lifecycle&lt;/code&gt; (Version management, launch, and retirement)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/commercial&lt;/code&gt; (Cat. 3: Market and Sell Products and Services)&lt;br&gt;
&lt;code&gt;/prospects&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/opportunities&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/commercial-agreements&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/campaigns&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/supply-chain&lt;/code&gt; (Cat. 4: Deliver Services / Manage Supply Chain)&lt;br&gt;
&lt;code&gt;/purchase-orders&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/inventories&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/warehouses&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/shipments&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/suppliers&lt;/code&gt; (Supplier relationship and performance management)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/customer-service&lt;/code&gt; (Cat. 5: Manage Customer Service)&lt;br&gt;
&lt;code&gt;/service-requests&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/returns&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/satisfaction&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/human-capital&lt;/code&gt; (Cat. 6: Develop and Manage Human Capital)&lt;br&gt;
&lt;code&gt;/employees&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/employment-contracts&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/payroll&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/performance&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/training&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/technology&lt;/code&gt; (Cat. 7: Manage Information Technology)&lt;br&gt;
&lt;code&gt;/it-assets&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/it-services&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/information-security&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/finance&lt;/code&gt; (Cat. 8: Manage Financial Resources)&lt;br&gt;
&lt;code&gt;/current-accounts&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/journal-entries&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/tax-receipts&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/cash-flows&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/budgets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/assets&lt;/code&gt; (Cat. 9: Acquire, Construct, and Manage Assets)&lt;br&gt;
&lt;code&gt;/real-estate&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/machinery-and-equipment&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/maintenance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/legal-compliance&lt;/code&gt; (Cat. 10: Manage Enterprise Risk, Compliance, Remediation, and Resiliency)&lt;br&gt;
&lt;code&gt;/regulatory-audits&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/sworn-declarations&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/legal-contracts&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/risk-management&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/business-continuity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/external-relations&lt;/code&gt; (Cat. 11: Manage External Relationships)&lt;br&gt;
&lt;code&gt;/institutional-relations&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/social-responsibility&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/capabilities&lt;/code&gt; (Cat. 12: Develop and Manage Business Capabilities)&lt;br&gt;
&lt;code&gt;/enterprise-architecture&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/project-management&lt;/code&gt; (PMO)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/knowledge&lt;/code&gt; (Cat. 13: Develop and Manage Knowledge, Improvement, and Change)&lt;br&gt;
&lt;code&gt;/change-management&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/continuous-improvement&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/documentation&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tree B: Service Lifecycle Architecture (TM Forum / eTOM Engineering)&lt;br&gt;
Recommended for subscription-based models, intangible assets, SaaS platforms, automated provisioning, and logical infrastructure. It focuses exclusively on the distinctive core of eTOM (FAB, Party, Service, and Resource), avoiding overlaps with the generic corporate management of Tree A.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/parties&lt;/code&gt; (Party Management: Unified domain distinguishing roles)&lt;br&gt;
&lt;code&gt;/customers&lt;/code&gt; (Entity that contracts and pays)&lt;br&gt;
&lt;code&gt;/users&lt;/code&gt; (Entity that consumes the service, e.g., employee of a B2B customer)&lt;br&gt;
&lt;code&gt;/partners&lt;/code&gt; (B2B2X Partners)&lt;br&gt;
&lt;code&gt;/slas&lt;/code&gt; (Contractual SLAs linked to the party)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/services&lt;/code&gt; (Service Management: Intermediate layer between Customer and Resource)&lt;br&gt;
&lt;code&gt;/service-catalog&lt;/code&gt; (Commercial and technical definition of what is sold)&lt;br&gt;
&lt;code&gt;/service-inventory&lt;/code&gt; (Active and assigned service instances)&lt;br&gt;
&lt;code&gt;/configurations&lt;/code&gt; (Specific parameters for each instance)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/fulfillment&lt;/code&gt; (Fulfillment: Complete delivery flow)&lt;br&gt;
&lt;code&gt;/service-orders&lt;/code&gt; (Order lifecycle: create, validate, decompose)&lt;br&gt;
&lt;code&gt;/qualification&lt;/code&gt; (Service Qualification: validate technical feasibility before selling)&lt;br&gt;
&lt;code&gt;/provisioning&lt;/code&gt; (Logical activation and resource deployment)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/assurance&lt;/code&gt; (Assurance: Proactive/reactive operation and support)&lt;br&gt;
&lt;code&gt;/incidents&lt;/code&gt; (Reported fault management)&lt;br&gt;
&lt;code&gt;/alarms&lt;/code&gt; (Proactive events detected from the network/platform)&lt;br&gt;
&lt;code&gt;/telemetry&lt;/code&gt; (Real-time quality metrics)&lt;br&gt;
&lt;code&gt;/sla-management&lt;/code&gt; (Monitoring and penalty for non-compliance)&lt;br&gt;
&lt;code&gt;/problems&lt;/code&gt; (Root cause management of recurring incidents)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/billing&lt;/code&gt; (Billing / Revenue Management)&lt;br&gt;
&lt;code&gt;/rating&lt;/code&gt; (Rating: calculation of cost based on real-time usage)&lt;br&gt;
&lt;code&gt;/billing-cycles&lt;/code&gt; (Generation of recurring invoices)&lt;br&gt;
&lt;code&gt;/reconciliation&lt;/code&gt; (Cross-check of usage data vs. billed data)&lt;br&gt;
&lt;code&gt;/collections&lt;/code&gt; (Handling of delinquency and disputes)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/api/resources&lt;/code&gt; (Resource Management: Logical/network inventory, isolated from corporate IT)&lt;br&gt;
&lt;code&gt;/network-inventory&lt;/code&gt; (Logical/physical network topology and elements)&lt;br&gt;
&lt;code&gt;/ip-addresses&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/licenses&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/server-instances&lt;/code&gt;&lt;br&gt;
&lt;code&gt;/capacity&lt;/code&gt; (Threshold and availability management before exhaustion)&lt;/p&gt;

</description>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[EN] Delegated Resource Identifier (DRI): a pattern for persistent references in microservices</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Wed, 13 May 2026 01:39:17 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/en-delegated-resource-identifier-dri-a-pattern-for-persistent-references-in-microservices-2o52</link>
      <guid>https://dev.to/edgardo_genini/en-delegated-resource-identifier-dri-a-pattern-for-persistent-references-in-microservices-2o52</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/edgardo_genini/es-delegated-resource-identifier-dri-un-patron-para-referencias-persistentes-en-microservicios-big"&gt;Also available in Spanish&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever stored a URL in a database and later regretted it, this is for you.&lt;/p&gt;

&lt;p&gt;It's a familiar scenario: a service needs to keep a reference to a resource that lives in another service. The obvious solution is to store the URL. It works — until the host changes, the API gets a new version, or the team decides to restructure the paths. Suddenly all the stored references are broken, and tracking down the impact becomes a bigger problem than it should be.&lt;/p&gt;

&lt;p&gt;The root issue is that a URL mixes two different things: &lt;em&gt;what&lt;/em&gt; the resource is and &lt;em&gt;where&lt;/em&gt; it lives. When you store a URL, you're betting that location won't change. In systems that evolve, that's usually a losing bet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;What if instead of storing where the resource lives, you store your own identifier that a gateway knows how to resolve?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commerce:orders/order:id=ARG-2024-00091872
finance:accounts/customer:status:id=109234
health:coverage/credential:patient-id=12345678
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whoever stores the reference doesn't need to know where the resource lives or how to access it. That's the gateway's responsibility. If the API changes, if the service migrates, if a new system appears: only the resolver changes. The stored references remain valid.&lt;/p&gt;

&lt;p&gt;I called this scheme &lt;strong&gt;Delegated Resource Identifier (DRI)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this pattern is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's not a standard&lt;/li&gt;
&lt;li&gt;It requires a gateway as intermediary: it doesn't apply when the client needs to access the resource directly without going through any intermediary&lt;/li&gt;
&lt;li&gt;It doesn't impose a context taxonomy: each team defines their own&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a useful convention when you need persistent references to resources in a controlled ecosystem and want to centralize the resolution logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;The identifier has two parts separated by &lt;code&gt;/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;context&amp;gt;/&amp;lt;resource&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; (left side): identifies the domain that knows how to resolve this type of resource. The gateway uses it for routing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt; (right side): identifies the concrete resource. Its structure is defined by whoever implements the resolver.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commerce:orders/order:id=ARG-2024-00091872
└─── routing ───┘└─── concrete resource ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;:&lt;/code&gt; separates hierarchical levels. &lt;code&gt;=&lt;/code&gt; assigns values. Each side defines its own internal convention.&lt;/p&gt;

&lt;p&gt;The identifier is built by whoever stores the reference, from the data they already have and the context they know. No external call required. A billing service that receives an order ID knows it belongs to &lt;code&gt;commerce:orders&lt;/code&gt; and builds the DRI when persisting the reference.&lt;/p&gt;

&lt;p&gt;The context can be omitted if the gateway has a default resolver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/order:id=ARG-2024-00091872
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Some use cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  E-commerce: retrieving an order
&lt;/h3&gt;

&lt;p&gt;A customer service system stores references to orders that can come from different channels: own store, marketplace, mobile app. Each channel has its own API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commerce:orders/order:id=ARG-2024-00091872
commerce:orders/order:id=MKT-2024-00034521
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;commerce:orders&lt;/code&gt; resolver determines which channel each order belongs to based on the ID prefix and routes to the corresponding API. The identifier remains stable even if the channel's API changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fintech: customer account status
&lt;/h3&gt;

&lt;p&gt;A bank with legacy and modern systems running side by side. The resolver determines which system the customer lives in based on the ID value: customers with &lt;code&gt;id &amp;lt; 50000&lt;/code&gt; are in the legacy system, the rest in the modern one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finance:accounts/customer:status:id=109234
finance:accounts/customer:status:id=002871
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resolver also encapsulates the decision of which API version to use. And here something interesting emerges: the DRI has two moments in its lifecycle. When persisted, it's just the identifier. When used for a query, it can be enriched with additional context using the same syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finance:accounts/customer:status:id=109234:date=20260101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resolver can use that date to determine which API version applies. The persisted DRI doesn't change; the additional context is added at query time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Health: member coverage credential
&lt;/h3&gt;

&lt;p&gt;A member's coverage can change over time: provider migration, gaps in coverage, or coverage with more than one provider. Storing the provider as a fixed value would produce outdated references.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;health:coverage/credential:patient-id=12345678
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resolver applies a fallback strategy: it queries the first available provider and if the credential isn't found, tries the next one. The DRI resolves at query time, always reflecting the current state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multinational with tenant: supplier by legal entity
&lt;/h3&gt;

&lt;p&gt;A SaaS platform used by a company operating in multiple countries. Each country has its own supplier management system, its own API, and its own tax identifier format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tenant:acme:ar/supplier:cuit=20123456789
tenant:acme:cl/supplier:rut=76354921-5
tenant:acme:mx/supplier:rfc=XYZ123456789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The left side combines tenant and legal entity by country. The right side respects the local convention without the gateway knowing anything about it. Adding a new subsidiary or tenant means registering an additional resolver, without touching existing references. The context hierarchy grows naturally with the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the gateway works
&lt;/h2&gt;

&lt;p&gt;The resolution flow is simple: the gateway receives the identifier, extracts the context, and delegates to the corresponding resolver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client  →  gateway  →  resolver(commerce:orders)  →  actual service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Receives the identifier&lt;/li&gt;
&lt;li&gt;Extracts the context (left side)&lt;/li&gt;
&lt;li&gt;Delegates to the registered resolver for that context&lt;/li&gt;
&lt;li&gt;The resolver fetches the resource and returns the response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gateway has no knowledge of concrete resources. As an orientative reference, a possible Java implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"commerce:orders"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;   &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"finance:accounts"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AccountResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"health:coverage"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;   &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CoverageResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ResourceResolver&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResourceIdentifier&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Optional preferences
&lt;/h2&gt;

&lt;p&gt;The identifier supports expressing preferences about how the resource should be resolved, with a syntax inspired by HTTP's &lt;code&gt;Accept&lt;/code&gt; header. For example, when querying available payment methods, you can indicate a preference for debit over credit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payments:methods/available:customer:id=109234;debit,q=0.9;credit,q=0.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The meaning of &lt;code&gt;q&lt;/code&gt; is defined by the contract between whoever builds the reference and whoever resolves it. The gateway doesn't need to interpret it. This capability is completely optional.&lt;/p&gt;




&lt;p&gt;I implemented this in Java and found it useful in practice. If you try it in your own context or have ideas to improve it, I'd love to read them in the comments.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>design</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[ES] Delegated Resource Identifier (DRI): un patrón para referencias persistentes en microservicios</title>
      <dc:creator>Edgardo Genini</dc:creator>
      <pubDate>Wed, 13 May 2026 01:36:45 +0000</pubDate>
      <link>https://dev.to/edgardo_genini/es-delegated-resource-identifier-dri-un-patron-para-referencias-persistentes-en-microservicios-big</link>
      <guid>https://dev.to/edgardo_genini/es-delegated-resource-identifier-dri-un-patron-para-referencias-persistentes-en-microservicios-big</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/edgardo_genini/en-delegated-resource-identifier-dri-a-pattern-for-persistent-references-in-microservices-2o52"&gt;También disponible en Inglés&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si alguna vez guardaste una URL en una base de datos y después te arrepentiste, esto es para vos.&lt;/p&gt;

&lt;p&gt;Es un escenario conocido: un servicio necesita mantener una referencia a un recurso que vive en otro servicio. La solución más obvia es guardar la URL. Funciona, hasta que el host cambia, la API sube de versión, o el equipo decide reestructurar los paths. De repente todas las referencias guardadas están rotas, y rastrear el impacto se convierte en un problema mayor de lo que debería ser.&lt;/p&gt;

&lt;p&gt;El problema de fondo es que una URL mezcla dos cosas distintas: &lt;em&gt;qué es&lt;/em&gt; el recurso y &lt;em&gt;dónde está&lt;/em&gt;. Cuando guardás una URL estás apostando a que esa ubicación no va a cambiar. En sistemas que evolucionan, esa apuesta suele perderse.&lt;/p&gt;

&lt;h2&gt;
  
  
  La idea
&lt;/h2&gt;

&lt;p&gt;¿Qué pasaría si en lugar de guardar dónde está el recurso, guardás un identificador propio que un gateway sabe cómo resolver?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;comercio:pedidos/orden:id=ARG-2024-00091872
finanzas:cuentas/cliente:estado:id=109234
salud:cobertura/credencial:patient-id=12345678
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quien guarda la referencia no necesita saber dónde vive el recurso ni cómo se accede. Esa responsabilidad la tiene el gateway. Si la API cambia, si el servicio migra, si aparece un sistema nuevo: solo cambia el resolver. Las referencias guardadas siguen siendo válidas.&lt;/p&gt;

&lt;p&gt;A este esquema lo llamé &lt;strong&gt;Delegated Resource Identifier (DRI)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que este patrón no es
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No es un estándar&lt;/li&gt;
&lt;li&gt;Requiere un gateway como intermediario: no aplica cuando el cliente necesita acceder directamente al recurso sin pasar por ningún intermediario&lt;/li&gt;
&lt;li&gt;No impone una taxonomía de contextos: cada equipo define la suya&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es una convención útil cuando necesitás referencias persistentes a recursos en un ecosistema controlado, y querés centralizar la lógica de resolución.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se construye
&lt;/h2&gt;

&lt;p&gt;El identificador tiene dos partes separadas por &lt;code&gt;/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;contexto&amp;gt;/&amp;lt;recurso&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contexto&lt;/strong&gt; (lado izquierdo): identifica el dominio que sabe resolver este tipo de recurso. El gateway lo usa para rutear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurso&lt;/strong&gt; (lado derecho): identifica el recurso concreto. Su estructura la define quien implementa el resolver.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;comercio:pedidos/orden:id=ARG-2024-00091872
└─── ruteo ──────┘└─── recurso concreto ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los &lt;code&gt;:&lt;/code&gt; separan niveles jerárquicos. El &lt;code&gt;=&lt;/code&gt; asigna valores. Cada lado define su propia convención interna.&lt;/p&gt;

&lt;p&gt;El identificador lo construye quien guarda la referencia, a partir del dato que ya tiene y el contexto que conoce. No requiere ninguna llamada externa. Un servicio de facturación que recibe el ID de una orden sabe que pertenece a &lt;code&gt;comercio:pedidos&lt;/code&gt; y construye el DRI al momento de persistir la referencia.&lt;/p&gt;

&lt;p&gt;El contexto puede omitirse si el gateway tiene un resolver por defecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/orden:id=ARG-2024-00091872
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Algunos casos de uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  E-commerce: recuperar una orden
&lt;/h3&gt;

&lt;p&gt;Un servicio de atención al cliente guarda referencias a órdenes que pueden venir de distintos canales: tienda propia, marketplace, app móvil. Cada canal tiene su propia API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;comercio:pedidos/orden:id=ARG-2024-00091872
comercio:pedidos/orden:id=MKT-2024-00034521
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resolver de &lt;code&gt;comercio:pedidos&lt;/code&gt; determina a qué canal pertenece cada orden a partir del prefijo del ID y rutea hacia la API correspondiente. El identificador es estable aunque la API del canal cambie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fintech: estado de cuenta de un cliente
&lt;/h3&gt;

&lt;p&gt;Un banco con sistemas legacy y modernos conviviendo. El resolver determina en qué sistema vive el cliente según el valor del ID: clientes con &lt;code&gt;id &amp;lt; 50000&lt;/code&gt; en el sistema legacy, el resto en el moderno.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finanzas:cuentas/cliente:estado:id=109234
finanzas:cuentas/cliente:estado:id=002871
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resolver encapsula también la decisión de qué versión de la API usar. Y acá aparece algo interesante: el DRI tiene dos momentos de vida. Cuando se persiste es solo el identificador. Cuando se usa para consultar, puede enriquecerse con contexto adicional usando la misma sintaxis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finanzas:cuentas/cliente:estado:id=109234:fecha=20260101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resolver puede usar esa fecha para determinar qué versión de la API corresponde. El DRI persistido no cambia; el contexto adicional se agrega en el momento de la consulta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Salud: credencial de cobertura de un afiliado
&lt;/h3&gt;

&lt;p&gt;La cobertura de un afiliado puede cambiar en el tiempo: migración de proveedor, períodos sin cobertura, cobertura en más de uno. Guardar el proveedor como dato fijo generaría referencias desactualizadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;salud:cobertura/credencial:patient-id=12345678
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resolver aplica una estrategia de fallback: consulta al primer proveedor disponible y si no encuentra la credencial prueba con el siguiente. El DRI resuelve en el momento de la consulta, reflejando siempre el estado actual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multinacional con tenant: proveedor por entidad legal
&lt;/h3&gt;

&lt;p&gt;Una plataforma SaaS con operaciones en múltiples países. Cada país tiene su propio sistema, su propia API y su propio formato de identificador fiscal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tenant:acme:ar/proveedor:cuit=20123456789
tenant:acme:cl/proveedor:rut=76354921-5
tenant:acme:mx/proveedor:rfc=XYZ123456789
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El lado izquierdo combina tenant y entidad legal por país. El lado derecho respeta la convención local. Agregar una nueva filial o un nuevo tenant es registrar un resolver adicional, sin tocar las referencias existentes. La jerarquía del contexto crece naturalmente con el sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona el gateway
&lt;/h2&gt;

&lt;p&gt;El flujo de resolución es simple: el gateway recibe el identificador, extrae el contexto y delega al resolver correspondiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cliente  →  gateway  →  resolver(comercio:pedidos)  →  servicio real
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Recibe el identificador&lt;/li&gt;
&lt;li&gt;Extrae el contexto (lado izquierdo)&lt;/li&gt;
&lt;li&gt;Delega al resolver registrado para ese contexto&lt;/li&gt;
&lt;li&gt;El resolver obtiene el recurso y devuelve la respuesta&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El gateway no conoce recursos concretos. A modo de referencia orientativa, una posible implementación en Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"comercio:pedidos"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"finanzas:cuentas"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AccountResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"salud:cobertura"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CoverageResolver&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ResourceResolver&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResourceIdentifier&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Preferencias opcionales
&lt;/h2&gt;

&lt;p&gt;El identificador admite expresar preferencias sobre cómo debe resolverse el recurso, con una sintaxis inspirada en el header &lt;code&gt;Accept&lt;/code&gt; de HTTP. Por ejemplo, al consultar medios de pago se puede indicar preferencia por débito sobre crédito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pagos:medios/disponibles:cliente:id=109234;debito,q=0.9;credito,q=0.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El significado de &lt;code&gt;q&lt;/code&gt; lo define el contrato entre quien construye la referencia y quien la resuelve. El gateway no necesita interpretarlo. Esta capacidad es completamente opcional.&lt;/p&gt;




&lt;p&gt;Lo implementé en Java y me resultó útil en la práctica. Si lo probás en tu contexto o tenés ideas para mejorarlo, me interesa leerlo en los comentarios.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>design</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
