Documentação/API REST

API REST

Toda entrada de dados na Holdy converge em um endpoint HTTP. Se o SDK não cobre a sua stack, fale direto com ele.

Endpoint

POST https://holdy.chat/api/v1/events
Authorization: Bearer hol_live_...
Content-Type: application/json

Sucesso responde 202 com { ok, event_id, ingested_at }. Erros seguem RFC 7807 (problem+json) com status 400, 401 ou 500.

Envelope

CampoTipoObrigatórioSemântica
eventstringsimNome do evento, sem canonicalização ("invite_sent", "workflow.blocked").
occurred_atISO 8601Quando ocorreu no seu produto. Default: horário do servidor.
user_idstring ≤200ID do usuário final no seu produto.
anonymous_idstring ≤200ID persistido no browser antes do login.
propertiesobjectPropriedades livres do evento. Default {}.
contextobjectMetadata (página, device). Use context.account_external_id para associar a conta pela chave do seu produto.
external_idstring ≤200ID do evento na origem, para deduplicação idempotente.

Exemplo

curl -X POST https://holdy.chat/api/v1/events \
  -H "Authorization: Bearer hol_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "event": "invite_sent",
    "user_id": "user_42",
    "properties": { "plan": "pro" },
    "context": { "account_external_id": "acme-inc" }
  }'

Envio em lote

POST /api/v1/events/bulk aceita um array de até 500 envelopes. A aceitação é parcial: eventos inválidos voltam em rejected com o índice, os demais entram. Reenviar o batch inteiro após uma falha é seguro.

Deduplicação

Se você enviar external_id, o mesmo evento reenviado responde 202 com deduped: true em vez de duplicar — idempotência sem esforço, ideal para retries e backfills. Eventos sem external_id nunca colidem entre si.

Identidade

Envie os IDs que você tem (user_id, anonymous_id, properties.email, context.account_external_id) e a Holdy resolve usuário e conta do lado dela. Você nunca precisa conhecer IDs internos da Holdy.