Ir para o conteúdo principal

API da Era

Endpoints, autenticação, paginação e limites da API da Era, com requisições prontas para copiar.

Última atualização: 1 de outubro de 2026

Ainda em beta

Esses endpoints funcionam hoje, mas a API ainda está evoluindo, então alguns detalhes podem mudar. Veja a data da última atualização no topo para saber quando esta página foi revisada pela última vez.

Início rápido

Antes de começar, você precisa de uma conta da Era com pelo menos uma instituição conectada: sem conexão, esses endpoints não têm o que devolver.

  1. 1

    Entre na Era e conecte uma instituição, se ainda não tiver feito isso.

  2. 2

    Abra suas chaves de API no painel e crie uma. A maioria dos escopos vem marcada; os que podem mover dinheiro, negociar investimentos, mudar a sua cobrança, apagar os seus documentos ou criar mais chaves, não. Desmarque os que você não precisa. Para ler, você precisa de banking:read, e para mudar qualquer coisa, de banking:write. Você também escolhe uma validade; não existe opção de nunca expirar.

  3. 3

    Copie a chave e guarde-a em um lugar seguro, como um gerenciador de segredos. Ela aparece uma vez só, então, se você perdê-la, crie uma nova.

  4. 4

    Mande no cabeçalho junto com a sua requisição.

cURL
curl "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
  -H "X-API-Key: fmk_your_key_here"
Resposta · 200
{
  "transactions": [ … ],
  "pagination": {
    "currentPage": 1,
    "pageSize": 20,
    "totalItems": 412,
    "totalPages": 21
  },
  "historyWindowApplied": true,
  "historyWindowFloorDate": "2026-06-28",
  "historyWindowHiddenCount": 137,
  "historyWindowEarliestDate": "2024-03-02",
  "historyWindowDegraded": false
}

Vai escrever o seu próprio cliente? Gere-o a partir do documento OpenAPI em https://forge.era.app/api/openapi/public.json. Ele descreve todos os endpoints desta página — cada campo, cada status e cada tipo de filtro e ação de regra — e é servido pela própria API, então não fica para trás.

Endpoints

Dezessete endpoints: oito de leitura e nove de escrita.

Autenticação

Envie sua chave de uma das duas formas:

Métodos de autenticação
Cabeçalho
X-API-Key: fmk_your_key_here
Token Bearer
Authorization: Bearer fmk_your_key_here

Toda requisição é criptografada com TLS.

As chaves expiram, e você escolhe em quanto tempo ao criar. O máximo é 90 dias no plano gratuito e 365 num pago — não existe opção de nunca expirar, então o que você construir em cima disso precisa de um plano para rotacionar a chave antes que ela vença.

Cabeçalhos de resposta

Os cabeçalhos X-RateLimit-* informam seu orçamento diário, então você só vai vê-los num plano que publique um. Por enquanto, só o plano gratuito publica. Mesmo nele, trate-os como opcionais: uma resposta sem eles quer dizer que a contagem é desconhecida, não que algo deu errado. Todo 429 traz Retry-After.

Cabeçalhos de resposta
X-RateLimit-Limit
O orçamento diário do seu plano. Enviado só em planos que publicam um orçamento diário, e nunca num 429 de qualquer outro limite.
X-RateLimit-Remaining
O que resta do seu orçamento diário. Nunca abaixo de zero. Enviado só em planos que publicam um orçamento diário, e nunca num 429 de qualquer outro limite.
X-RateLimit-Reset
Quando seu orçamento diário libera mais uma requisição, como timestamp Unix em segundos. Não é quando o orçamento inteiro se renova: o orçamento é contínuo, então as requisições voltam uma de cada vez. Enviado só em planos que publicam um orçamento diário, e nunca num 429 de qualquer outro limite. O teto de rajada por minuto não tem cabeçalho próprio. Veja Limites
Retry-Aftersó em um 429
Todo 429 traz Retry-After: espere esses segundos e tente de novo. Um 429 que também traz os cabeçalhos X-RateLimit-* foi recusado pelo orçamento diário do plano gratuito. Um 429 sem eles foi recusado por outro limite, como o teto de rajada por minuto. O Retry-After pode ir de um segundo a 24 horas. Veja Limites

Erros

A API retorna estes códigos de status de erro:

  • 400

    Entrada malformada: um parâmetro incorreto, uma atualização em lote vazia ou com mais de 100 itens, uma escrita que define e limpa o mesmo campo na mesma chamada, ou uma regra que não se sustenta. Excluir, ligar ou desligar uma regra também recusa qualquer chave de consulta que não aceite, e o 400 diz qual é.

  • 401

    Sem chave, ou uma que não pode ser interpretada. Envie-a no cabeçalho X-API-Key ou como token bearer.

  • 402

    Uma cota do plano está no caminho. Hoje, isso só acontece ao criar uma categoria ou uma regra de padrão. Esperar não resolve, mas um plano maior resolve. Chamar rápido demais é um 429.

  • 403

    A chave não carrega o escopo que essa chamada precisa — ou, em qualquer uma das duas escritas de transações, o id pertence a outra pessoa ou não existe. A API não distingue esses dois casos. Uma regra da biblioteca da Era responde 403 quando você tenta excluí-la, ou mudar o nome, a descrição, a prioridade, as datas ou o applicationScope dela. Mudar os filtros, as ações ou o grupo dela dá um 400.

  • 404

    Algo que não existe. O endpoint de saldo devolve isso sem corpo para um accountGroupKey que não indica nenhuma conta, ou que nem tem formato de chave. Os endpoints de regras devolvem isso para uma chave de regra que não é sua. Transações nunca dão 404 — veja 403.

  • 409

    Outra coisa mudou a linha enquanto você escrevia — em uma regra, isso é uma version que não é mais a atual. Leia-a de novo e envie sua escrita de novo. Em uma regra, um 409 também pode querer dizer que as ações dela disparariam regras em ciclo; nesse caso, mude as ações.

  • 429

    Requisições demais. Você gastou seu orçamento diário no plano gratuito ou bateu em outro limite, como o teto de rajada por minuto. Retry-After diz quanto esperar, de um segundo a 24 horas, e, diferente de um 402, esperar libera sua próxima requisição. Veja em Limites os números publicados e o que um 429 te diz.

Formatos de erro

