{
  "openapi": "3.0.1",
  "info": {
    "title": "VigiaXML API",
    "description": "API de integração do VigiaXML: consulta de status de NF-e, CT-e e MDF-e na SEFAZ, monitoramento por 30 dias, eventos vinculados e sincronização incremental pra espelhar consultas e eventos no seu banco. Autenticação por header `X-Api-Key`. Guia com exemplos: https://www.vigiaxml.com/desenvolvedores",
    "version": "v1"
  },
  "paths": {
    "/v1/consulta": {
      "post": {
        "tags": [
          "Consulta"
        ],
        "summary": "Consulta avulsa do status de uma chave na SEFAZ",
        "description": "Consulta síncrona (R$ 0,20). Detecta o modelo (55/57/58) pela chave. Devolve o status normalizado (autorizada/cancelada/denegada/inexistente/erro), o cStat bruto e os eventos vinculados que a SEFAZ devolve na consulta de protocolo. Idempotente por 5 s para a mesma chave.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConsultaRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/cadastro/{cnpj}": {
      "get": {
        "tags": [
          "Cadastro"
        ],
        "summary": "Situação cadastral do contribuinte na UF (IE habilitada/baixada/suspensa)",
        "description": "R$ 0,70, cache de 24 h. Cobertura pelo pool de certificados: PR e GO; demais UFs exigem certificado próprio (BYOC). CNPJ sem máscara na URL.",
        "parameters": [
          {
            "name": "cnpj",
            "in": "path",
            "description": "CNPJ com 14 dígitos, sem máscara.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uf",
            "in": "query",
            "description": "UF da inscrição estadual a consultar (ex.: SP).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/rastreio/{chave}": {
      "get": {
        "tags": [
          "Rastreio"
        ],
        "summary": "Árvore de documentos vinculados (NF-e ↔ CT-e ↔ MDF-e) com timeline",
        "description": "Reconstrói a história da operação a partir dos eventos de referência. atingiu_limite=true indica que a árvore bateu no teto defensivo de nós.",
        "parameters": [
          {
            "name": "chave",
            "in": "path",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/eventos/upload-xml": {
      "post": {
        "tags": [
          "Eventos"
        ],
        "summary": "Enriquece a carteira com o XML completo de um evento",
        "description": "Use quando seu sistema recebeu o procEvento (comprovante de entrega, passagem, etc.) e quer os detalhes que a consulta de status não devolve. O upload não é verificado criptograficamente: os campos preenchidos ficam marcados com fonte_detalhe = \"upload_cliente\".",
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/importar": {
      "post": {
        "tags": [
          "Consulta"
        ],
        "summary": "Importa até 1.000 chaves (consulta em lote ou monitoramento)",
        "description": "modo \"consulta\": consulta as chaves e devolve o status de cada uma. modo \"monitoramento\": inclui as chaves na carteira por 30 dias (hora em hora no dia da inclusão, diária depois). pularConsultaInline: true deixa o worker consultar depois — recomendado em lotes grandes.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/V1ImportarRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/monitoramento": {
      "post": {
        "tags": [
          "Monitoramento"
        ],
        "summary": "Adiciona uma chave ao monitoramento (30 dias)",
        "description": "Faz a primeira consulta inline e agenda as seguintes. callbackUrl opcional recebe webhook.status_mudou quando o status muda. 409 se a chave já está em monitoramento ativo.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/V1MonitoramentoRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      },
      "get": {
        "tags": [
          "Monitoramento"
        ],
        "summary": "Lista a carteira monitorada",
        "description": "Paginada por limit/offset. ativos=true filtra só monitoramentos vigentes.",
        "parameters": [
          {
            "name": "ativos",
            "in": "query",
            "description": "true = só monitoramentos vigentes.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Tamanho da página: 1-200 no modo paginado (default 50), 1-500 no modo feed (default 500).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Modo paginado: quantos resultados pular. Não combina com de/ate/cursor.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/monitoramento/{chave}": {
      "get": {
        "tags": [
          "Monitoramento"
        ],
        "summary": "Situação de uma chave monitorada",
        "description": "Status atual, próxima consulta agendada e expiração.",
        "parameters": [
          {
            "name": "chave",
            "in": "path",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      },
      "delete": {
        "tags": [
          "Monitoramento"
        ],
        "summary": "Encerra o monitoramento de uma chave",
        "description": "Soft delete: o histórico de consultas é preservado.",
        "parameters": [
          {
            "name": "chave",
            "in": "path",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/consultas": {
      "get": {
        "tags": [
          "Sincronização"
        ],
        "summary": "Histórico de consultas — paginado, ou feed incremental (de/ate/cursor)",
        "description": "Sem de/ate/cursor: modo paginado, mais recente primeiro, com total/offset/limit (limit 1-200). Com de, ate ou cursor: modo feed pra espelhar as consultas no seu banco — ordem ascendente por (queried_at, id), até 500 por página, resposta items/next_cursor/has_more. Regras do feed: só saem linhas com queried_at anterior a agora − 10 min; de é inclusivo e ate exclusivo (só ISO-8601; sem offset vale horário de Brasília); nas continuações mande SÓ o cursor (ele carrega janela e filtros); upsert por id do seu lado (entrega at-least-once); cursor= vazio começa do início. Guia completo: https://www.vigiaxml.com/desenvolvedores#sincronizacao",
        "parameters": [
          {
            "name": "chave",
            "in": "query",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Tamanho da página: 1-200 no modo paginado (default 50), 1-500 no modo feed (default 500).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Modo paginado: quantos resultados pular. Não combina com de/ate/cursor.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Modo paginado: só registros com relógio ≥ este instante. Sem offset é UTC (diferente de `de`). Não combina com de/ate/cursor.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "de",
            "in": "query",
            "description": "Início da janela, inclusivo. Só ISO-8601 (2026-09-08, 2026-09-08T10:00:00 ou …-03:00; '+' na query como %2B). Sem offset = horário de Brasília. Omitido = desde o início.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ate",
            "in": "query",
            "description": "Fim da janela, exclusivo. Omitido (ou no futuro) = agora − 10 min.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Continuação: o next_cursor da resposta anterior, e só ele (carrega janela e filtros). Vazio = começar do início.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListaDeConsultaItem"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/consultas/resumo": {
      "get": {
        "tags": [
          "Sincronização"
        ],
        "summary": "Total de consultas por status numa janela (conferência do espelho)",
        "description": "de e ate obrigatórios (ISO-8601), no máximo 7 dias, mesmo teto de segurança do feed (agora − 10 min). Compare total com o count do seu banco na mesma janela. Aceita o filtro chave.",
        "parameters": [
          {
            "name": "de",
            "in": "query",
            "description": "Início da janela, inclusivo. Só ISO-8601 (2026-09-08, 2026-09-08T10:00:00 ou …-03:00; '+' na query como %2B). Sem offset = horário de Brasília. Omitido = desde o início.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ate",
            "in": "query",
            "description": "Fim da janela, exclusivo. Omitido (ou no futuro) = agora − 10 min.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chave",
            "in": "query",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResumoConsultas"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/rastreio/{chave}/link": {
      "post": {
        "tags": [
          "Rastreio"
        ],
        "summary": "Emite um link público assinado da tela de rastreio",
        "description": "Pra mandar ao usuário final sem conta no VigiaXML. Só pra chaves já consultadas por esta carteira; expira em `dias` (limitado pelo teto do servidor — veja expira_em na resposta). Trate como segredo.",
        "parameters": [
          {
            "name": "chave",
            "in": "path",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dias",
            "in": "query",
            "description": "Validade do link em dias (limitado pelo teto do servidor).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/eventos": {
      "get": {
        "tags": [
          "Sincronização"
        ],
        "summary": "Eventos vinculados — paginado, ou feed incremental (de/ate/cursor)",
        "description": "CCe, cancelamento, manifestações do destinatário, passagem, entrega, encerramento de MDF-e, EPEC e referências entre documentos. Mesmos dois modos do /v1/consultas; no feed o relógio é atualizado_em (um evento enriquecido reaparece; captured_at não muda). fonte_detalhe = \"upload_cliente\" marca detalhe enviado pelo próprio tenant, sem verificação criptográfica — null significa SEFAZ. Campos que não se aplicam ao tp_evento vêm null.",
        "parameters": [
          {
            "name": "chave",
            "in": "query",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tp",
            "in": "query",
            "description": "Tipo do evento SEFAZ (ex.: 210240 = Operação não Realizada).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "description": "Modo paginado: só registros com relógio ≥ este instante. Sem offset é UTC (diferente de `de`). Não combina com de/ate/cursor.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Tamanho da página: 1-200 no modo paginado (default 50), 1-500 no modo feed (default 500).",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Modo paginado: quantos resultados pular. Não combina com de/ate/cursor.",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "de",
            "in": "query",
            "description": "Início da janela, inclusivo. Só ISO-8601 (2026-09-08, 2026-09-08T10:00:00 ou …-03:00; '+' na query como %2B). Sem offset = horário de Brasília. Omitido = desde o início.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ate",
            "in": "query",
            "description": "Fim da janela, exclusivo. Omitido (ou no futuro) = agora − 10 min.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Continuação: o next_cursor da resposta anterior, e só ele (carrega janela e filtros). Vazio = começar do início.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListaDeEventoItem"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    },
    "/v1/eventos/resumo": {
      "get": {
        "tags": [
          "Sincronização"
        ],
        "summary": "Total de eventos por tp_evento numa janela (conferência do espelho)",
        "description": "Gêmeo do /v1/consultas/resumo, pelo relógio atualizado_em. Aceita os filtros chave e tp.",
        "parameters": [
          {
            "name": "de",
            "in": "query",
            "description": "Início da janela, inclusivo. Só ISO-8601 (2026-09-08, 2026-09-08T10:00:00 ou …-03:00; '+' na query como %2B). Sem offset = horário de Brasília. Omitido = desde o início.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ate",
            "in": "query",
            "description": "Fim da janela, exclusivo. Omitido (ou no futuro) = agora − 10 min.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chave",
            "in": "query",
            "description": "Chave de acesso de 44 dígitos. No modo feed uma chave inválida responde 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tp",
            "in": "query",
            "description": "Tipo do evento SEFAZ (ex.: 210240 = Operação não Realizada).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResumoEventos"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "X-Api-Key ausente, inválida ou suspensa."
          },
          "429": {
            "description": "Rate limit por API key (retry_after_sec no corpo)."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ConsultaItem": {
        "required": [
          "alerta_manifestacao",
          "c_stat",
          "chave_acesso",
          "duration_ms",
          "id",
          "modelo",
          "origem",
          "queried_at",
          "status",
          "tem_cce",
          "uf",
          "x_motivo"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "chave_acesso": {
            "minLength": 1,
            "type": "string"
          },
          "modelo": {
            "type": "integer",
            "format": "int32"
          },
          "uf": {
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "minLength": 1,
            "type": "string"
          },
          "c_stat": {
            "minLength": 1,
            "type": "string"
          },
          "x_motivo": {
            "minLength": 1,
            "type": "string"
          },
          "origem": {
            "minLength": 1,
            "type": "string"
          },
          "duration_ms": {
            "type": "integer",
            "format": "int32"
          },
          "queried_at": {
            "type": "string",
            "format": "date-time"
          },
          "protocolo_sefaz": {
            "type": "string",
            "nullable": true
          },
          "data_status_sefaz": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "alerta_manifestacao": {
            "type": "boolean"
          },
          "tem_cce": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ConsultaRequest": {
        "type": "object",
        "properties": {
          "chaveAcesso": {
            "type": "string",
            "nullable": true
          },
          "gaClientId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EventoItem": {
        "required": [
          "atualizado_em",
          "captured_at",
          "chave_acesso",
          "consulta_id",
          "descricao",
          "id",
          "n_seq_evento",
          "tp_evento"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "consulta_id": {
            "type": "string",
            "format": "uuid"
          },
          "chave_acesso": {
            "minLength": 1,
            "type": "string"
          },
          "tp_evento": {
            "minLength": 1,
            "type": "string"
          },
          "descricao": {
            "minLength": 1,
            "type": "string"
          },
          "n_seq_evento": {
            "type": "integer",
            "format": "int32"
          },
          "dh_evento": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "dh_reg_evento": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "cnpj_autor": {
            "type": "string",
            "nullable": true
          },
          "c_orgao": {
            "type": "string",
            "nullable": true
          },
          "detalhe": {
            "type": "string",
            "nullable": true
          },
          "protocolo": {
            "type": "string",
            "nullable": true
          },
          "captured_at": {
            "type": "string",
            "format": "date-time"
          },
          "atualizado_em": {
            "type": "string",
            "format": "date-time"
          },
          "fonte_detalhe": {
            "type": "string",
            "nullable": true
          },
          "placa": {
            "type": "string",
            "nullable": true
          },
          "uf_placa": {
            "type": "string",
            "nullable": true
          },
          "c_mun_local": {
            "type": "string",
            "nullable": true
          },
          "dh_pas": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lat_gps": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "lng_gps": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "dh_entrega": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "x_nome_recebedor": {
            "type": "string",
            "nullable": true
          },
          "n_doc_recebedor": {
            "type": "string",
            "nullable": true
          },
          "n_tentativa": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "tp_motivo": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "x_just_motivo": {
            "type": "string",
            "nullable": true
          },
          "hash_evento": {
            "type": "string",
            "nullable": true
          },
          "v_nf": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "dest_nome": {
            "type": "string",
            "nullable": true
          },
          "dt_enc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "c_uf_enc": {
            "type": "string",
            "nullable": true
          },
          "c_mun_enc": {
            "type": "string",
            "nullable": true
          },
          "cpf_cond": {
            "type": "string",
            "nullable": true
          },
          "x_nome_cond": {
            "type": "string",
            "nullable": true
          },
          "cnpj_aut": {
            "type": "string",
            "nullable": true
          },
          "x_nome_aut": {
            "type": "string",
            "nullable": true
          },
          "ch_ref": {
            "type": "string",
            "nullable": true
          },
          "ch_mdfe_ref": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ListaDeConsultaItem": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "limit": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConsultaItem"
            }
          },
          "next_cursor": {
            "type": "string",
            "nullable": true
          },
          "has_more": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ListaDeEventoItem": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "offset": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "limit": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventoItem"
            }
          },
          "next_cursor": {
            "type": "string",
            "nullable": true
          },
          "has_more": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ResumoConsultas": {
        "type": "object",
        "properties": {
          "de": {
            "type": "string",
            "format": "date-time"
          },
          "ate": {
            "type": "string",
            "format": "date-time"
          },
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "por_status": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ResumoEventos": {
        "type": "object",
        "properties": {
          "de": {
            "type": "string",
            "format": "date-time"
          },
          "ate": {
            "type": "string",
            "format": "date-time"
          },
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "por_tp_evento": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "V1ImportarRequest": {
        "type": "object",
        "properties": {
          "chaves": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "modo": {
            "type": "string",
            "nullable": true
          },
          "webhookUrl": {
            "type": "string",
            "nullable": true
          },
          "pularConsultaInline": {
            "type": "boolean",
            "nullable": true
          },
          "linkRastreio": {
            "type": "boolean",
            "nullable": true
          },
          "linkDias": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "validarEmitente": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "V1MonitoramentoRequest": {
        "type": "object",
        "properties": {
          "chaveAcesso": {
            "type": "string",
            "nullable": true
          },
          "callbackUrl": {
            "type": "string",
            "nullable": true
          },
          "linkRastreio": {
            "type": "boolean",
            "nullable": true
          },
          "linkDias": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "description": "Chave da carteira (formato `vxml_…`), gerada em /conta. Obrigatória em todas as rotas.",
        "name": "X-Api-Key",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "ApiKey": [ ]
    }
  ]
}