Pular para o conteúdo

GET /v1/decisions

Liste auditorias de roteamento por sessão, janela de tempo, estratégia, modelo, ou um lote específico de request ids. Projetado para puxar todas as decisões de uma conversa para um notebook, ou para queries ad-hoc de auditabilidade a partir de um SIEM.

O endpoint de listagem nunca produz uma linha decision_trace própria.

GET https://api.floopy.ai/v1/decisions
Authorization: Bearer <your-floopy-api-key>
  • Permissão: read_permission.
  • Flag de plano: has_audit_api. Disponível nos planos Free e Pro.
  • Atrás do kill switch de canary por organização.

Pelo menos um de session_id, (from, to), ou request_ids é obrigatório.

FieldTypeRequiredConstraintsDefault
session_idstringConditionalO session id enviado no header floopy-session-id.
fromISO8601ConditionalInício inclusivo do intervalo de tempo.
toISO8601ConditionalFim inclusivo do intervalo de tempo. to - from ≤ 31 dias.
request_idsarray of UUIDConditionalAté 50 ids. Sempre avaliado em conjunto com o predicado da organização do chamador.
routing_strategystringNoUm de feedback_driven, smart_cost, fallback, round_robin, weighted, latency_based, legacy_model.
modelstringNoFiltra por um id de modelo específico (ex.: gpt-4o).
min_confidencenumberNoLimite inferior, [0.0, 1.0]. Filtra em confidence >= min_confidence.
max_confidencenumberNoLimite superior, [0.0, 1.0].
limitintegerNo1..=200.50
cursorstringNoToken opaco de continuação assinado por HMAC, retornado por uma resposta anterior.

O body da resposta tem semântica deny_unknown_fields — chaves de query desconhecidas retornam 400 invalid_request.

{
"items": [
{
"request_id": "0c4a1d3f-7bea-4a1f-8b6e-2c0a8e4d3f10",
"request_created_at": "2026-05-05T17:42:11Z",
"session_id": "sess_demo_1",
"routing_strategy": "feedback_driven",
"phase": "auto",
"weights": { "session": 0.5, "auto": 0.3, "manual": 0.1, "benchmark": 0.1 },
"candidates": [{ "provider": "openai", "model": "gpt-5.4-mini", "score": 0.81 }],
"filtered": [],
"winner": { "provider": "openai", "model": "gpt-5.4-mini" },
"reason": "dispatched",
"confidence": 0.78,
"confidence_reason": "ok",
"exploration_rate_effective": 0.05,
"used_shared_pool_prior": false,
"outcome": {
"status": 200,
"latency_ms": 412,
"cost_micro_usd": 230,
"cache_hit": false,
"threat_blocked": false,
"fallback_used": false
}
}
],
"next_cursor": "eyJ0cyI6IjIwMjYtMDUtMDVUMTc6NDI6MTFaIiwiaWQiOiIwYzRhMWQzZi03YmVhLTRhMWYtOGI2ZS0yYzBhOGU0ZDNmMTAifQ.RUVhSV9..."
}
FieldTypeDescription
itemsarrayPágina de decisões, mesmo formato de GET /v1/decisions/{request_id}.
next_cursorstring | nullToken opaco a ser passado de volta como cursor para a próxima página. null quando não há mais resultados.

O cursor é assinado por HMAC usando o pepper secreto do gateway. Cursors adulterados são rejeitados com 400 invalid_cursor. A rotação do pepper invalida todos os cursors em circulação — clientes devem reiniciar a paginação sem cursor após receber 400 invalid_cursor.

Statuserror codeQuando
400missing_filterNenhum de session_id, (from, to), ou request_ids foi informado.
400range_too_wideto - from > 31 days.
400request_ids_too_manyrequest_ids tem mais de 50 entradas.
400invalid_cursorO cursor falhou na verificação HMAC, ou o pepper foi rotacionado.
400invalid_requestChave de query desconhecida, UUID malformado em request_ids, ou tipo inválido.
403read_permission / plan_requiredPermissão ou flag de plano ausente.
429rate_limitedAcima do orçamento por organização ou por key.
5xxinternalFalha upstream.
Terminal window
curl -s -H "Authorization: Bearer $FLOOPY_API_KEY" \
"https://api.floopy.ai/v1/decisions?session_id=sess_demo_1&limit=100"

Paginando por uma janela de tempo:

Terminal window
CURSOR=""
while :; do
RESP=$(curl -s -H "Authorization: Bearer $FLOOPY_API_KEY" \
"https://api.floopy.ai/v1/decisions?from=2026-05-01T00:00:00Z&to=2026-05-05T00:00:00Z&limit=200${CURSOR:+&cursor=$CURSOR}")
echo "$RESP" | jq -c '.items[]'
CURSOR=$(echo "$RESP" | jq -r '.next_cursor // empty')
[ -z "$CURSOR" ] && break
done
  • 60 requests / minuto / organização.
  • 30 requests / minuto / API key.

Mais baixo que o endpoint de decisão única porque cada chamada é mais pesada.