API de dados
Se você não usa um gateway que integramos, mande os dados direto pra cá. Você também pode digitá-los na tela ou subir uma planilha: é a mesma fonte, pelas mesmas regras. Nenhuma linha de código é obrigatória.
Nesta fonte, quem informa os dados é você. Não há gateway do outro lado para conferir nada, então o que você declarar aqui é a verdade sobre a qual todo número da sua conta é calculado. Se o seu sistema parar de enviar, o seu painel congela no último dado, e a gente avisa.
Começando
- No Metricaas, adicione uma fonte do tipo Dados customizados e responda às três perguntas (se você vai informar pagamentos, se cada assinatura tem plano, se vai cadastrar clientes).
- Em Configurações > API, gere uma chave. Ela aparece uma única vez.
- Mande as suas assinaturas. O painel se move em até um minuto.
Autenticação
Toda chamada leva a sua chave no cabeçalho. A chave pertence à sua empresa e diz em qual fonte ela escreve.
Authorization: Bearer mtc_live_...
Endereço base: https://api.metricaas.ai/v1Guardamos apenas um resumo criptográfico da chave, então nem nós conseguimos mostrá-la de novo. Perdeu, gere outra e revogue a antiga.
A primeira chamada
Criar e atualizar são a mesma chamada: o id é seu, e mandar o mesmo id de novo atualiza em vez de duplicar.
curl -X POST https://api.metricaas.ai/v1/subscriptions \
-H "Authorization: Bearer mtc_live_..." \
-H "Content-Type: application/json" \
-d '{"id":"sub_001","customer":"cli_001","plan":"Pro","currency":"BRL","cycle":"monthly","started_at":"2024-01-10","amounts":[{"from":"2024-01-10","cents":9990},{"from":"2025-03-01","cents":12990}]}'Mande em LOTE (um array no corpo, até 1000 objetos). Ou tudo entra, ou nada entra: um lote meio-aplicado deixaria você sem saber o que entrou.
O valor é uma HISTÓRIA, não um número
Num gateway, a história do preço mora nas faturas: cada uma é um período cobrado, com o preço daquele dia. Aqui não há faturas, então a história mora dentro da assinatura, no campo `amounts`.
Cada faixa diz quanto ela passou a valer, e desde quando. A primeira começa no início da assinatura. É isso que faz o MRR de março continuar sendo o de março depois que você reajusta o preço em abril.
{
"amounts": [
{
"from": "2024-01-10",
"cents": 9990
},
{
"from": "2025-03-01",
"cents": 12990
}
]
}Por isso, um envio que ENCURTE ou ALTERE uma faixa já declarada é recusado com 409: ele reescreveria o MRR de meses que já fecharam. Se foi um reajuste, acrescente uma faixa nova. Se foi erro de digitação, confirme que você quer mesmo reescrever:
POST https://api.metricaas.ai/v1/subscriptions?correct_history=trueCancelar não é apagar
Cancelar é um fato do seu negócio: o cliente saiu, a assinatura fica no histórico e vira churn na data declarada. Apagar é uma errata: aquilo nunca existiu, e o MRR passado se refaz sem ele. Confundir os dois corrompe o seu churn nas duas direções.
# o cliente saiu (vira churn)
PUT https://api.metricaas.ai/v1/subscriptions/sub_001 { "canceled_at": "2026-03-01", ... }
# eu digitei errado (some da historia)
DELETE https://api.metricaas.ai/v1/subscriptions/sub_001/v1/customers
Opcional. Só é preciso se um mesmo cliente tiver mais de uma assinatura. O único campo obrigatório é o id, então dá para agrupar sem nos contar quem eles são.
| Campo | Tipo | Obrigatório | O que é |
|---|---|---|---|
id | string | O identificador que VOCÊ escolhe. Mandar o mesmo id de novo atualiza o cliente, não duplica. | |
name | string | Nome do cliente. Opcional: você não precisa nos revelar quem ele é. | |
email | string | E-mail do cliente. | |
created_at | date | Quando ele virou seu cliente. |
{
"id": "cli_001",
"name": "Empresa Exemplo",
"email": "contato@exemplo.com"
}/v1/subscriptions
O coração da fonte. É daqui que sai o seu MRR.
| Campo | Tipo | Obrigatório | O que é |
|---|---|---|---|
id | string | O identificador que VOCÊ escolhe. Mandar o mesmo id de novo atualiza a assinatura, não duplica. | |
customer | string | O id do cliente dono desta assinatura. Em branco, a assinatura conta como um cliente (você não precisa cadastrar clientes). | |
plan | string | O nome do produto que ela assina. Só tem efeito se a sua fonte declarar planos. | |
currency | enum(BRL | USD | EUR | GBP | ...) | A moeda desta assinatura, em ISO-4217. Moeda desconhecida é recusada, nunca assumida. | |
cycle | enum(daily | weekly | biweekly | monthly | bimonthly | quarterly | semiannually | yearly) | De quanto em quanto tempo você cobra por ela. | |
started_at | date | Quando ela começou. A primeira faixa de `amounts` tem que começar exatamente aqui. | |
canceled_at | date | Quando ela foi cancelada. É a data do churn, e ela é declarada: não há gateway aqui para nos contar. | |
trial_end | date | Quando o teste grátis terminou. O período até esta data nunca vira MRR. | |
amounts | array<{ from: date, cents: integer }> | A HISTÓRIA do valor, datada. Não é um valor: é a lista de quanto ela valeu, e desde quando. Leia a seção acima antes de mexer aqui. |
{
"id": "sub_001",
"customer": "cli_001",
"plan": "Pro",
"currency": "BRL",
"cycle": "monthly",
"started_at": "2024-01-10",
"amounts": [
{
"from": "2024-01-10",
"cents": 9990
},
{
"from": "2025-03-01",
"cents": 12990
}
]
}/v1/payments
Opcional. Se você declarar os pagamentos, ganha inadimplência, receita recebida, taxas e estornos. Se não, o MRR continua inteiro e a inadimplência simplesmente não existe na sua conta.
| Campo | Tipo | Obrigatório | O que é |
|---|---|---|---|
id | string | O identificador que VOCÊ escolhe. | |
customer | string | O id de quem pagou. Ou este, ou `subscription`: um pagamento sempre diz de quem é. | |
subscription | string | O id da assinatura que este pagamento quita. Em branco, é venda avulsa (não entra no MRR; entra na receita). | |
amount_cents | integer | O valor bruto pago, em centavos. | |
paid_at | date | Quando o dinheiro entrou. | |
fee_cents | integer | A taxa do meio de pagamento, em centavos. | |
refunded_cents | integer | Quanto voltou para o cliente, em centavos. Estorno parcial é válido. | |
currency | enum | Se ficar em branco, usamos a da assinatura (ou a da sua conta, se for avulso). |
{
"id": "pay_001",
"customer": "cli_001",
"subscription": "sub_001",
"amount_cents": 9990,
"paid_at": "2024-02-10",
"fee_cents": 349
}Erros
A recusa lista TODOS os problemas de uma vez, com o campo (e, na planilha, a linha). Você não vai consertar um por requisição.
{
"error": {
"code": "invalid_request",
"message": "a declaracao tem 2 problema(s)",
"details": [
{
"field": "subscription.cycle (sub_002)",
"line": 4,
"reason": "invalid option"
},
{
"field": "subscription.amounts (sub_007)",
"line": 9,
"reason": "..."
}
]
}
}202— aceito. O seu painel se move em até um minuto.400— a declaração tem problemas. Nada foi gravado.401— chave inválida, revogada, ou sem permissão para esta operação.409— isto reescreveria o histórico de valor já declarado. Veja a seção acima.429— muitas requisições. Mande em lote.
Conferindo o que você declarou
O GET devolve o que está no seu cofre, paginado por cursor. Esta mesma chave vai ler as suas métricas quando a API de leitura existir.
GET https://api.metricaas.ai/v1/subscriptions?limit=100&cursor=sub_050