{
  "info": {
    "_postman_id": "8d5b1f3e-6c2a-4f47-9a1e-3b7c0d9e2f61",
    "name": "API UNIFOKAL",
    "description": "A API da UNIFOKAL, gerada da especificação OpenAPI a cada publicação.\n\nA coleção não carrega chave nem script. Crie um ambiente com UNIFOKAL_SECRET_KEY (a sua chave de sandbox, sk_test) e UNIFOKAL_FLOW_ID (um flow do mesmo ambiente) e rode. O catálogo público responde sem chave nenhuma.\n\nDocumentação: https://unifokal.com/docs/api-rest#colecao-importavel",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Catálogo",
      "description": "Módulos, preços e dependências. A primeira chamada roda sem chave nenhuma.",
      "item": [
        {
          "id": "getCapabilities-sem-chave",
          "name": "Catálogo público (sem chave)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/capabilities",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "capabilities"
              ]
            },
            "auth": {
              "type": "noauth"
            },
            "description": "Credencial OPCIONAL. Sem credencial: catálogo geral com o preço-base público (cacheável). Com Bearer sk_: a MESMA URL devolve o contrato da sua organização (preço efetivo com override de contrato, ambiente e livemode da chave; sem cache HTTP). O estado available/coming_soon é o MESMO que a criação de flow enforça: módulo em coming_soon é recusado com 422 em flow de produção, e aceito em sandbox.\n\nDocumentação: https://unifokal.com/docs/api-rest#get-capabilities"
          },
          "response": []
        },
        {
          "id": "getCapabilities",
          "name": "Catálogo vivo de módulos e preços; com sk_, o contrato efetivo da sua organização",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/capabilities",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "capabilities"
              ]
            },
            "description": "Credencial OPCIONAL. Sem credencial: catálogo geral com o preço-base público (cacheável). Com Bearer sk_: a MESMA URL devolve o contrato da sua organização (preço efetivo com override de contrato, ambiente e livemode da chave; sem cache HTTP). O estado available/coming_soon é o MESMO que a criação de flow enforça: módulo em coming_soon é recusado com 422 em flow de produção, e aceito em sandbox.\n\nDocumentação: https://unifokal.com/docs/api-rest#get-capabilities"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Sessões de verificação",
      "description": "Cria a sessão que o widget monta. O resultado chega no seu webhook.",
      "item": [
        {
          "id": "createVerificationSession",
          "name": "Cria uma sessão de verificação (a única chamada obrigatória do integrador)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/verification-sessions",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "verification-sessions"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"flow_id\": \"{{UNIFOKAL_FLOW_ID}}\",\n  \"reference_id\": \"{{UNIFOKAL_REFERENCE_ID}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "O 201 nunca traz decisão: o resultado chega no seu webhook (a fonte da verdade). IDEMPOTÊNCIA: esta rota não usa header nenhum. O reference_id (obrigatório) É a chave: a mesma organização, no mesmo ambiente, com o mesmo reference_id, recebe de volta a MESMA sessão ENQUANTO ELA VIVER (expires_in), em vez de uma segunda (o replay volta com Idempotent-Replay: true). Expirada a sessão, o mesmo reference_id abre uma sessão nova, que é o que a pessoa precisa para tentar de novo. Repetir o reference_id com um corpo DIFERENTE é 422 idempotency_key_reuse; com a primeira chamada ainda em voo, 409 idempotency_conflict. Exceto quando o corpo traz act: aí a chave é act.external_id, pelo prazo da sessão de prova.\n\nDocumentação: https://unifokal.com/docs/api-rest#post-sessions"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Link hospedado",
      "description": "Cria o link de verificação para quem não vai montar o widget.",
      "item": [
        {
          "id": "createVerificationLink",
          "name": "Cria um link hospedado de verificação (o titular abre a jornada sem você montar o widget)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/verification-links",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "verification-links"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"flow_id\": \"{{UNIFOKAL_FLOW_ID}}\",\n  \"reference_id\": \"{{UNIFOKAL_REFERENCE_ID}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Para quem NÃO vai montar o widget: a UNIFOKAL hospeda a página e você entrega a url ao titular (e-mail, WhatsApp, QR). O link vive HORAS (a sessão vive 900s e só nasce no resgate), o token vlt_ volta em claro uma única vez e o link não cobra nada: quem cobra é a verificação que nascer do resgate. Sem Idempotency-Key de propósito: selar o corpo guardaria o segredo no banco; repetir a chamada só cria outro link, que expira sozinho.\n\nDocumentação: https://unifokal.com/docs/api-rest#post-verification-links"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Lista as entregas que falharam em definitivo e as redispara.",
      "item": [
        {
          "id": "listUndeliveredWebhookEvents",
          "name": "Lista os webhooks NÃO confirmados (falha definitiva de entrega), para redisparo",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/webhook-events?page=1&limit=20",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "webhook-events"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "limit",
                  "value": "20"
                },
                {
                  "key": "resource_id",
                  "value": "",
                  "disabled": true
                }
              ]
            },
            "description": "Lista os webhooks NÃO confirmados (falha definitiva de entrega), para redisparo\n\nDocumentação: https://unifokal.com/docs/api-rest#get-webhook-events"
          },
          "response": []
        },
        {
          "id": "replayWebhookEvents",
          "name": "Redispara os webhooks de até 20 verificações ou recursos",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{UNIFOKAL_BASE_URL}}/webhook-events/replay",
              "host": [
                "{{UNIFOKAL_BASE_URL}}"
              ],
              "path": [
                "webhook-events",
                "replay"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"verification_ids\": [\n    \"{{UNIFOKAL_VERIFICATION_ID}}\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Teto de 30 chamadas por minuto. Reenvia o corpo salvo byte a byte ao destino atual.\n\nDocumentação: https://unifokal.com/docs/api-rest#post-webhook-replay"
          },
          "response": []
        }
      ]
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{UNIFOKAL_SECRET_KEY}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "UNIFOKAL_BASE_URL",
      "value": "https://api.unifokal.com/v1",
      "type": "string"
    },
    {
      "key": "UNIFOKAL_REFERENCE_ID",
      "value": "teste-colecao-1",
      "type": "string"
    },
    {
      "key": "UNIFOKAL_VERIFICATION_ID",
      "value": "ver_00000000000000000000000000",
      "type": "string"
    }
  ]
}