A maioria dos erros volta na mesma forma: statusCode, message e um objeto errors que nomeia o que deu errado. Nem todos: um 401, e o 404 do endpoint de saldo, voltam sem corpo nenhum, então leia o status antes de ler o corpo.

Exemplo
{
  "statusCode": 403,
  "message": "One or more errors occurred!",
  "errors": {
    "generalErrors": ["Transaction does not belong to the authenticated user"]
  }
}

Erros comuns

  • Definir um campo e limpá-lo na mesma escrita — 400.

  • Mais de 100 ids em uma atualização em lote — 400, e nada é alterado. Menos de um é igual.

  • Uma transação que não é sua, ou que não existe — 403, nunca 404. Então a resposta nunca diz se um id existe, só que não é seu para ver.

  • Outra coisa mudou a linha primeiro — 409.

Limites

Dois dos endpoints documentados limitam quanto você pode pedir em uma única chamada. Os demais não.

Sem teto por chamada não significa ilimitado. As chaves continuam expirando, as escritas continuam com limites de tamanho de campo, criar uma categoria ou uma regra de padrão pode atingir uma cota do plano, seu plano ainda pode ocultar histórico antigo e toda chamada conta para os limites de taxa do seu plano, explicados abaixo.

  • Contas, saldo, resumo, as listas de categorias e tags, criar uma categoria, criar uma tag, a escrita de uma única transação e todos os endpoints de regras não têm limite de volume por chamada. Você recebe o conjunto inteiro de volta, ou a única linha que você nomeou — exceto a pré-visualização de uma regra, que conta as correspondências, mas devolve no máximo 50 das chaves delas e 10 amostras.

  • pageSize é limitado a 100, não recusado. Peça mais e você recebe 100 linhas de volta com um 200 — leia pagination.pageSize na resposta em vez de confiar no que você enviou.

  • A escrita em lote de transações é limitada a 100 ids, e diferente de pageSize ela é recusada em vez de limitada: envie 101 e você recebe um 400, e nada muda.

  • As chaves expiram conforme o prazo que você escolhe na criação — até 90 dias no plano gratuito, 365 em um pago. Não existe opção que nunca expira.

  • Seu plano pode aplicar um piso de janela de histórico que esconde transações mais antigas. A resposta de transações carrega os campos historyWindow que dizem se um piso se aplicou e onde ele caiu.

Limites de taxa

A Era publica dois limites de taxa. Todo plano tem um teto de rajada: um limite de requisições em qualquer minuto móvel. O plano gratuito também tem um orçamento diário: um limite de requisições em qualquer período móvel de 24 horas. Uma requisição deixa de contar para o teto de rajada um minuto depois de feita, e para o orçamento diário, um dia depois. Os planos pagos não têm orçamento diário publicado por enquanto. Passou de qualquer um dos dois, ou de qualquer outro limite que a API aplica, a chamada volta com 429.

Os limites são da sua conta, não de uma chave. Toda chave REST que você cria usa o mesmo teto de rajada e, no plano gratuito, o mesmo orçamento diário, então uma segunda chave não te dá mais chamadas. As chamadas de ferramentas MCP são contadas à parte, então chamadas REST e MCP nunca consomem os limites uma da outra.

Limites de taxa por plano
PlanoOrçamento diárioTeto de rajada
Básico100 por dia10 por minuto
OrganizeNenhum30 por minuto
AutomateNenhum60 por minuto
OptimizeNenhum60 por minuto
OperateNenhum120 por minuto

Por enquanto, os planos pagos não têm orçamento diário publicado.

Os planos pagos também seguem o uso justo: a API é para scripts, painéis e integrações com seus próprios dados financeiros, num volume que faz sentido para uma pessoa.

Nenhum cabeçalho informa o teto de rajada em nenhum plano, então controle o ritmo pela tabela. No plano gratuito, X-RateLimit-Remaining pode marcar bem acima de zero logo antes de uma rajada voltar com 429.

O que um 429 te diz

Qual limite recusou você. Um 429 com os cabeçalhos X-RateLimit-* veio do orçamento diário do plano gratuito; um sem eles veio de outro limite, como o teto de rajada. O corpo é problem-details, e o campo detail diz quando sua próxima requisição é liberada. Quando o orçamento diário ou o teto de rajada recusou você, ele também nomeia esse limite, quanto ele permite e o plano que aumenta ou remove o limite, ou que você já está no mais alto. Ele é escrito para pessoas, então leia os cabeçalhos em vez de analisá-lo.

Resposta 429, orçamento diário
{
  "type": "https://httpstatuses.com/429",
  "title": "Too Many Requests",
  "status": 429,
  "detail": "You've used up your daily budget of 100 requests. Your next request frees up at 2026-09-16T09:00:00Z. The Organize plan removes it."
}

Todo 429 também traz Retry-After: um número inteiro de segundos, de um segundo a 24 horas. A espera do teto de rajada é de no máximo um minuto; o orçamento diário do plano gratuito pode pedir as 24 horas inteiras. Uma chamada recusada não conta para nenhum limite, mas não tente de novo antes da hora: espere o Retry-After acabar em todo 429. Com o orçamento diário e o teto de rajada, uma nova tentativa antecipada é recusada de novo e, quando a espera termina, uma requisição é liberada, não o limite inteiro. Envie e leia o que volta: outro Retry-After se for recusada ou, no plano gratuito, os cabeçalhos quando for atendida.

Limites de taxa não protegem uma chave que você perdeu de vista. Uma chave vazada desconta dos mesmos limites que todas as outras chaves da sua conta, e pode fazer tudo o que os escopos dela permitem. Revogá-la não devolve as chamadas que ela já fez. Se tiver dúvida sobre alguma chave, revogue-a. Veja Segurança e gestão de chaves abaixo.

Convenções

Os campos de resposta são camelCase. Os nomes dos parâmetros de consulta não diferenciam maiúsculas de minúsculas, mas fora isso precisam ser escritos exatamente como esta página mostra, então pageSize e PageSize funcionam os dois. A especificação publicada escreve a maioria em PascalCase. A maioria dos endpoints ignora uma chave de consulta que não aceita, então um filtro escrito errado simplesmente não filtra — confira o que volta. As chamadas de excluir, ligar e desligar uma regra são a exceção: elas recusam qualquer outra chave com um 400 que a nomeia. Mande revert_retroactively com o sublinhado — revertRetroactively é recusado — e só na exclusão e no desligamento, porque ligar aceita só version.

