{
  "openapi": "3.0.3",
  "info": {
    "title": "PanDaaS",
    "version": "3.3.0",
    "description": "Data as a Service. Catálogos argentinos limpios, versionados y servidos por HTTP: marcas y modelos de vehículos, y los nomencladores de ARCA que necesita un sistema de facturación.",
    "contact": {
      "name": "Tempesta Ingeniería",
      "url": "https://pandaas.com.ar"
    }
  },
  "servers": [
    {
      "url": "https://api.pandaas.com.ar"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerToken": {
        "type": "http",
        "scheme": "bearer",
        "description": "Token de 32 caracteres hexadecimales. Se obtiene en admin.pandaas.com.ar."
      }
    },
    "schemas": {
      "autenticacionDoc": {
        "type": "object",
        "description": null,
        "properties": {
          "tipo": {
            "type": "string",
            "nullable": true
          },
          "encabezado": {
            "type": "string",
            "nullable": true
          },
          "formato": {
            "type": "string",
            "nullable": true
          },
          "dondeObtenerlo": {
            "type": "string",
            "nullable": true
          },
          "siFalta": {
            "type": "string",
            "nullable": true
          },
          "siSePasaDelCupo": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "catalogoApi": {
        "type": "object",
        "description": "El catálogo que sirve /help.\n\nNo hay una lista de endpoints escrita a mano en ningún lado: esto recorre las rutas que Web API tiene registradas de verdad y les pega encima los comentarios /// del código. Un controller nuevo aparece en la documentación por el solo hecho de existir, y un endpoint que se borra desaparece. Es la única forma de que la documentación de un producto que se vende como API no se atrase.",
        "properties": {
          "producto": {
            "type": "string",
            "nullable": true
          },
          "version": {
            "type": "string",
            "nullable": true
          },
          "descripcion": {
            "type": "string",
            "nullable": true
          },
          "baseUrl": {
            "type": "string",
            "nullable": true
          },
          "autenticacion": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AutenticacionDoc"
              }
            ],
            "description": null,
            "nullable": true
          },
          "datasets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GrupoDoc"
            },
            "nullable": true
          },
          "modelos": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "errores": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ErrorDoc"
            },
            "nullable": true
          },
          "todosLosEndpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EndpointDoc"
            },
            "description": "Todos los endpoints en una sola lista, sin agrupar. Es una comodidad para el código que consume el catálogo dentro de la aplicación, no parte de la respuesta: serializarla repetiría entero el contenido de Datasets y duplicaría el tamaño de /help.",
            "nullable": true
          }
        }
      },
      "city": {
        "type": "object",
        "description": "Localidad, con la provincia a la que pertenece embebida.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Identificador estable de la localidad."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la localidad.",
            "nullable": true
          },
          "province": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Province"
              }
            ],
            "description": "Provincia a la que pertenece. Nunca es null.",
            "nullable": true
          }
        }
      },
      "concept": {
        "type": "object",
        "description": "Concepto del comprobante: si lo que se factura son productos, servicios o ambos. Va en el campo Concepto, y determina si ARCA exige las fechas de servicio.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial del concepto."
          },
          "name": {
            "type": "string",
            "description": "Denominación.",
            "nullable": true
          }
        }
      },
      "country": {
        "type": "object",
        "description": "País, del nomenclador de ARCA. Se usa en los comprobantes de exportación.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial del país."
          },
          "name": {
            "type": "string",
            "description": "Nombre del país.",
            "nullable": true
          }
        }
      },
      "currency": {
        "type": "object",
        "description": "Moneda del comprobante. El va en el campo MonId.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Código de ARCA: \"PES\" para pesos, \"DOL\" para dólar estadounidense.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Denominación de la moneda.",
            "nullable": true
          }
        }
      },
      "endpointDoc": {
        "type": "object",
        "description": null,
        "properties": {
          "metodo": {
            "type": "string",
            "nullable": true
          },
          "ruta": {
            "type": "string",
            "nullable": true
          },
          "descripcion": {
            "type": "string",
            "nullable": true
          },
          "requiereToken": {
            "type": "boolean"
          },
          "devuelve": {
            "type": "string",
            "nullable": true
          },
          "parametros": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParametroDoc"
            },
            "nullable": true
          },
          "ejemplo": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "errorDoc": {
        "type": "object",
        "description": null,
        "properties": {
          "codigo": {
            "type": "integer",
            "format": "int32"
          },
          "significado": {
            "type": "string",
            "nullable": true
          },
          "queHacer": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "grupoDoc": {
        "type": "object",
        "description": null,
        "properties": {
          "nombre": {
            "type": "string",
            "nullable": true
          },
          "descripcion": {
            "type": "string",
            "nullable": true
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EndpointDoc"
            },
            "nullable": true
          }
        }
      },
      "identityDocumentType": {
        "type": "object",
        "description": "Tipo de documento de identidad del nomenclador de ARCA (CUIT, CUIL, DNI, pasaporte, etc.). El es el código oficial que viaja en el campo DocTipo de la facturación electrónica.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial de ARCA (DocTipo)."
          },
          "name": {
            "type": "string",
            "description": "Denominación del tipo de documento.",
            "nullable": true
          }
        }
      },
      "invoiceType": {
        "type": "object",
        "description": "Tipo de comprobante del nomenclador de ARCA (ex AFIP): factura, nota de crédito, recibo, etc. El es el código oficial que viaja en el campo CbteTipo de los web services de facturación electrónica.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial de ARCA (CbteTipo)."
          },
          "name": {
            "type": "string",
            "description": "Denominación completa, por ejemplo \"NOTAS DE CREDITO A\".",
            "nullable": true
          },
          "abreviation": {
            "type": "string",
            "description": "Abreviatura de uso corriente (\"NC A\"), o null si no tiene.",
            "nullable": true
          },
          "letter": {
            "type": "string",
            "description": "Letra del comprobante (A, B, C, M, E, R), o null si su denominación oficial no nombra ninguna.",
            "nullable": true
          },
          "wsfeEnabled": {
            "type": "boolean",
            "description": "true si se puede emitir por el web service de facturación electrónica. La tabla es el nomenclador completo de ARCA e incluye comprobantes en papel y de regímenes especiales: de los 96, 36 son electrónicos."
          }
        }
      },
      "invoiceTypeRule": {
        "type": "object",
        "description": "Una combinación válida emisor / receptor / tipo de comprobante.\n\nEs la regla que responde la pregunta que se hace cualquier sistema de facturación antes de emitir: \"siendo yo responsable inscripto y mi cliente consumidor final, ¿qué comprobantes puedo emitirle?\".",
        "properties": {
          "emitter": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ResponsableType"
              }
            ],
            "description": "Condición frente al IVA de quien emite.",
            "nullable": true
          },
          "reciever": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ResponsableType"
              }
            ],
            "description": "Condición frente al IVA de quien recibe.",
            "nullable": true
          },
          "invoiceType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/InvoiceType"
              }
            ],
            "description": "Comprobante habilitado para esa combinación.",
            "nullable": true
          }
        }
      },
      "ivaRate": {
        "type": "object",
        "description": "Alícuota de IVA. El es el código que viaja en el campo Id de cada ítem del array Iva de la facturación electrónica.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial de la alícuota."
          },
          "name": {
            "type": "string",
            "description": "Como la nombra ARCA: \"21%\", \"10.5%\".",
            "nullable": true
          },
          "percent": {
            "type": "number",
            "description": "El mismo valor como número, para calcular sin parsear el nombre.",
            "nullable": true
          }
        }
      },
      "make": {
        "type": "object",
        "description": "Marca de vehículo.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Identificador estable de la marca."
          },
          "name": {
            "type": "string",
            "description": "Nombre comercial, tal como lo usa la terminal.",
            "nullable": true
          },
          "isProvisional": {
            "type": "boolean",
            "description": "true cuando la ficha se cargó de forma provisional y todavía no pasó por la revisión editorial. Por defecto la API no las devuelve."
          },
          "logoUrl": {
            "type": "string",
            "description": "URL absoluta del logo, o null si la marca no tiene logo cargado.",
            "nullable": true
          }
        }
      },
      "model": {
        "type": "object",
        "description": "Modelo de vehículo, con su marca y su segmento embebidos.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Identificador estable del modelo."
          },
          "name": {
            "type": "string",
            "description": "Denominación del modelo, sin la marca adelante.",
            "nullable": true
          },
          "make": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Make"
              }
            ],
            "description": "Marca a la que pertenece. Nunca es null.",
            "nullable": true
          },
          "segment": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Segment"
              }
            ],
            "description": "Segmento asignado, o null si todavía no se clasificó.",
            "nullable": true
          },
          "isProvisional": {
            "type": "boolean",
            "description": "true si la ficha está pendiente de revisión editorial."
          }
        }
      },
      "parametroDoc": {
        "type": "object",
        "description": null,
        "properties": {
          "nombre": {
            "type": "string",
            "nullable": true
          },
          "en": {
            "type": "string",
            "nullable": true
          },
          "tipo": {
            "type": "string",
            "nullable": true
          },
          "requerido": {
            "type": "boolean"
          },
          "porDefecto": {
            "type": "string",
            "nullable": true
          },
          "descripcion": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "province": {
        "type": "object",
        "description": "Provincia argentina.\n\nAtención: el es el código propio de PanDaaS, no el del nomenclador de ARCA. El esquema es 1 = Buenos Aires (interior), 2 = Gran Buenos Aires, 3 = Capital Federal y de 4 en adelante el resto en orden alfabético. Es el corte que usan los operadores logísticos argentinos, y es el que referencian las localidades de esta misma base. Para cruzar con otros sistemas, usá .",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código de provincia de PanDaaS (1 a 25)."
          },
          "name": {
            "type": "string",
            "description": "Nombre de la provincia.",
            "nullable": true
          },
          "isoCode": {
            "type": "string",
            "description": "Código ISO 3166-2:AR (\"AR-X\" para Córdoba, \"AR-C\" para la Ciudad de Buenos Aires). Es el identificador estándar para cruzar con mapas, operadores logísticos y cualquier sistema fuera de PanDaaS. Interior de Buenos Aires y Gran Buenos Aires comparten \"AR-B\": para ISO son la misma provincia.",
            "nullable": true
          }
        }
      },
      "responsableType": {
        "type": "object",
        "description": "Condición del contribuyente frente al IVA: responsable inscripto, monotributista, consumidor final, exento, etc.\n\nEl de las condiciones vigentes es el código oficial que ARCA espera en el campo CondicionIVAReceptorId de la facturación electrónica (tabla FEParamGetCondicionIvaReceptor). Desde el 01/12/2026 la RG 5.616 lo hace obligatorio y ARCA rechaza el comprobante que informa un código inexistente o incompatible con la letra.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código de la condición. En las vigentes, es el código de ARCA."
          },
          "name": {
            "type": "string",
            "description": "Denominación, tal como figura en la tabla de ARCA.",
            "nullable": true
          },
          "isCurrent": {
            "type": "boolean",
            "description": "true si ARCA acepta hoy este código en CondicionIVAReceptorId. Las no vigentes son figuras derogadas —\"IVA Responsable no Inscripto\", \"Pequeño Contribuyente Eventual\"— que se conservan porque pueden estar guardadas en sistemas viejos, pero no se pueden informar."
          },
          "currentEquivalentId": {
            "type": "integer",
            "format": "int32",
            "description": "Para una condición derogada, la vigente que la reemplaza; null en las vigentes. Las equivalencias son razonables pero no idénticas: ante un caso real conviene revisar al contribuyente, no confiar a ciegas en el reemplazo.",
            "nullable": true
          }
        }
      },
      "segment": {
        "type": "object",
        "description": "Segmento de mercado de un modelo (hatchback, SUV, pick-up, etc.).",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Identificador estable del segmento."
          },
          "name": {
            "type": "string",
            "description": "Nombre del segmento.",
            "nullable": true
          }
        }
      },
      "taxType": {
        "type": "object",
        "description": "Tipo de tributo que puede sumarse a un comprobante: percepciones, impuestos provinciales, ingresos brutos.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código oficial del tributo."
          },
          "name": {
            "type": "string",
            "description": "Denominación.",
            "nullable": true
          }
        }
      }
    }
  },
  "paths": {
    "/autobase/makes": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Lista las marcas ordenadas por nombre.",
        "description": "Lista las marcas ordenadas por nombre.",
        "operationId": "getAutobaseMakes",
        "parameters": [
          {
            "name": "onlyValidated",
            "in": "query",
            "required": false,
            "description": "Dejalo en true para recibir solo las marcas revisadas. En false vienen también las provisionales, que son fichas cargadas automáticamente y todavía sin revisión editorial.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Make"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/makes/{id}": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Devuelve una marca por su identificador.",
        "description": "Devuelve una marca por su identificador.",
        "operationId": "getAutobaseMakesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador de la marca.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Make"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/makes/{id}/models": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Modelos de una marca. Es un atajo de /autobase/models?makeId={id}, para no tener que armar la query desde el cliente.",
        "description": "Modelos de una marca. Es un atajo de /autobase/models?makeId={id}, para no tener que armar la query desde el cliente.",
        "operationId": "getAutobaseMakesByIdModels",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador de la marca.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "onlyValidated",
            "in": "query",
            "required": false,
            "description": "Excluye los modelos pendientes de revisión.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Model"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/models": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Lista modelos. Sin filtros devuelve el catálogo completo, que son más de 6.600 fichas: para un combo encadenado conviene filtrar siempre por marca.",
        "description": "Lista modelos. Sin filtros devuelve el catálogo completo, que son más de 6.600 fichas: para un combo encadenado conviene filtrar siempre por marca.",
        "operationId": "getAutobaseModels",
        "parameters": [
          {
            "name": "makeId",
            "in": "query",
            "required": false,
            "description": "Restringe a una marca.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "segmentId",
            "in": "query",
            "required": false,
            "description": "Restringe a un segmento.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "onlyValidated",
            "in": "query",
            "required": false,
            "description": "Excluye los modelos pendientes de revisión.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Model"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/models/{id}": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Devuelve un modelo por su identificador.",
        "description": "Devuelve un modelo por su identificador.\n\nLos Ids no se rompen. Si el que pedís correspondía a un modelo duplicado que se fusionó con otro, recibís el modelo que quedó, con su propio Id: si el id de la respuesta no es el que pediste, guardá el nuevo.",
        "operationId": "getAutobaseModelsById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador del modelo.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Model"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/segments": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Lista todos los segmentos.",
        "description": "Lista todos los segmentos.",
        "operationId": "getAutobaseSegments",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Segment"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/autobase/segments/{id}": {
      "get": {
        "tags": [
          "AutoBase"
        ],
        "summary": "Devuelve un segmento por su identificador.",
        "description": "Devuelve un segmento por su identificador.",
        "operationId": "getAutobaseSegmentsById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador del segmento.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Segment"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/cities": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista localidades. Sin filtros son 2.372 filas: para un autocompletado usá search, y para un combo encadenado, provinceId.",
        "description": "Lista localidades. Sin filtros son 2.372 filas: para un autocompletado usá search, y para un combo encadenado, provinceId.",
        "operationId": "getArcabaseCities",
        "parameters": [
          {
            "name": "provinceId",
            "in": "query",
            "required": false,
            "description": "Restringe a una provincia.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Devuelve solo las localidades cuyo nombre empieza con este texto. No distingue mayúsculas ni acentos.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/City"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/cities/{id}": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Devuelve una localidad por su identificador.",
        "description": "Devuelve una localidad por su identificador.",
        "operationId": "getArcabaseCitiesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador de la localidad.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/City"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/concepts": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Conceptos: producto, servicios o ambos. Define si ARCA va a exigir las fechas de servicio en el comprobante.",
        "description": "Conceptos: producto, servicios o ambos. Define si ARCA va a exigir las fechas de servicio en el comprobante.",
        "operationId": "getArcabaseConcepts",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Concept"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/countries": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Países del nomenclador de ARCA, para los comprobantes de exportación.",
        "description": "Países del nomenclador de ARCA, para los comprobantes de exportación.",
        "operationId": "getArcabaseCountries",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Country"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/currencies": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Monedas admitidas, ordenadas por nombre. \"PES\" son pesos argentinos.",
        "description": "Monedas admitidas, ordenadas por nombre. \"PES\" son pesos argentinos.",
        "operationId": "getArcabaseCurrencies",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Currency"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/identity-document-types": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista todos los tipos de documento.",
        "description": "Lista todos los tipos de documento.",
        "operationId": "getArcabaseIdentityDocumentTypes",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/IdentityDocumentType"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/identity-document-types/{id}": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Devuelve un tipo de documento por su código.",
        "description": "Devuelve un tipo de documento por su código.",
        "operationId": "getArcabaseIdentityDocumentTypesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código oficial del tipo de documento (DocTipo).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IdentityDocumentType"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/invoice-type-rules": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista las combinaciones habilitadas.",
        "description": "Lista las combinaciones habilitadas.\n\nCubre a los cinco emisores de la facturación electrónica: Responsable Inscripto (clases A, B, M y E), Exento y los tres monotributos (C y E). Por cada clase trae factura, nota de débito y nota de crédito. Las demás condiciones —consumidor final, no categorizado, del exterior— no emiten, así que no aparecen como emisoras.\n\nLa M aparece como posible para el Responsable Inscripto porque la emite en lugar de la A cuando ARCA se la asigna; si no te la asignaron, emití A. La E es exportación y va al cliente del exterior.\n\nSe arma con dos fuentes: qué clase emite cada condición (RG 1415) y qué receptores admite cada clase según la tabla de ARCA (FEParamGetCondicionIvaReceptor). Un responsable inscripto le emite Factura A a un monotributista desde la RG 5.003.",
        "operationId": "getArcabaseInvoiceTypeRules",
        "parameters": [
          {
            "name": "emitterId",
            "in": "query",
            "required": false,
            "description": "Condición frente al IVA de quien emite.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "recieverId",
            "in": "query",
            "required": false,
            "description": "Condición frente al IVA de quien recibe.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InvoiceTypeRule"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/invoice-types": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista los tipos de comprobante.",
        "description": "Lista los tipos de comprobante.",
        "operationId": "getArcabaseInvoiceTypes",
        "parameters": [
          {
            "name": "letter",
            "in": "query",
            "required": false,
            "description": "Filtra por letra del comprobante (A, B, C, M, E, R). Sin filtro devuelve los 96, incluidos los 20 cuya denominación oficial no nombra ninguna letra.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "onlyElectronic",
            "in": "query",
            "required": false,
            "description": "Deja solo los 36 que se pueden emitir por el web service de facturación electrónica. La tabla completa es el nomenclador de ARCA e incluye comprobantes en papel y de regímenes especiales: si estás armando el combo de un sistema que factura, querés esto en true.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InvoiceType"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/invoice-types/{id}": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Devuelve un tipo de comprobante por su código de ARCA.",
        "description": "Devuelve un tipo de comprobante por su código de ARCA.",
        "operationId": "getArcabaseInvoiceTypesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código oficial del comprobante (CbteTipo).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceType"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/iva-rates": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Alícuotas de IVA. El id va en cada ítem del array de IVA del comprobante; el campo percent trae el mismo valor como número, para no tener que parsear \"10.5%\".",
        "description": "Alícuotas de IVA. El id va en cada ítem del array de IVA del comprobante; el campo percent trae el mismo valor como número, para no tener que parsear \"10.5%\".",
        "operationId": "getArcabaseIvaRates",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/IvaRate"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/provinces": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista las 25 provincias.",
        "description": "Lista las 25 provincias.",
        "operationId": "getArcabaseProvinces",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Province"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/provinces/{id}": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Devuelve una provincia por su código.",
        "description": "Devuelve una provincia por su código.",
        "operationId": "getArcabaseProvincesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código de provincia de PanDaaS (1 a 25).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Province"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/provinces/{id}/cities": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Localidades de una provincia. Atajo de /arcabase/cities?provinceId={id}.",
        "description": "Localidades de una provincia. Atajo de /arcabase/cities?provinceId={id}.",
        "operationId": "getArcabaseProvincesByIdCities",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código de la provincia.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/City"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/responsable-types": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Lista las condiciones frente al IVA.",
        "description": "Lista las condiciones frente al IVA.\n\nPara armar el combo del receptor en un sistema que factura, pedí invoiceClass con la letra del comprobante que vas a emitir: vuelven solo las condiciones que ARCA acepta para esa letra, y el error de informar una incompatible (el 10242) no puede ocurrir.",
        "operationId": "getArcabaseResponsableTypes",
        "parameters": [
          {
            "name": "onlyCurrent",
            "in": "query",
            "required": false,
            "description": "Dejalo en true para recibir solo las 11 condiciones que ARCA acepta hoy. En false vienen también las derogadas —\"IVA Responsable no Inscripto\", \"Pequeño Contribuyente Eventual\"—, marcadas con isCurrent en false y con currentEquivalentId apuntando a su reemplazo. Sirven para migrar datos viejos, no para facturar.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "invoiceClass",
            "in": "query",
            "required": false,
            "description": "Letra del comprobante: A, B, C o M. Filtra a las condiciones que ARCA admite como receptor de esa clase.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ResponsableType"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/responsable-types/{id}": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Devuelve una condición por su código, vigente o derogada.",
        "description": "Devuelve una condición por su código, vigente o derogada.",
        "operationId": "getArcabaseResponsableTypesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código de la condición. En las vigentes es el código de ARCA.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponsableType"
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/arcabase/tax-types": {
      "get": {
        "tags": [
          "ARCABase"
        ],
        "summary": "Tipos de tributo que pueden sumarse a un comprobante: percepciones, ingresos brutos, impuestos provinciales y municipales.",
        "description": "Tipos de tributo que pueden sumarse a un comprobante: percepciones, ingresos brutos, impuestos provinciales y municipales.",
        "operationId": "getArcabaseTaxTypes",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TaxType"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Token ausente, inválido, desactivado o vencido"
          },
          "429": {
            "description": "Límite mensual del token superado"
          }
        },
        "security": [
          {
            "bearerToken": []
          }
        ]
      }
    },
    "/": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Documentación de la API en HTML.",
        "description": "Documentación de la API en HTML.",
        "operationId": "get",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/help": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Catálogo completo de la API: datasets, endpoints, parámetros, modelos de respuesta y códigos de error.",
        "description": "Catálogo completo de la API: datasets, endpoints, parámetros, modelos de respuesta y códigos de error.\n\nSe arma por reflexión sobre las rutas que la aplicación tiene registradas, no de una lista escrita a mano, así que nunca queda desfasado del código que efectivamente está corriendo.",
        "operationId": "getHelp",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogoApi"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/help/{dataset}": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Los endpoints de un dataset, para no traerse el catálogo entero.",
        "description": "Los endpoints de un dataset, para no traerse el catálogo entero.",
        "operationId": "getHelpByDataset",
        "parameters": [
          {
            "name": "dataset",
            "in": "path",
            "required": true,
            "description": "Nombre del dataset: AutoBase, ARCABase o Sistema.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GrupoDoc"
                }
              }
            }
          },
          "404": {
            "description": "El recurso no existe"
          }
        },
        "security": []
      }
    },
    "/openapi": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Devuelve la API descrita en OpenAPI 3.0.3.",
        "description": "Devuelve la API descrita en OpenAPI 3.0.3.\n\nSale del mismo catálogo que /help, así que las tres vistas —la página HTML, el JSON de /help y esta especificación— no pueden contradecirse entre sí.",
        "operationId": "getOpenapi",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/openapi.json": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Alias con extensión, que es lo que esperan algunas herramientas. Necesita el handler declarado en el Web.config: si no, IIS trata el .json como archivo estático y responde 404 sin llegar acá.",
        "description": "Alias con extensión, que es lo que esperan algunas herramientas. Necesita el handler declarado en el Web.config: si no, IIS trata el .json como archivo estático y responde 404 sin llegar acá.",
        "operationId": "getOpenapi.json",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/status": {
      "get": {
        "tags": [
          "Sistema"
        ],
        "summary": "Dice si la API está viva y si llega a la base.",
        "description": "Dice si la API está viva y si llega a la base.\n\nExiste por un motivo concreto: entre enero y agosto de 2026 la API respondió 500 en todos sus endpoints porque el binario publicado consultaba tablas que habían sido renombradas, y nadie se enteró. Este endpoint es lo que hace que eso se note el mismo día.",
        "operationId": "getStatus",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": []
      }
    }
  }
}