{
  "openapi": "3.0.3",
  "info": {
    "title": "PanDaaS",
    "version": "3.1.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
          }
        }
      },
      "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), o null si no aplica.",
            "nullable": true
          }
        }
      },
      "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
          }
        }
      },
      "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.",
        "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
          }
        }
      },
      "responsableType": {
        "type": "object",
        "description": "Condición del contribuyente frente al IVA: responsable inscripto, monotributista, consumidor final, exento, etc.",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Código de la condición."
          },
          "name": {
            "type": "string",
            "description": "Denominación de la condición.",
            "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
          }
        }
      }
    }
  },
  "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.",
        "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/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.",
        "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). Sin filtro devuelve los 96, incluidos los que no tienen letra.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "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/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 todas las condiciones frente al IVA.",
        "description": "Lista todas las condiciones frente al IVA.",
        "operationId": "getArcabaseResponsableTypes",
        "parameters": [],
        "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.",
        "description": "Devuelve una condición por su código.",
        "operationId": "getArcabaseResponsableTypesById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Código de la condición.",
            "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": []
          }
        ]
      }
    },
    "/": {
      "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": []
      }
    }
  }
}