Um campo que nomeia um dia do calendário vem em YYYY-MM-DD. Um campo que nomeia um instante vem em ISO 8601 com o deslocamento de fuso.

Os tamanhos de página são limitados, não recusados. Peça um pageSize de 500 e você recebe 100 linhas e um 200, não um erro — então leia pagination.pageSize de volta em vez de confiar no que você mandou.

Uma resposta pode carregar campos que esta página não lista. Ignore os que você não reconhece em vez de falhar por causa deles — é isso que mantém o seu cliente funcionando conforme a API cresce.

REST é HTTP puro, então não precisa de SDK nenhum para chamar: qualquer linguagem com um cliente HTTP já serve. Não há nada para instalar.

Versionamento e mudanças

A API está em beta, então o que está documentado aqui pode mudar: um endpoint, um campo ou o comportamento de uma chamada.

Não há número de versão no caminho nem cabeçalho de versão. Cada endpoint tem uma única versão ativa, e é a que está documentada aqui.

Changelog

O que mudou na Era Developer Platform, incluindo a API da Era, do mais recente para o mais antigo. Não há email nem feed, então confira o changelog quando for planejar trabalho com a API.

Segurança e gestão de chaves

Aprovar um agente cria uma chave

Quando você aprova um agente por OAuth, a Era cria uma chave de API para ele. Ela aparece na mesma lista do painel que as suas, com um nome que a Era monta a partir do nome do próprio cliente.

Como ela se chama

Auto -- Claude

Ela carrega exatamente os escopos que você aprovou naquela tela, e nada além. Revogue pelo painel e o agente não consegue obter novo acesso até você aprová-lo de novo. Um token que ele já tem continua funcionando até expirar, no máximo em uma hora.

Escritas aparecem no seu registro de atividade, leituras não

Criar e revogar uma chave aparecem no seu registro de atividade, assim como cada chamada de ferramenta que um agente faz por MCP. Uma escrita REST também aparece — como a mudança que ela fez, uma tag criada ou uma transação editada. Uma leitura REST não cria nenhuma entrada. A Era registra essas entradas em qualquer plano, mas ler o registro completo exige Organize ou superior — abaixo disso você vê só as entradas mais recentes. As entradas de uma escrita mostram a sua conta, não a chave que fez a mudança.

Se você ficar em dúvida sobre uma chave, revogue. Uma chave que você mesmo criou para de funcionar no REST e no MCP a partir da próxima requisição. A chave de um agente para de obter novo acesso na hora, e qualquer token que ele já tenha expira em menos de uma hora. Criar outra leva um minuto.

Mais coisas para saber antes de confiar numa chave.
Os escopos são amplos
banking:read cobre muito mais do que as leituras desta página — o mesmo escopo cobre também o resto das leituras da sua conta: saldos, posições, conexões, gastos. Um escopo só, não existe opção mais estreita. Os de escrita também estão no cardápio, assim como os de leitura — então trate qualquer chave como uma senha. Ela age como a sua conta inteira na Era, não como uma parte dela.
banking:write muda a Era, não o seu banco
banking:write muda só o que a Era guarda, não o que o seu banco tem. Ele não consegue mover dinheiro nem fazer pagamentos. Assim como banking:read, banking:write é um escopo único e amplo. Ele cobre as mudanças que você mesmo pode fazer na Era, como a categoria, o nome do comerciante, a nota e o status de revisão de uma transação; categorias, tags e regras de automação; os nomes que a Era mostra para as suas contas e quais delas você vê; e contas manuais com seus saldos e transações. Ele pode iniciar uma nova conexão, mas quem entra no banco continua sendo você, no fluxo do provedor e não pela chave. Ele pode pedir uma nova sincronização, que só faz leitura, ou desconectar uma instituição. Desconectar encerra o vínculo da Era, e a sua conta no banco continua aberta e sem mudanças.
Os escopos não são atualizados
Os escopos de uma chave ficam fixos quando ela é criada e nunca mudam depois. Isso importa para tudo o que um escopo cobre e ainda não está disponível: conceda social:write hoje e a chave ainda vai tê-lo quando as visualizações compartilhadas chegarem. Conceda o que você usa agora, não o que talvez use depois.
Não precisa de aprovação
Criar uma chave não passa por revisão nem lista de espera: ninguém na Era aprova o pedido. Fica escrito no seu registro de atividade assim que você a cria, então uma chave que você não reconhece é fácil de notar.
O acesso ao banco fica fora de alcance
Uma chave não alcança o acesso ao seu banco, porque a Era nunca o tem. Você digita no fluxo de conexão que o provedor de dados executa, não numa tela da Era — o que a Era guarda depois é um token de acesso por conexão, criptografado em repouso com AES-256, que você pode jogar fora desconectando a instituição.
A Era guarda só um hash da sua chave
Sua chave são 256 bits de dados aleatórios. A Era aplica SHA-256 e guarda só o hash, então, se você perder a chave, revogue-a e crie outra.

Recursos principais

Contas

GET/banking/accounts
Escopo necessáriobanking:read

Todas as contas que você consegue ver, em cada instituição conectada, com a contagem das que ficaram de fora ao lado delas: excludedAccountCount, dividida em tierExcludedAccountCount para as contas que o limite de contas do seu plano deixa de fora e userExcludedAccountCount para as que você escondeu. accountLimit é quantas contas o seu plano mostra de uma vez, somando todas as suas conexões. accountLimitLift traz o nome do plano mais barato com espaço para todas as contas que você não escondeu, e vem null quando o seu plano não deixa nada de fora. Cada conta carrega o seu accountGroupKey — o valor que o endpoint de saldo recebe no caminho — e o connectionId ao qual ela pertence, então esta é a primeira chamada a fazer. Aceita connectionId para restringir a uma única conexão (as contagens se restringem junto; accountLimit e accountLimitLift não), e includeExcluded para trazer as contas que o seu plano deixa de fora e as que você escondeu.

