Documentação da API

Integração asaph para parceiros

Este guia explica como conectar seu produto ao asaph: exibir um QR Code (ou Base64) para parear um computador com uma organização, ativar a conexão e consumir ordens de culto e arquivos pela API /partner.

O que você precisa fornecer ao asaph

Antes da integração funcionar, envie ao time asaph estes dois itens. Eles são configurados uma vez na conta do seu produto:

ItemDetalhe
URL do webhookEndpoint HTTPS no seu backend que receberá POST { "token", "payload" } quando um pareamento for iniciado. Deve ser público, estável e responder 2xx. Veja Seu webhook.
Chave de assinatura HMACSegredo fixo e de longa duração, combinado entre você e o asaph. No seu app, use essa chave para gerar o sig do QR/Base64 sobre {ts};{device};{token}. O asaph usa a mesma chave para validar. Não é por sessão nem por organização — é uma chave do parceiro. Veja Assinatura HMAC.
Suas credenciais
Após fornecer webhook e chave HMAC, o asaph envia o token de identidade. Cole-o abaixo e valide. O device code é o payload do webhook — use-o como X-Device-Code. Ambos são reutilizados nos painéis Try dos endpoints.

Necessário para handshake e demais rotas /partner/* (exceto validação do token).

Base URL: https://v2.api.asaph.app.br

Conceitos

TermoSignificado
OrganizaçãoIgreja ou conta no asaph com a qual o computador será vinculado.
Dispositivo (device)Conexão entre o seu produto e uma organização no asaph. Status: pendingactiverevoked.
Token de identidadeJWT permanente do parceiro (seção Credenciais). Vai no header Authorization: Bearer … em todas as rotas /partner/*.
Token de sessão (token)Código gerado pelo seu app para identificar aquele computador/sessão. Entra no QR Code / Base64 e é ecoado no webhook para você saber a quem entregar o código do dispositivo.
Código do dispositivo (payload)Código assinado gerado pelo asaph. Deve ser enviado como X-Device-Code no handshake e em todas as demais rotas /partner/*.

Fluxo de pareamento

O vínculo começa no seu app (QR Code ou string Base64) e termina quando você ativa o dispositivo com o handshake. Depois disso, as rotas listadas abaixo ficam disponíveis.

1
Exiba um QR Code (ou uma string Base64) no seu app. O asaph lê esse conteúdo. Ele deve ser um JSON com:
  • ts — timestamp Unix (segundos)
  • device — nome do computador (ex.: MacBook)
  • token — código que identifica aquele computador/sessão (você usará isso para ligar o aparelho à organização)
  • sig — HMAC de {ts};{device};{token} com a chave de assinatura combinada com o asaph
{
  "ts": 1779726247,
  "device": "MacBook",
  "token": "sessao-opaca-do-seu-app",
  "sig": "b94ca4e3e80cf667fb9849dc57b1432488be33b4c5f3b192097965ea37482a0d"
}

O QR pode conter o JSON em texto ou a mesma carga em Base64 — o asaph aceita os dois formatos na leitura. Detalhes da assinatura em Assinatura HMAC.

2
O asaph valida o conteúdo (incluindo a assinatura HMAC) e associa o pareamento à organização do usuário logado.
3
O asaph cria o dispositivo em status pending, gera um código assinado e envia um POST para o seu webhook, usando o token que veio no QR/Base64:
POST /seu/webhook
Content-Type: application/json

{
  "token": "sessao-opaca-do-seu-app",
  "payload": "codigo_assinado_do_dispositivo"
}

Guarde o payload: ele é o valor de X-Device-Code em todas as chamadas /partner/*, junto com o token de identidade no Authorization. O dispositivo ainda não está ativo.

4
Ao receber token + payload, localize a sessão pelo token e chame POST /partner/handshake com:
  • Authorization: Bearer <token de identidade>
  • X-Device-Code: <payload>
5
O dispositivo fica pareado e ativo (pending → active), pronto para uso.
6
Use os endpoints abaixo com os mesmos headers Authorization e X-Device-Code para obter os dados da organização vinculada.

Seu webhook

A URL do webhook é um dos itens que você fornece ao asaph na configuração. Depois de validar o QR/Base64, o asaph notifica o seu sistema com um POST HTTPS. Exemplo:

POST /seu/webhook
Content-Type: application/json

{
  "token": "<mesmo token do QR/Base64>",
  "payload": "<código assinado do dispositivo>"
}
  • Responda com sucesso HTTP (2xx) se aceitou o payload.
  • O asaph não segue redirects; use URL HTTPS final na porta 443.
  • Trate retries: a entrega pode ser reenviada em caso de falha transitória.
  • Persista o payload com segurança — ele autentica o dispositivo.

Assinatura HMAC

Todo pareamento exige assinatura. A chave HMAC é fixa e de longa duração: você a fornece ao asaph uma vez e a usa no seu app para assinar cada QR/Base64. No JSON, o campo sig é o HMAC-SHA256 em hexadecimal da mensagem abaixo.

Calcule assim:

mensagem = "{ts};{device};{token}"
sig      = hex(HMAC-SHA256(chave_compartilhada, mensagem))
Campo no QRDescrição
tsUnix time em segundos no momento da geração.
deviceNome do computador (ex.: MacBook).
tokenCódigo da sessão/computador (ecoado no webhook).
sigHMAC em hexadecimal (minúsculo).

Autenticação nas rotas /partner

Todas as rotas exigem:

HeaderValor
AuthorizationBearer <token de identidade> (o JWT desta página)
X-Device-CodeO payload recebido no webhook (código assinado completo)
Authorization: Bearer <token de identidade>
X-Device-Code: <payload do webhook>
Content-Type: application/json

O handshake ativa o dispositivo. Depois disso, as demais rotas exigem status active.

Endpoints

Use os painéis Try it com o token e o device code de Credenciais. As chamadas passam pelo servidor desta documentação.

POST/partner/handshake

Ativa o dispositivo (pendingactive). Chame assim que receber o payload no webhook.

Corpo: nenhum (o código vai no header).

Resposta: 204 No Content em sucesso.

curl -X POST "$BASE_URL/partner/handshake" \
  -H "Authorization: Bearer $PARTNER_TOKEN" \
  -H "X-Device-Code: $DEVICE_CODE"
Try it

Informe o token e o device code em Credenciais para testar ao vivo.

POST /partner/handshake

GET/partner/me

Retorna a organização vinculada ao dispositivo ativo.

{
  "id": "uuid-da-organizacao",
  "name": "Igreja Exemplo",
  "avatar_url": "https://…"
}
Try it

Informe o token e o device code em Credenciais para testar ao vivo.

GET /partner/me

GET/partner/orders

Lista ordens de culto próximas da organização vinculada.

QueryPadrãoDescrição
queryFiltro textual opcional.
take20Quantidade (1–50).
[
  {
    "id": "uuid-da-ordem",
    "service": {
      "id": "uuid-do-culto",
      "name": "Culto de domingo",
      "description": null,
      "date": "2026-09-07T00:00:00Z"
    },
    "time": "2026-09-07T18:00:00Z"
  }
]
Try it

Informe o token e o device code em Credenciais para testar ao vivo.

GET /partner/orders

GET/partner/orders/{id}

Retorna os itens da ordem de culto (músicas, arquivos, referências bíblicas, cabeçalhos, etc.).

[
  {
    "index": 0,
    "type": "song",
    "name": null,
    "notes": null,
    "duration": null,
    "song": {
      "name": "Grande é o Senhor",
      "artists": "Adoradores",
      "source_song": {
        "name": "Grande é o Senhor",
        "artists": "Adoradores",
        "isrc": null,
        "origin": "…",
        "data": {}
      }
    },
    "file": null,
    "bible_reference": null
  },
  {
    "index": 1,
    "type": "file",
    "song": null,
    "file": {
      "id": "uuid-interno",
      "file_id": "id-externo-storage",
      "name": "letra.pdf",
      "mime_type": "application/pdf",
      "kind": "file",
      "md5": "…",
      "size": 20480,
      "provider": "google_drive",
      "download_session_url": "/partner/orders/{order_id}/file/{file_id}/download_session"
    },
    "bible_reference": null
  }
]

Tipos de item comuns: header, item, song, bible, media, file.

Try it

Informe o token e o device code em Credenciais para testar ao vivo.

GET /partner/orders/

GET/partner/orders/{order_id}/file/{file_id}/download_session

Cria uma sessão temporária de download para um arquivo da ordem. Use o file_id retornado em file.file_id (não o UUID interno).

{
  "access_token": "…",
  "url": "https://…"
}
Try it

Informe o token e o device code em Credenciais para testar ao vivo.

GET /partner/orders//file//download_session

DELETE/partner/device

Revoga o dispositivo atual (active revoked). Depois disso, as rotas protegidas passam a falhar até um novo pareamento.

Resposta: 204 No Content.

Try it

Informe o token e o device code em Credenciais para testar ao vivo.

DELETE /partner/device

Erros e boas práticas

  • Sem Authorization ou X-Device-Code válidos, a requisição é rejeitada antes da lógica de negócio.
  • Dispositivo revoked não pode fazer handshake de novo; é preciso um novo pareamento.
  • Trate timeouts e retries no webhook; o asaph pode reenviar a entrega.
  • Não registre o token de identidade nem o X-Device-Code em logs públicos.
  • Prefira armazenar o device code no backend/sessão do aparelho, não em URLs compartilháveis.