Pular para o conteúdo principal

Eventos de Uso

Registro e consulta de eventos de uso para cobrança baseada em consumo.

Endpoints

MétodoEndpointDescriçãoPermissão
POST/billing/api/v1/usageRegistrar eventoBILLING_USAGE_CREATE
POST/billing/api/v1/usage/batchRegistrar em loteBILLING_USAGE_CREATE
GET/billing/api/v1/usage/summaryResumo de usoBILLING_USAGE_READ

Atributos do Evento

CampoTipoDescrição
billingAccountIdstring (UUID)ID da conta de faturamento
meterIdstring (UUID)ID do medidor (opcional se usar eventName)
eventNamestringNome do evento (opcional se usar meterId)
idempotencyKeystringChave única para deduplicação
eventTimestampdatetimeTimestamp do evento
quantitynumberQuantidade/valor do evento
propertiesobjectPropriedades adicionais

Registrar Evento de Uso

POST /billing/api/v1/usage

Registra um único evento de uso. Usa idempotencyKey para evitar duplicatas.

Atributos

CampoTipoObrigatórioDescrição
billingAccountIdstringSimID da conta de faturamento
meterIdstringNão*ID do medidor
eventNamestringNão*Nome do evento
idempotencyKeystringSimChave única para deduplicação
eventTimestampdatetimeNãoTimestamp (default: agora)
quantitynumberSimQuantidade do evento
propertiesobjectNãoMetadados adicionais

*Forneça meterId ou eventName (o sistema associa via eventName do medidor).

curl -X POST 'https://billing.stg.catalisa.app/billing/api/v1/usage' \
-H 'Authorization: Bearer SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"type": "usage-events",
"attributes": {
"billingAccountId": "550e8400-e29b-41d4-a716-446655440050",
"meterId": "550e8400-e29b-41d4-a716-446655440010",
"idempotencyKey": "req-2024-01-15-001",
"quantity": 100,
"properties": {
"endpoint": "/api/v1/users",
"method": "GET"
}
}
}
}'

Response (201 Created)

{
"data": {
"type": "usage-events",
"id": "550e8400-e29b-41d4-a716-446655440100",
"links": {
"self": "/billing/api/v1/usage/550e8400-e29b-41d4-a716-446655440100"
},
"attributes": {
"billingAccountId": "550e8400-e29b-41d4-a716-446655440050",
"meterId": "550e8400-e29b-41d4-a716-446655440010",
"idempotencyKey": "req-2024-01-15-001",
"eventTimestamp": "2024-01-15T10:30:00Z",
"quantity": 100,
"properties": {
"endpoint": "/api/v1/users",
"method": "GET"
}
}
},
"meta": {
"isDuplicate": false
}
}

Registrar Eventos em Lote

POST /billing/api/v1/usage/batch

Registra múltiplos eventos de uso em uma única requisição (até 1000 eventos).

curl -X POST 'https://billing.stg.catalisa.app/billing/api/v1/usage/batch' \
-H 'Authorization: Bearer SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"data": [
{
"type": "usage-events",
"attributes": {
"billingAccountId": "550e8400-e29b-41d4-a716-446655440050",
"eventName": "api.request",
"idempotencyKey": "batch-001-event-1",
"quantity": 50
}
},
{
"type": "usage-events",
"attributes": {
"billingAccountId": "550e8400-e29b-41d4-a716-446655440050",
"eventName": "api.request",
"idempotencyKey": "batch-001-event-2",
"quantity": 75
}
}
]
}'

Response (201 Created)

{
"data": [
"550e8400-e29b-41d4-a716-446655440101",
"550e8400-e29b-41d4-a716-446655440102"
],
"meta": {
"recorded": 2,
"duplicates": 0,
"errors": 0
}
}

Response com Erros Parciais

{
"data": [
"550e8400-e29b-41d4-a716-446655440101"
],
"meta": {
"recorded": 1,
"duplicates": 1,
"errors": 1
},
"errors": [
{
"index": 2,
"idempotencyKey": "batch-001-event-3",
"error": "Meter not found"
}
]
}

Obter Resumo de Uso

GET /billing/api/v1/usage/summary

Retorna o resumo de uso agregado por medidor em um período.

Query Parameters

ParâmetroTipoObrigatórioDescrição
billingAccountIdUUIDSimID da conta de faturamento
meterIdUUIDNãoFiltrar por medidor
startDatedatetimeSimData inicial do período
endDatedatetimeSimData final do período
curl 'https://billing.stg.catalisa.app/billing/api/v1/usage/summary?billingAccountId=550e8400-e29b-41d4-a716-446655440050&startDate=2024-01-01T00:00:00Z&endDate=2024-01-31T23:59:59Z' \
-H 'Authorization: Bearer SEU_TOKEN'

Response (200 OK)

{
"data": {
"type": "usage-summary",
"attributes": {
"billingAccountId": "550e8400-e29b-41d4-a716-446655440050",
"periodStart": "2024-01-01T00:00:00Z",
"periodEnd": "2024-01-31T23:59:59Z",
"items": [
{
"meterId": "550e8400-e29b-41d4-a716-446655440010",
"meterName": "API Calls",
"aggregationType": "SUM",
"aggregatedValue": 15000,
"eventCount": 150
},
{
"meterId": "550e8400-e29b-41d4-a716-446655440011",
"meterName": "Storage Used",
"aggregationType": "LAST",
"aggregatedValue": 5368709120,
"eventCount": 30
}
]
}
}
}

Boas Práticas

Idempotência

Sempre use uma idempotencyKey única e determinística:

// Bom: baseado em dados do evento
const idempotencyKey = `${userId}-${eventType}-${timestamp}`;

// Ruim: aleatório (não permite retry seguro)
const idempotencyKey = Math.random().toString();

Batch vs Individual

CenárioRecomendação
Tempo real, poucos eventosIndividual
Processamento batch, muitos eventosBatch
Importação históricaBatch (max 1000/request)

Timestamp

Sempre inclua eventTimestamp quando o evento ocorreu no passado:

// Evento em tempo real (pode omitir timestamp)
{ quantity: 1 }

// Evento histórico (sempre incluir timestamp)
{
quantity: 1,
eventTimestamp: '2024-01-14T10:30:00Z'
}

Erros Comuns

CódigoErroDescrição
400VALIDATIONDados inválidos ou período inválido
404NOT_FOUNDConta ou medidor não encontrado
409DUPLICATEEvento com mesma idempotencyKey já existe