Parâmetros de consulta
connectionIdopcional
Restringe a lista às contas de uma única conexão.
includeExcludedopcional
Inclui também as contas que o seu plano deixa de fora e as que você escondeu, com os saldos retidos. O campo visibility de cada linha diz qual é qual: tierExcluded ou userExcluded, e visible nas demais. O endpoint de saldo escreve esses valores de outro jeito, então não use o mesmo parser para os dois. excludedAccountCount continua vindo quando isso é true, e essas contas já estão na lista, então não some as duas coisas. O padrão é false.
Resposta · 200
{
  "accounts": [
    {
      "accountGroupKey": "uagr_7f3c9a21",
      "connectionId": "ucon_4b19e02c",
      "name": "Everyday Checking",
      "currentBalance": 4820.16,
      "supportsTransactions": true,
      …
    }
  ],
  "excludedAccountCount": 1
}

Em uma conta que você escondeu ou que o seu plano exclui, os campos de saldo voltam como null, não como zero — null quer dizer retido, não vazio. supportsTransactions vem null no mesmo espírito: quer dizer que a Era não tem como afirmar, nunca que a resposta é não. O mesmo vale para os campos do plano: se a Era não conseguiu ler o seu plano naquela chamada, tierExcludedAccountCount, userExcludedAccountCount, accountLimit e accountLimitLift voltam todos como null. accountLimit também vem null num plano sem limite de contas, e accountLimitLift quando nenhum plano tem mais espaço ou quando o seu plano não deixa nada de fora.

Saldo de uma conta

GET/banking/accounts/{accountId}/balance
Escopo necessáriobanking:read

One account's balance, with the credit fields filled in when the account is a liability. The path takes that account's accountGroupKey — the same value /banking/accounts returns for it. The key is not checked for shape before the lookup, so a malformed key and an unknown one answer the same way.

Resposta · 200
{
  "accountGroupKey": "uagr_7f3c9a21",
  "currentBalance": 4820.16,
  "availableBalance": 4712.03,
  "creditLimit": null,
  "currencyCode": "USD",
  "availableCredit": null,
  "asOf": "2026-08-11T09:32:00Z",
  "visibility": null
}

Uma conta escondida, ou uma cuja conexão foi cortada, ainda responde 200 — com os campos de saldo em null. Um 404 significa que a conta realmente não existe, ou que a chave não tinha formato de chave. Repare aqui no campo visibility: ele é null quando a conta está visível, tier_excluded quando o limite de contas do seu plano a deixa de fora, user_excluded quando você a escondeu e connection_severed quando a conexão dela foi cortada. Com tier_excluded, accountLimit é o limite do seu plano e accountLimitLift traz o nome do plano mais barato com espaço para todas as contas que você não escondeu, incluindo esta. accountLimitLift vem null em qualquer outro estado, e com connection_severed accountLimit também vem null.

Resumo das contas

GET/banking/accounts/summary
Escopo necessáriobanking:read

Os totais das contas que você consegue ver, por padrão as reais: totalAssets, totalLiabilities e netWorthHint, que é o primeiro menos o segundo. Passe simulationModes para escolher quais modos contam: a lista de contas e os totais cobrem só os que você indicar. includedSimulationModes diz quais modos eles cobrem, em cada resposta. simulationExcludedAccountCount conta as contas que você consegue ver e que ficaram de fora por causa do modo. totalHiddenCount é uma contagem à parte: as contas que o seu plano ou a sua própria configuração de visibilidade esconde, em qualquer modo, e nunca as que simulationModes deixou de fora.

Parâmetros de consulta
simulationModesopcional
Quais tipos de conta somar: live para dinheiro de verdade, paper para a conta de prática de uma corretora, scenario para uma hipotética. Repita o parâmetro para pedir mais de um, como em simulationModes=live&simulationModes=paper. Se você omitir, só as contas reais entram. Um valor vazio ou desconhecido é recusado com um 400 que lista os permitidos.
Resposta · 200
{
  "userId": "7d1c0b93a8e24f60",
  "accounts": [ … ],
  "totalVisibleCount": 6,
  "totalHiddenCount": 2,
  "totalAssets": 48210.75,
  "totalLiabilities": 9327.40,
  "netWorthHint": 38883.35,
  "includedSimulationModes": [ "live" ],
  "simulationExcludedAccountCount": 0,
  "computedAt": "2026-08-11T09:32:00Z"
}

netWorthHint conta só as contas desta resposta, e duas contagens dizem o que ele deixa de fora. simulationExcludedAccountCount são as contas fora dos modos que você pediu. totalHiddenCount são as contas escondidas de você em qualquer modo. Ela se divide em duas: tierExcludedAccountCount para as que o limite de contas do seu plano deixa de fora, e userExcludedAccountCount para as que você mesmo escondeu. As duas vêm null se a Era não conseguiu ler o seu plano naquela chamada. accountLimitLift traz o nome do plano mais barato que traz as primeiras de volta, e vem null quando não há nenhuma. Trate netWorthHint como um número de partida, não como o seu patrimônio líquido definitivo.

Transações

GET/banking/transactions
Escopo necessáriobanking:read

Suas transações, uma página por vez, embrulhadas junto com as contagens de paginação. Aceita page e pageSize (100 é o teto), além de filtros opcionais por conta, período, regras aplicadas e etiquetas atribuídas.

Parâmetros de consulta
accountIdopcional
Restringe às transações de uma conta, pelo seu accountGroupKey.
fromDateopcional
Só transações nesta data ou depois.
toDateopcional
Só transações nesta data ou antes.
pageopcional
Número da página, começando em 1. O padrão é 1.
pageSizeopcional
Linhas por página. O padrão é 50, limitado a 100.
sortByopcional
Campo para ordenar: transactionDate, amount, description, category ou merchantName.
sortDirectionopcional
asc ou desc. O padrão é decrescente.
categoryKeysopcional
Only transactions in these categories, by their fcat_ keys. Takes a list, not a single key, and a transaction matches if its effective category is any one of them. Send the literal "uncategorized" to select the transactions that have no category at all.
searchopcional
Busca de texto completo em comerciante, descrição, categoria, nome da conta e valor.
ruleIdsopcional
Só transações que uma regra de automação tocou, pela chave da regra.
tagKeysopcional
Só transações que carregam uma dessas etiquetas.
reviewStatusesopcional
needs_review, reviewed ou flagged. Aceita uma lista; uma transação corresponde se o seu status de revisão for qualquer um deles.
includeChildrenopcional
With a category filter set, also include transactions in the subcategories of every key you passed. Defaults to false.
includePendingopcional
Também retorna as cobranças pendentes dos últimos 7 dias, marcadas com isPending. O padrão é false. Linhas pendentes são somente leitura.
Resposta · 200
{
  "transactions": [ … ],
  "pagination": {
    "currentPage": 1,
    "pageSize": 20,
    "totalItems": 412,
    "totalPages": 21
  },
  "historyWindowApplied": true,
  "historyWindowFloorDate": "2026-06-28",
  "historyWindowHiddenCount": 137,
  "historyWindowEarliestDate": "2024-03-02",
  "historyWindowDegraded": false
}

