Este documento descreve os comportamentos padrão, regras e formatos que se aplicam a todos os endpoints da API v2 do A2A. Leia este documento antes de integrar com qualquer endpoint v2.
Headers de resposta
Toda resposta da API v2 inclui os headers a seguir, independentemente do endpoint ou do código de status HTTP.
| Header | Descrição |
|---|---|
X-Request-Id |
Identificador único da requisição, atribuído pela Segura®. Use este valor ao reportar problemas ao suporte. |
ETag |
Hash que representa o estado atual do recurso retornado. Use com If-None-Match para leituras condicionais. |
X-RateLimit-Limit |
Número máximo de requisições permitidas na janela de tempo atual. |
X-RateLimit-Remaining |
Número de requisições restantes na janela de tempo atual. |
X-RateLimit-Reset |
Timestamp Unix em que a janela de rate limit atual é redefinida. |
Nota: Quando o limite de requisições é excedido, a API retorna
429 Too Many Requests. Aguarde atéX-RateLimit-Resetantes de tentar novamente.
Requisições condicionais
If-None-Match — leituras condicionais (GET)
Use o valor do ETag de uma resposta anterior como header If-None-Match em uma requisição GET subsequente. Se o recurso não tiver sido alterado, o servidor retorna 304 Not Modified sem corpo, economizando largura de banda.
GET /api/v2/pam/credentials/101
If-None-Match: "abc123etag"
| Resposta | Significado |
|---|---|
200 OK |
O recurso foi alterado. O corpo completo da resposta é retornado. |
304 Not Modified |
O recurso não foi alterado. Nenhum corpo é retornado; use a versão em cache. |
If-Match — escritas condicionais (PUT, PATCH, DELETE)
Use o valor do ETag de uma leitura anterior como header If-Match em uma requisição de escrita. Isso impede a sobrescrita de alterações feitas por outro processo desde a sua última leitura (controle de concorrência otimista).
PUT /api/v2/pam/credentials/101
If-Match: "abc123etag"
| Resposta | Significado |
|---|---|
2xx |
O ETag correspondeu. A escrita foi aplicada. |
412 Precondition Failed |
O ETag não correspondeu. O recurso foi modificado desde a sua última leitura. Refaça a leitura antes de tentar novamente. |
Formato de erros
Todas as respostas de erro v2 usam uma estrutura JSON consistente, independentemente do endpoint.
{
"error": {
"code": "api.fields.invalid",
"message": "One or more requested fields do not exist in the canonical model.",
"details": [
{
"field": "credential.nonexistent",
"reason": "Field not found in CredentialV2 schema."
}
]
}
}
| Campo | Tipo | Descrição |
|---|---|---|
error.code |
string | Identificador de erro legível por máquina. Use para tratamento programático de erros. |
error.message |
string | Descrição legível do erro. |
error.details |
array de objetos | Contexto adicional sobre o erro. Pode estar vazio para erros genéricos. |
error.details[].field |
string | O campo ou parâmetro que causou o erro, quando aplicável. |
error.details[].reason |
string | Motivo específico pelo qual o campo ou parâmetro foi rejeitado. |
Política de 403 vs 404
A API v2 distingue deliberadamente entre falhas de autorização e recursos inexistentes.
| Código | Quando é retornado |
|---|---|
403 Forbidden |
O recurso existe, mas a autorização não tem permissão para acessá-lo, ou a requisição contém um campo sensível. A Segura® retorna 403 mesmo quando o chamador poderia inferir a existência pelo retorno. |
404 Not Found |
O recurso genuinamente não existe ou o ID está malformado. |
Nota: A Segura® nunca retorna
404para mascarar um403. Se você receber404, o recurso não existe. Se receber403, o recurso existe, mas está fora do escopo da sua autorização.
Paginação
Todos os endpoints de listagem suportam duas estratégias de paginação. Cada endpoint documenta quais estratégias são suportadas.
Paginação por offset
Use para navegação padrão e conjuntos de dados de tamanho moderado.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
page |
integer | 1 |
Número da página a recuperar. |
limit |
integer | 50 |
Número de resultados por página. |
Campos da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
meta.pagination.page |
integer | Número da página atual. |
meta.pagination.limit |
integer | Resultados por página. |
meta.pagination.total_items |
integer | Total de registros correspondentes. Pode ser null ou uma estimativa para conjuntos de dados grandes. |
meta.pagination.total_pages |
integer | Número total de páginas. |
meta.pagination.count |
integer | Número de itens na página atual. |
meta.links.self |
string | URL da página atual. |
meta.links.first |
string | URL da primeira página. |
meta.links.prev |
string | URL da página anterior. null na primeira página. |
meta.links.next |
string | URL da próxima página. null na última página. |
meta.links.last |
string | URL da última página. |
Paginação por cursor
Recomendada para conjuntos de dados acima de 100.000 registros. Mais eficiente que a paginação por offset para grandes volumes.
| Parâmetro | Tipo | Descrição |
|---|---|---|
cursor |
string | Token de cursor opaco retornado em meta.pagination.next_cursor. Não decodifique nem construa cursors manualmente. Os cursors expiram após 24 horas. |
Campos da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
meta.pagination.cursor |
string | Cursor representando a posição atual. |
meta.pagination.next_cursor |
string | Cursor para a próxima página. null quando não há mais resultados. |
meta.pagination.has_more |
boolean | Indica se existem mais resultados além da página atual. |
Aviso:
page/limitecursorsão mutuamente exclusivos. Enviar ambos na mesma requisição retorna422 Unprocessable Content. Para conjuntos de dados grandes onde calculartotal_itemsseria impraticável, o campo pode sernullou uma estimativa — usehas_morecomo sinal de continuação.
Projeção de campos (fields)
Endpoints que suportam fields retornam apenas o subconjunto solicitado do modelo canônico, reduzindo o tamanho do payload.
Uso:
GET /api/v2/pam/credentials/101?fields=credential.username,device.name,jit.credential_enabled
Regras:
- Use notação de ponto para referenciar campos aninhados (ex.:
credential.username,device.tags). - Solicite um objeto completo nomeando-o sem um caminho filho (ex.:
fields=deviceretorna todos os campos não sensíveis dedevice). - Quando
fieldsé omitido, todos os campos públicos do modelo canônico são retornados, comnullpara campos não aplicáveis. - Campos não presentes no modelo canônico retornam
422com códigoapi.fields.invalid. - Campos sensíveis retornam
403com códigoapi.fields.sensitive.not.allowed. Veja Campos sensíveis. - Campos fora do escopo da autorização vigente retornam
403.
Campos sensíveis — nunca retornados:
Os campos a seguir são permanentemente excluídos de todas as respostas. Solicitá-los retorna 403:
credential.passwordcertificate.key_filecertificate.key_passwordtotp.secret_key
Ordenação (sort_by)
Endpoints de listagem que suportam ordenação aceitam o parâmetro de query sort_by.
Uso:
GET /api/v2/pam/credentials?sort_by=criticality:desc,credential.username
Regras:
| Regra | Detalhe |
|---|---|
| Formato | campo ou campo:asc ou campo:desc |
| Direção padrão | asc quando nenhum sufixo é informado |
| Múltiplos campos | Separados por vírgula, processados da esquerda para a direita |
| Campo inválido | Retorna 422 |
| Direção inválida | Retorna 422 |
Filtros
Endpoints de listagem aceitam parâmetros de filtro como query strings. Todos os parâmetros de filtro são opcionais.
Lógica AND e OR
| Padrão | Lógica | Exemplo |
|---|---|---|
| Parâmetros diferentes | AND | ?device_id=123&credential.criticality=high |
| Mesmo parâmetro repetido | AND (para arrays) | ?credential.tags=prod&credential.tags=finance |
| Valores separados por vírgula | OR | ?credential.criticality=high,medium |
Nota: O caractere pipe (
|) não é suportado como separador OR. Use valores separados por vírgula.
Valores booleanos em filtros
Parâmetros booleanos aceitam apenas true ou false como valores de string. Os valores 0, 1, yes e no não são aceitos e retornam 422.
Validação
Todos os parâmetros de filtro inválidos retornam um erro explícito — a API nunca ignora silenciosamente um filtro não reconhecido.
| Condição | Resposta |
|---|---|
| Campo inexistente | 422 Unprocessable Content |
| Campo sensível usado como filtro | 422 Unprocessable Content |
| Valor de enum inválido | 422 Unprocessable Content |
| Valor booleano inválido | 422 Unprocessable Content |
Exemplos
Correspondência exata:
GET /api/v2/pam/credentials?credential.username=svc-payments
AND — múltiplos campos:
GET /api/v2/pam/credentials?device_id=123&credential.criticality=high&jit.credential_enabled=true
AND — mesmo campo (array):
GET /api/v2/pam/credentials?credential.tags=prod&credential.tags=finance
OR — valores separados por vírgula:
GET /api/v2/pam/credentials?credential.criticality=high,medium
Ordenação por múltiplos campos:
GET /api/v2/pam/credentials?sort_by=criticality:desc,credential.username
Convenções de nomenclatura
Todos os endpoints da API v2 seguem estas convenções de forma consistente.
| Convenção | Regra |
|---|---|
| Nomenclatura de path | snake_case para parâmetros de query e campos de resposta; kebab-case para segmentos de path compostos (ex.: /group-sync) |
| Collections | Substantivos no plural (ex.: /credentials, /devices) |
| Nomes de campos | snake_case em todos os payloads de requisição e resposta. camelCase não é utilizado. |
| Booleanos em query strings | Somente true / false |
Erros de autenticação
Os erros de autenticação a seguir se aplicam a todos os endpoints v2.
| Mensagem | Causa possível | Solução |
|---|---|---|
Client authentication failed. |
Falha na autenticação da aplicação com o servidor Segura®. | Verifique os parâmetros de autenticação (Access Token URL, Client ID e Client secret) e solicite um novo token de acesso. |
Invalid signature |
Falha no reconhecimento da URL da aplicação cliente. | Verifique a URL da aplicação cliente e reenvie a requisição. |
No route matched with those values. |
Header de autorização ausente na requisição da API. | Solicite um novo token de acesso. |
Request timed out. |
A requisição excedeu o limite de tempo. | Verifique a conectividade entre a origem da requisição e o servidor Segura®. |