Convenções da API · Developers
Convenções que valem para todo endpoint da API do Dailybot: identificadores, timestamps, casing, paginação, busca, intervalo de datas e versionamento.
Todo endpoint da API pública do Dailybot segue as mesmas convenções para identificadores, timestamps, casing, paginação, busca, intervalo de datas e versionamento. Aprenda uma vez aqui e cada página de referência se lerá exatamente como você espera.
Identificadores
Todo recurso tem um UUID globalmente único (RFC 4122 v4). Dependendo do modelo, a API retorna como uuid (Form, Form Response, User) ou como id (Kudo, Check-in, Workflow) — em ambos os casos o valor é um UUID e serve como chave estável e opaca para a sua integração.
Regra: se o recurso tem uma coluna UUID dedicada separada da sua chave primária interna, a API retorna uuid; se a própria chave primária é um UUID, a API retorna id. Ambos são UUIDs.
| Recurso | Campo identificador |
|---|---|
| Form | uuid |
| Form Response | uuid |
| Agent Report | uuid (também retorna id com o mesmo valor por retrocompatibilidade) |
| Agent Message | uuid (também retorna id com o mesmo valor por retrocompatibilidade) |
| Usuário | uuid |
| Kudo | id (UUID) |
| Check-in (Follow-up) | id (UUID) |
| Workflow | id (UUID) |
Timestamps
Todos os timestamps são ISO-8601 em UTC com precisão de milissegundos (ex. 2026-07-02T14:33:19.412Z). Campos terminados em _at são timestamps; campos terminados em _date são só data (YYYY-MM-DD). Nunca emitimos strings de hora local.
Casing de campos
Todas as chaves JSON são snake_case (first_name, created_at). Os segmentos de path são kebab-case (/pending-invitations/, /agent-reports/). Os parâmetros de query são snake_case (include_email, only_active).
Paginação
Todo endpoint de lista /v1/* retorna o mesmo envelope de resposta:
{
"count": 152,
"next": "https://api.dailybot.com/v1/...?page=2&page_size=50",
"previous": null,
"results": [ ... ]
}
Parâmetros de query
| Parâmetro | Tipo | Padrão | Máx. | Descrição |
|---|---|---|---|---|
page |
integer | 1 | — | Número de página (indexado a partir de 1) |
page_size |
integer | 25 | 100 | Itens por página. Valores > 100 são silenciosamente reduzidos. |
Aliases legados (retrocompatíveis)
| Parâmetro legado | Equivale a |
|---|---|
limit |
page_size |
offset |
Paginação por offset |
Esses aliases retornam o mesmo envelope. As URLs next/previous refletem o estilo usado pelo chamador.
Paginação opt-in removida: O parâmetro de query
?paginated=truee o header de requisiçãoX-Dailybot-Paginate: truesão ignorados. Todo endpoint de lista sempre retorna o envelope.
Campos do envelope de resposta
| Campo | Tipo | Descrição |
|---|---|---|
count |
integer | Total de itens que correspondem (em todas as páginas) |
next |
string | null | URL completa da próxima página, ou null se for a última |
previous |
string | null | URL completa da página anterior, ou null se for a primeira |
results |
array | Itens desta página (sempre um array, nunca null) |
Iterar todas as páginas
PAGE=1
while true; do
RESP=$(curl -s "https://api.dailybot.com/v1/forms/?page=$PAGE&page_size=100" \
-H "X-API-KEY: $DAILYBOT_API_KEY")
echo "$RESP" | jq '.results[]'
NEXT=$(echo "$RESP" | jq -r '.next')
[ "$NEXT" = "null" ] && break
PAGE=$((PAGE + 1))
done
Busca
O parâmetro ?search=<termo> está disponível nos endpoints de lista que expõem conteúdo textual. Realiza correspondência de substring sem diferenciação de maiúsculas/minúsculas, aplicada após o escopo de papel. Combina com paginação e filtros de intervalo de datas.
Comprimento máximo: 256 caracteres. Requisições que excedem esse limite retornam 400 com code: "search_query_too_long".
Endpoints que suportam busca
| Endpoint | Campos buscados |
|---|---|
GET /v1/forms/?search=<termo> |
Nome do form |
GET /v1/checkins/?search=<termo> |
Nome do check-in |
GET /v1/forms/{uuid}/responses/?search=<termo> |
Conteúdo das respostas |
GET /v1/checkins/{uuid}/responses/?search=<termo> |
Conteúdo das respostas |
GET /v1/kudos/?search=<termo> |
Mensagem do kudo |
GET /v1/kudos/organization/?search=<termo> |
Mensagem do kudo |
GET /v1/workflows/?search=<termo> |
Nome do workflow |
GET /v1/followups/?search=<termo> |
Nome do check-in (alias depreciado de /v1/checkins/) |
GET /v1/users/?search=<termo> |
Nome completo, e-mail |
curl "https://api.dailybot.com/v1/forms/?search=retro&page_size=10" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Intervalo de datas
Um filtro de intervalo de datas com reconhecimento de fuso horário está disponível em todo endpoint paginado.
Parâmetros canônicos
| Parâmetro | Formato | Descrição |
|---|---|---|
start_date |
YYYY-MM-DD |
Início inclusivo — 00:00:00 no fuso horário do chamador |
end_date |
YYYY-MM-DD |
Fim inclusivo — 23:59:59.999999 no fuso horário do chamador |
Comportamento de fuso horário: As datas são interpretadas no fuso horário do usuário autenticado (do perfil). Usa UTC como fallback se nenhum fuso horário estiver configurado.
Também aceitos (aliases legados)
| Parâmetros legados | Equivalente |
|---|---|
date_start / date_end |
start_date / end_date |
date_from / date_to |
start_date / end_date |
Composição
Combina com ?search= e paginação:
curl "https://api.dailybot.com/v1/checkins/{uuid}/responses/?start_date=2026-07-01&end_date=2026-07-31&search=blocker&page_size=100" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Erro: Datas mal formadas retornam 400 com code: "invalid_date_range".
Filtros sem distinção de maiúsculas
Parâmetros de query com estilo enum aceitam qualquer capitalização. Por exemplo, ?filter=kudos_received, ?filter=KUDOS_RECEIVED e ?filter=Kudos_Received resolvem todos para kudos_received. Valores inválidos retornam 400 com code: "invalid_kudos_filter".
Versionamento
A API pública é versionada por prefixo de URL (/v1/). Mudanças aditivas (novos endpoints, novos campos opcionais, novos valores de enum com fallback) podem chegar a qualquer momento. Mudanças breaking chegam em um novo prefixo (/v2/) com uma janela mínima de sunset de 6 meses sobre a versão anterior. Veja /pt/developers/api-changelog.
Idempotência
Todo GET, PATCH, DELETE é idempotente por semântica HTTP — reenviá-los é seguro. Os POST que criam um recurso, no caso geral, não são idempotentes; um retry ingênuo após uma falha de rede pode criar recursos duplicados. Ao fazer retry após um 5xx ou erro de rede, primeiro releia o recurso pela sua chave natural (e-mail, nome, id externo) e só re-crie se a leitura retornar 404. A política de retry vive em /pt/developers/errors#retry-policy.
null vs. ausente
Um campo definido como null significa explicitamente “este atributo não tem valor”. Um campo ausente da resposta significa “o chamador não tem permissão de vê-lo” ou “o campo não foi solicitado via include-flag”. Não os trate como iguais.