Seu plano pode aplicar um corte de janela de histórico, que esconde as transações mais antigas que ele. É por isso que a resposta traz os campos historyWindow: historyWindowApplied diz que o corte realmente escondeu algo, historyWindowFloorDate é onde ele caiu, historyWindowHiddenCount é quantas linhas ficaram atrás, e historyWindowEarliestDate é até onde o seu histórico vai de verdade. Sem eles, um resultado curto é indistinguível de uma conta sem transações mais antigas. Dois deles mudam o que você escreve: historyWindowHiddenCount pode vir como null mesmo quando um corte foi aplicado, então leia null como desconhecido, não como zero; e quando historyWindowDegraded é true, a Era não conseguiu confirmar seu plano naquela leitura, então a data do corte é um palpite, não um fato. Numa leitura paga confirmada, nenhum corte é aplicado e historyWindowApplied volta como false. O limite de contas do seu plano também deixa transações de fora: tierExcludedAccountCount diz quantas das suas contas ele deixa fora desta leitura, e userExcludedAccountCount quantas você escondeu — as duas restritas à conta que você filtrou, se filtrou alguma. As duas vêm null quando a Era não conseguiu ler o seu plano naquela chamada.

Percorrer um histórico longo gasta requisições. Seu plano limita a velocidade com que você pode chamar e, no plano gratuito, quantas chamadas você tem por dia; os planos pagos funcionam com uso justo. Em Limites estão os números por plano, os cabeçalhos de limite e o que um 429 te diz.

Mudar uma transação

Quatro coisas em uma transação são suas para substituir: a categoria, o nome do comerciante, uma nota sua e o status de revisão. Mande só as que você está mudando — o que você deixar de fora permanece como está. O id no caminho é a chave utgr_ da transação. Precisa de banking:write em vez de banking:read, mas só muda a cópia da transação na Era: a do seu banco continua como estava.

PUT/banking/transactions/{id}
Escopo necessáriobanking:write
Corpo da requisição
categoryKeyopcional
A chave fcat_ da categoria a atribuir. Deixe de fora e a transação mantém a categoria que já tem.
merchantNameopcional
Um nome de comerciante seu, com até 1000 caracteres. Deixe de fora e o nome atual permanece.
descriptionopcional
Uma nota sua sobre esta transação, com até 5000 caracteres. Deixe de fora e a nota atual permanece.
clearCategoryopcional
Descarta a sua substituição de categoria, para que a categorização da própria Era volte a valer. O padrão é false.
clearMerchantNameopcional
Descarta a sua substituição de nome do comerciante, para que o nome que o seu banco mandou volte. O padrão é false.
clearDescriptionopcional
Descarta a sua substituição de descrição, para que a descrição que o seu banco mandou volte. O padrão é false.
reviewStatusopcional
Marque como needs_review, reviewed ou flagged.
clearReviewStatusopcional
Descarta a sua substituição de status de revisão. O padrão é false.
Resposta · 200
{
  "transaction": { … }
}

Você recebe de volta a transação inteira atualizada, no mesmo formato que a lista acima devolve — não reproduzido aqui, porque é grande e ainda muda enquanto a API estiver em beta. Definir um campo e limpá-lo na mesma chamada volta como 400. Uma transação que não é sua, ou que não existe, volta como 403 — a API não distingue os dois casos. E se outra coisa mudou a mesma linha enquanto você escrevia, você recebe 409: leia de novo e mande de novo.

Mudar até 100 de uma vez

As mesmas quatro substituições, aplicadas a uma lista de transações em uma única chamada. Todo id da lista recebe as mesmas mudanças — não há variação por transação. Precisa de banking:write em vez de banking:read, mas só muda as cópias dessas transações na Era: as do seu banco continuam como estavam.

PUT/banking/transactions/bulk
Escopo necessáriobanking:write
Corpo da requisição
transactionIds
As chaves utgr_ das transações a mudar. Pelo menos uma, e no máximo 100. Acima de 100 é recusado, não cortado — diferente do pageSize acima, você recebe um 400 e nada muda.
categoryKeyopcional
A chave fcat_ da categoria a atribuir. Deixe de fora e a transação mantém a categoria que já tem.
merchantNameopcional
Um nome de comerciante seu, com até 1000 caracteres. Deixe de fora e o nome atual permanece.
descriptionopcional
Uma nota sua sobre esta transação, com até 5000 caracteres. Deixe de fora e a nota atual permanece.
clearCategoryopcional
Descarta a sua substituição de categoria, para que a categorização da própria Era volte a valer. O padrão é false.
clearMerchantNameopcional
Descarta a sua substituição de nome do comerciante, para que o nome que o seu banco mandou volte. O padrão é false.
clearDescriptionopcional
Descarta a sua substituição de descrição, para que a descrição que o seu banco mandou volte. O padrão é false.
reviewStatusopcional
Marque como needs_review, reviewed ou flagged.
clearReviewStatusopcional
Descarta a sua substituição de status de revisão. O padrão é false.
Resposta · 200
{
  "transactions": [ … ]
}

Você recebe de volta as transações atualizadas, no mesmo formato que a lista acima devolve. Definir um campo e limpá-lo na mesma chamada volta como 400, e uma lista vazia também. Uma lista que contenha uma transação que não é sua, ou que não existe, volta como 403 para a chamada inteira — nada é alterado. Se outra coisa mudou uma dessas linhas enquanto você escrevia, você recebe 409: leia de novo e mande de novo.

Categorias

GET/banking/categories
Escopo necessáriobanking:read

Toda a taxonomia de categorias: cada conjunto de categorias, com as subcategorias aninhadas dentro. A taxonomia é compartilhada, não por conta.

Resposta · 200
{
  "packs": [
    {
      "packSlug": "default",
      "packName": "Era default categories",
      "isDefault": true,
      "categories": [
        {
          "projectionKey": "fcat_food_dining",
          "categoryName": "Food & dining",
          "isTopLevel": true,
          "children": [ … ]
        }
      ]
    }
  ],
  "meterLimit": 25,
  "canCreateCustomCategories": true
}

Adicionar uma categoria

Uma categoria definida pelo usuário sob um pai existente. Precisa de banking:write em vez de banking:read, mas só muda as suas categorias na Era: nada muda no seu banco.

POST
Escopo necessáriobanking:write
Corpo da requisição
slug
Identificador compatível com URL — letras minúsculas, números e hifens, de 2 a 50 caracteres.
parentCategoryKey
A chave fcat_ da categoria sob a qual esta se aninha.
name
Nome de exibição.
descriptionopcional
Descrição opcional.
iconNameopcional
Nome de ícone opcional.
spendingTypeopcional
Classificação de gasto opcional.
displayOrderopcional
Posição de ordenação opcional entre as categorias irmãs.
assignmentEligibilityopcional
Regra opcional sobre a quais transações esta categoria pode ser atribuída.
sourceSystemKeysopcional
Lista opcional de chaves de categorias existentes cujas transações devem ser roteadas para cá daqui em diante.
applyRetroactivelyopcional
Quando true, reavalia também as transações passadas conforme o novo roteamento. O padrão é false.
Resposta · 201
{
  "categoryKey": "fcat_side_hustle_9f2a",
  "overlayProjectionKey": "fcov_9f2a1c",
  "action": "created",
  "isQuotaExceeded": false,
  "createdMappingRuleKeys": [ … ],
  …
}

A resposta também traz retroactiveAffectedCount, mergeSourcesHiddenCount e mergeSourcesTotalCount, que esta página não cobre, além de isQuotaExceeded, quotaExceededMessage e meterGate, que numa categoria criada são sempre false, null e null. Se a cota do seu plano recusar a criação, você recebe um 402 sem nenhum desses campos: o corpo dele é statusCode, message e errors.generalErrors, cuja única entrada diz qual limite você atingiu.

Etiquetas

GET/banking/tags
Escopo necessáriobanking:read

Todas as etiquetas da sua conta, em uma lista só. Sem paginação — uma única resposta devolve todas.

Parâmetros de consulta
tagTypeopcional
Filtra pela origem da etiqueta: user, system ou auto.
includeDeletedopcional
Inclui as etiquetas excluídas. O padrão é false.
Resposta · 200
{
  "tags": [
    {
      "tagKey": "utag_9c2f01ab",
      "name": "business-expense",
      "displayName": "Business expense",
      "tagType": "user",
      "color": "#6DC6BA",
      "transactionCount": 42
    }
  ]
}

Criar uma etiqueta

Uma nova etiqueta, normalizada em minúsculas. Precisa de banking:write em vez de banking:read, mas só muda as suas etiquetas na Era: nada muda no seu banco. Etiquetas de sistema não podem ser criadas pela API; as dos tipos user e auto, sim.

POST
Escopo necessáriobanking:write
Corpo da requisição
name
O nome canônico da etiqueta.
displayNameopcional
Nome de exibição opcional. O padrão é o nome canônico.
tagTypeopcional
user or auto. Defaults to user. system is refused — it is reserved for tags Era creates itself.
coloropcional
Cor hexadecimal opcional para exibição.
iconopcional
Nome de ícone opcional.
Resposta · 201
{
  "tag": {
    "tagKey": "utag_9c2f01ab",
    "name": "business-expense",
    "displayName": "Business expense",
    "tagType": "user",
    "version": 1,
    "createdAt": "2026-08-26T09:15:00Z"
  }
}

Regras

GET/banking/rules
Escopo necessáriobanking:read

Todas as regras de automação da sua conta — as que você criou e as que a Era configurou para você a partir da biblioteca de regras dela —, cada uma com suas condições (filters), o que ela faz (actions), se está ligada e a versão. Sem paginação: uma única resposta devolve todas. Regras desligadas ficam de fora, a menos que você peça.

Parâmetros de consulta
includeInactiveopcional
Devolve também as regras desligadas. O padrão é false.
Resposta · 200
{
  "rules": [
    {
      "id": "rule_4c1e7a90",
      "ruleName": "Coffee shops",
      "isActive": true,
      "version": 3,
      "priority": 10,
      "filters": [{ "type": "merchant_match", "pattern": "Blue Bottle", "mode": "contains" }],
      "actions": [{ "type": "set_category", "categoryKey": "fcat_coffee_shops", "categoryDisplayName": "Coffee shops" }],
      "source": "user",
      "matchedTransactionCount": 42,
      …
    }
  ]
}

filters e actions são listas de objetos tipados. Cada um diz o seu tipo em um campo type — merchant_match ou category entre os filtros, set_category ou add_tag entre as ações —, e o documento OpenAPI linkado no início rápido lista todos os tipos e os campos que cada um aceita.

Criar uma regra

Uma nova regra de automação: condições que selecionam transações e o que acontece com cada uma que elas pegam. Ela roda em toda transação nova a partir daí e, se você pedir, também nas que você já tem. Precisa de banking:write em vez de banking:read, mas só muda as suas regras e transações na Era: nada muda no seu banco.

POST
Escopo necessáriobanking:write
Corpo da requisição
ruleName
Um nome para a regra.
descriptionopcional
Uma nota opcional sobre para que serve a regra.
priorityopcional
Onde a regra roda entre as outras: a mais alta roda primeiro, e quando duas regras definiriam a mesma coisa em uma transação, a mais alta vence. O padrão é zero.
filters
As condições, como uma lista de objetos de filtro tipados — cada um diz o seu tipo em um campo type. Uma transação precisa atender a todas; aninhe filtros and, or e not para combiná-las de outro jeito. Pelo menos uma. Um filtro account_type que indica tipos de conta só funciona em uma regra de padrão; em uma regra de transação, ele é recusado com um 400.
actions
O que acontece com cada transação que a regra pega, como uma lista de objetos de ação tipados: definir uma categoria, adicionar ou remover uma tag, renomear o comerciante, reescrever a descrição, definir um status de revisão, ocultá-la ou marcá-la como transferência. Pelo menos uma, e no máximo uma de cada tipo, exceto as ações de tag. Cada tag precisa já existir e só pode aparecer uma vez.
isActiveopcional
Se a regra começa ligada. O padrão é true.
applyRetroactivelyopcional
Roda a regra também nas transações que você já tem, não só nas novas. Só vale quando a regra começa ligada. O padrão é false.
appliesFromopcional
Só transações nesta data ou depois.
appliesToopcional
Só transações nesta data ou antes.
applicationScopeopcional
Quando a regra roda: prospective só para transações novas, retroactive quando ela é aplicada às existentes, ou both. O padrão é both.
ruleScopeopcional
transaction, o padrão, avalia as transações uma a uma. pattern encontra um padrão em várias — uma cobrança recorrente, um par de transferências — descrito por patternSpec.
triggerModeopcional
Em uma regra de padrão, quando procurar o padrão: onEachTransaction, onBatchComplete, onSchedule ou onDemand. O padrão é onEachTransaction.
patternSpecopcional
Em uma regra de padrão, o padrão a procurar, como um objeto tipado. Obrigatório quando ruleScope é pattern.
windowDaysopcional
Em uma regra de padrão, quantos dias para trás procurar o resto do padrão, entre 1 e 365. Obrigatório quando ruleScope é pattern.
windowLookaheadDaysopcional
Em uma regra de padrão, quantos dias para a frente procurar o resto do padrão.
windowExcludeTriggerAccountopcional
Em uma regra de padrão, deixa de fora da busca a conta da transação que disparou a verificação. O padrão é false.
groupopcional
O grupo em que a regra fica: spendingHabits, problemsAndAnomalies, incomeAndTransfers, subscriptionsAndRecurring ou taxAndRecordKeeping. Deixe de fora para não colocá-la em nenhum. categoryMapping é reservado para regras que a própria Era cria, e é recusado com um 400.
Resposta · 201
{
  "rule": { … },
  "retroactiveStatus": "completed",
  "affectedTransactionCount": 18
}

retroactiveStatus é null, a menos que você tenha pedido à chamada para aplicar a regra a transações que você já tinha, ou para desfazer o que ela fez. completed quer dizer que esse trabalho terminou antes da resposta; in_progress, que ainda está rodando, então affectedTransactionCount ainda não é final; queue_full, que a fila estava cheia e ele não começou — a mudança na regra em si foi salva mesmo assim; partial_success, que só uma parte passou — algumas mudanças não foram salvas, ou só parte do trabalho entrou na fila.

Pré-visualizar uma regra

Testa as condições de uma regra nas suas transações recentes e diz o que elas pegariam, sem salvar nada: quantas bateram entre quantas foram verificadas, até 50 das chaves das que bateram e até 10 amostras. Uma regra de transação verifica os últimos 90 dias, no máximo 5.000 transações, e as amostras dela trazem comerciante, valor e data. As amostras de uma regra de padrão trazem detectionReason, o motivo de o padrão ter sido detectado (que pode vir vazio), e nada de comerciante, valor ou data. Nada é gravado, então banking:read basta.

POST/banking/rules/preview
Escopo necessáriobanking:read
Corpo da requisição
filters
As condições, como uma lista de objetos de filtro tipados — cada um diz o seu tipo em um campo type. Uma transação precisa atender a todas; aninhe filtros and, or e not para combiná-las de outro jeito. Pelo menos uma. Um filtro account_type que indica tipos de conta só funciona em uma regra de padrão; em uma regra de transação, ele é recusado com um 400.
ruleScopeopcional
transaction, o padrão, avalia as transações uma a uma. pattern encontra um padrão em várias — uma cobrança recorrente, um par de transferências — descrito por patternSpec.
patternSpecopcional
Em uma regra de padrão, o padrão a procurar, como um objeto tipado. Obrigatório quando ruleScope é pattern.
windowDaysopcional
Em uma regra de padrão, quantos dias para trás procurar o resto do padrão, entre 1 e 365. Obrigatório quando ruleScope é pattern.
Resposta · 200
{
  "matchCount": 12,
  "totalEvaluated": 418,
  "matchingGroupKeys": ["utgr_5d0e2b77", … ],
  "sampleMatches": [
    {
      "groupKey": "utgr_5d0e2b77",
      "merchantName": "Blue Bottle Coffee",
      "amount": -6.25,
      "currency": "USD",
      "transactionDate": "2026-09-12"
    },
    …
  ]
}

Mudar uma regra

Substitui a definição de uma regra pela que você envia, então envie todos os campos que quer manter — não só os que está mudando. O ruleId no caminho é o id que a lista de regras devolve, e version precisa ser a que você leu por último. Em uma regra da biblioteca da Era, só userOverrides pode mudar: devolva todo o resto como a lista devolveu. Precisa de banking:write em vez de banking:read, mas só muda as suas regras e transações na Era: nada muda no seu banco.

PUT/banking/rules/{ruleId}
Escopo necessáriobanking:write
Corpo da requisição
versionopcional
A versão da regra como você a leu por último. Ela precisa bater com a versão atual da regra, ou a chamada é recusada com um 409 — então deixá-la de fora não pula a verificação, faz ela falhar.
ruleName
Um nome para a regra.
descriptionopcional
Uma nota opcional sobre para que serve a regra.
priorityopcional
Onde a regra roda entre as outras: a mais alta roda primeiro, e quando duas regras definiriam a mesma coisa em uma transação, a mais alta vence. O padrão é zero.
filters
As condições, como uma lista de objetos de filtro tipados — cada um diz o seu tipo em um campo type. Uma transação precisa atender a todas; aninhe filtros and, or e not para combiná-las de outro jeito. Pelo menos uma. Um filtro account_type que indica tipos de conta só funciona em uma regra de padrão; em uma regra de transação, ele é recusado com um 400.
actions
O que acontece com cada transação que a regra pega, como uma lista de objetos de ação tipados: definir uma categoria, adicionar ou remover uma tag, renomear o comerciante, reescrever a descrição, definir um status de revisão, ocultá-la ou marcá-la como transferência. Pelo menos uma, e no máximo uma de cada tipo, exceto as ações de tag. Cada tag precisa já existir e só pode aparecer uma vez.
applyRetroactivelyopcional
Roda de novo a regra alterada nas transações que você já tem, desfazendo antes o que a versão antiga fez nelas. O padrão é false.
appliesFromopcional
Só transações nesta data ou depois.
appliesToopcional
Só transações nesta data ou antes.
applicationScopeopcional
Quando a regra roda: prospective só para transações novas, retroactive quando ela é aplicada às existentes, ou both. O padrão é both.
userOverridesopcional
Em uma regra da biblioteca da Era, os seus próprios valores para as configurações que ela deixa você ajustar, como um objeto tipado do mesmo tipo que o padrão da regra. Ignorado nas regras que você criou.
groupopcional
O grupo em que a regra fica, da mesma lista que a criação aceita. A mudança substitui a definição inteira, então deixá-lo de fora tira o grupo da regra — envie o grupo atual para mantê-lo. Em uma regra da biblioteca da Era, deixe de fora ou envie o grupo que ela já tem.
Resposta · 200
{
  "rule": { … },
  "retroactiveStatus": null,
  "affectedTransactionCount": 0
}

retroactiveStatus é null, a menos que você tenha pedido à chamada para aplicar a regra a transações que você já tinha, ou para desfazer o que ela fez. completed quer dizer que esse trabalho terminou antes da resposta; in_progress, que ainda está rodando, então affectedTransactionCount ainda não é final; queue_full, que a fila estava cheia e ele não começou — a mudança na regra em si foi salva mesmo assim; partial_success, que só uma parte passou — algumas mudanças não foram salvas, ou só parte do trabalho entrou na fila.

Ligar uma regra

Liga uma regra de novo, para que ela volte a rodar nas transações novas. Ligar uma regra que já está ligada não muda nada. Regras da biblioteca da Era podem ser ligadas e desligadas como as suas. Precisa de banking:write em vez de banking:read, mas só muda as suas regras e transações na Era: nada muda no seu banco.

POST/banking/rules/{ruleId}/enable
Escopo necessáriobanking:write
Parâmetros de consulta
versionopcional
A versão da regra como você a leu por último. Deixe de fora para pular a verificação; se enviar, a chamada é recusada com um 409 quando a regra mudou desde então.
Resposta · 200
{
  "rule": { … },
  "retroactiveStatus": null,
  "affectedTransactionCount": 0
}

Desligar uma regra

Desliga uma regra, para que ela pare de rodar nas transações novas. Ela mantém a definição, e o que já fez continua, a menos que você peça de volta com revert_retroactively. Desligar uma regra que já está desligada a deixa desligada. Precisa de banking:write em vez de banking:read, mas só muda as suas regras e transações na Era: nada muda no seu banco.

POST/banking/rules/{ruleId}/disable
Escopo necessáriobanking:write
Parâmetros de consulta
versionopcional
A versão da regra como você a leu por último. Deixe de fora para pular a verificação; se enviar, a chamada é recusada com um 409 quando a regra mudou desde então.
revert_retroactivelyopcional
Desfaz também o que a regra já fez nas suas transações — as categorias, tags e outras mudanças que ela aplicou. O padrão é false, que deixa essas mudanças como estão.
Resposta · 200
{
  "rule": { … },
  "retroactiveStatus": null,
  "affectedTransactionCount": 0
}

retroactiveStatus é null, a menos que você tenha pedido à chamada para aplicar a regra a transações que você já tinha, ou para desfazer o que ela fez. completed quer dizer que esse trabalho terminou antes da resposta; in_progress, que ainda está rodando, então affectedTransactionCount ainda não é final; queue_full, que a fila estava cheia e ele não começou — a mudança na regra em si foi salva mesmo assim; partial_success, que só uma parte passou — algumas mudanças não foram salvas, ou só parte do trabalho entrou na fila.

Excluir uma regra

Exclui uma regra de vez. Para parar uma regra sem perdê-la, desligue-a. O ruleId no caminho é o id que a lista de regras devolve, e version precisa ser a que você leu por último. Regras da biblioteca da Era não podem ser excluídas, só desligadas. Precisa de banking:write em vez de banking:read, mas só muda as suas regras e transações na Era: nada muda no seu banco. Pedir revert_retroactively numa exclusão é uma tentativa só: se voltar queue_full, a regra já não existe e não sobra nada contra o que tentar de novo. Para excluir uma regra e desfazer o que ela fez, desligue-a primeiro com revert_retroactively — dá para repetir até ser aceito — e depois exclua.

DELETE/banking/rules/{ruleId}
Escopo necessáriobanking:write
Parâmetros de consulta
versionopcional
A versão da regra como você a leu por último. Ela precisa bater com a versão atual da regra, ou a chamada é recusada com um 409 — então deixá-la de fora não pula a verificação, faz ela falhar.
revert_retroactivelyopcional
Desfaz também o que a regra já fez nas suas transações — as categorias, tags e outras mudanças que ela aplicou. O padrão é false, que deixa essas mudanças como estão.
Resposta · 200
{
  "success": true,
  "retroactiveStatus": null,
  "affectedTransactionCount": 0
}

retroactiveStatus é null, a menos que você tenha pedido à chamada para aplicar a regra a transações que você já tinha, ou para desfazer o que ela fez. completed quer dizer que esse trabalho terminou antes da resposta; in_progress, que ainda está rodando, então affectedTransactionCount ainda não é final; queue_full, que a fila estava cheia e ele não começou — a mudança na regra em si foi salva mesmo assim; partial_success, que só uma parte passou — algumas mudanças não foram salvas, ou só parte do trabalho entrou na fila.

Era Financial Advisors LLC é uma consultora de investimentos registrada na SEC (CRD #334404). O registro não implica um determinado nível de habilidade ou treinamento. Os serviços de consultoria de investimento são discricionários e assistidos por IA; eles não substituem aconselhamento financeiro personalizado. Serviços de corretagem e custódia são fornecidos pela Alpaca Securities LLC, uma entidade separada e membro da FINRA/SIPC. As contas do Era Thesis e do Era Agency estão disponíveis no momento apenas para residentes nos EUA; o Era Context conecta contas nos EUA, no Reino Unido, no Canadá, na França, na Alemanha, na Espanha e em mais de 40 países no total. Nada neste site é uma oferta ou solicitação para comprar ou vender títulos. Desempenho passado não garante resultados futuros. Consulte nosso Form ADV e Form CRS antes de investir.

Disponível na App StoreDisponível no Google Play
era© 2026 Tinwell Labs Inc. DBA Era