Ir para o conteúdo principal

API da Era

Conheça os endpoints disponíveis, os cabeçalhos de autenticação, a paginação e os limites da API da Era.

Última atualização: 29 de setembro 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. Todos os escopos vêm marcados, então desmarque os que você não precisa — para esses endpoints sobra banking:read. Você também escolhe uma validade; não existe opção de nunca expirar.

  3. 3

    Copie a chave. Ela aparece uma vez só, e não conseguimos mostrar de novo. Copie-a e guarde-a em um lugar seguro, como um gerenciador de segredos. Se você perder uma chave, não pode vê-la de novo. Crie uma nova no lugar dela.

  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
}

APIs disponíveis

A API da Era inclui as seguintes APIs:

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

Um ID de requisição volta em toda resposta. Os cabeçalhos de limite voltam nas chamadas que a Era mediu contra um orçamento diário, e num 429 só quando esse orçamento diário recusou a chamada: um 429 do teto de rajada por minuto carrega só o Retry-After. Por enquanto, só o plano gratuito tem orçamento diário. Se a Era não conseguir medir seu uso, ela atende a chamada e não envia nenhum deles.

Cabeçalhos de resposta
fly-request-id
Um identificador único da requisição. Inclua-o ao entrar em contato com o suporte sobre uma requisição específica — veja ID da solicitação
X-RateLimit-Limit
O orçamento diário do seu plano. Enviado só em planos com orçamento diário, e nunca num 429 do teto de rajada por minuto.
X-RateLimit-Remaining
O que resta do seu orçamento diário. Nunca abaixo de zero. Enviado só em planos com orçamento diário, e nunca num 429 do teto de rajada por minuto.
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 com orçamento diário, e nunca num 429 do teto de rajada por minuto. O teto de rajada por minuto não tem cabeçalho próprio. Veja Limites
Retry-Aftersó em um 429
Segundos a esperar antes de tentar de novo, com base no limite que recusou a requisição. Um 429 que também carrega X-RateLimit-* foi recusado pelo orçamento diário; um sem eles, pelo teto de rajada por minuto. 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, ou uma escrita que define e limpa o mesmo campo na mesma chamada.

  • 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 na criação de categorias. É sobre o que você está criando, não sobre a velocidade com que chama: esperar não resolve, 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.

  • 404

    Uma conta que não existe. Só o endpoint de saldo retorna isso: um accountGroupKey que não indica nenhuma conta, ou que nem tem formato de chave, volta como 404 sem corpo. Transações nunca dão 404 — veja 403.

  • 409

    Outra coisa mudou a linha enquanto você escrevia. Leia-a de novo e envie sua escrita de novo.

  • 429

    Requisições demais. Você bateu no teto de rajada por minuto ou, no plano gratuito, gastou seu orçamento diário. Um 429 com os cabeçalhos X-RateLimit-* é o orçamento diário, e um sem eles é o teto de rajada. Retry-After diz quanto esperar e, diferente de um 402, esperar libera sua próxima requisição. Veja em Limites os números por plano.

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 um 404 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"]
  }
}

ID da solicitação

Toda resposta carrega um cabeçalho fly-request-id. Inclua-o ao entrar em contato com o suporte sobre uma solicitação específica.

cURL
# Print the response headers, including fly-request-id; discard the body
curl -sS -D - -o /dev/null "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
  -H "X-API-Key: fmk_your_key_here"
cURL (escrita)
# A write call: same header, plus a JSON body
curl -sS -D - -X PUT "https://forge.era.app/api/banking/transactions/utgr_your_transaction_id" \
  -H "X-API-Key: fmk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"categoryKey": "fcat_dining", "merchantName": "Corner Cafe"}'

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 dez endpoints documentados limitam quanto você pode pedir em uma única chamada. Os outros oito 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 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 e a escrita de uma única transação não têm limite de volume por chamada. Você recebe o conjunto inteiro de volta, ou a única linha que você nomeou.

  • 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 API aplica 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 por enquanto, então num plano pago o teto de rajada é o único limite. Passou de qualquer um dos dois, 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.

Os planos pagos também seguem o uso justo. É uma política, não um contador, então a API nunca recusa uma chamada por causa disso. A API é para scripts, painéis e integrações com seus próprios dados financeiros, num volume que faz sentido para uma pessoa. Se acharmos que seu uso vai além disso, não vamos cortar sua conta sem falar com você antes. Na página de preços, isso aparece como “Ilimitado (uso justo) por enquanto”.

No plano gratuito, toda resposta atendida informa seu orçamento diário nos cabeçalhos X-RateLimit-* descritos em Cabeçalhos de resposta. As respostas de um plano pago não trazem nenhum deles. Nenhum cabeçalho informa o teto de rajada em nenhum plano, então controle o ritmo pela tabela: no plano gratuito, Remaining pode marcar bem acima de zero logo antes de uma rajada voltar com 429. Se a Era não conseguir medir seu uso, ela atende a chamada sem os cabeçalhos, então, no plano gratuito, leia uma resposta sem eles como uma contagem desconhecida, não como um erro.

O que um 429 te diz

Qual limite recusou você. Um 429 com os cabeçalhos X-RateLimit-* veio do orçamento diário; um sem eles veio do teto de rajada. Isso vale em todo plano. O corpo é problem-details, e o campo detail explica o limite, quanto ele permite, quando sua próxima requisição é liberada 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, nunca menos de um. É de até um minuto para o teto de rajada e de até 24 horas para o orçamento diário do plano gratuito. Uma chamada recusada não conta para nenhum dos dois limites, mas tentar de novo antes de o Retry-After acabar é recusado de novo, então espere. Depois, 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 parâmetros de consulta não diferenciam maiúsculas de minúsculas, então camelCase funciona ali também — a especificação publicada escreve em PascalCase, e é por isso que você vê as duas formas por aí.

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

Tudo que está documentado aqui é coberto por esta política.

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.

O que podemos mudar sem aviso

Nada disso quebra um cliente que segue as convenções acima.

  • Adicionar um endpoint, ou uma operação em um que já existe.

  • Adicionar um campo a uma resposta.

  • Adicionar um parâmetro opcional. Deixe de fora e nada muda.

  • Adicionar um valor a um conjunto fixo, como um status ou um tipo.

  • Adicionar um cabeçalho de resposta.

O que não mudamos sem aviso

Qualquer um destes pode quebrar um cliente que já funciona.

  • Remover um endpoint, ou mudar o caminho ou o método dele.

  • Remover ou renomear um campo de resposta.

  • Mudar o tipo de um campo ou o que ele significa.

  • Tornar obrigatório um parâmetro que hoje é opcional.

  • Recusar uma entrada que hoje é aceita.

  • Mudar o escopo que um endpoint exige.

Antes de qualquer uma delas, o changelog avisa com pelo menos 90 dias de antecedência e diz o que mudar. O que funciona hoje continua funcionando até lá.

As mudanças são anunciadas no changelog, com link na seção Changelog abaixo. Ainda não há e-mail nem feed, então confira lá quando estiver planejando trabalho sobre a API.

Enquanto a API estiver em beta, o conjunto documentado vai continuar crescendo. O que já está aqui não vai quebrar sem aviso.

Changelog

Novidades da Era Developer Platform, incluindo a API da Era, da mais recente para a mais antiga. A política acima diz o que recebe aviso e com quanta antecedência; o changelog é onde esses avisos aparecem.

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. Mesmo numa escrita, o REST não mantém registro requisição por requisição: o que fica registrado é a mudança, não a chamada, e ela fica sob a sua conta, não sob a chave que a fez.

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 seis 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, não como uma parte dela. banking:write pode mudar categorias, tags e metadados de transações, gerenciar contas e saldos manuais, e conectar ou desconectar instituições — nenhum escopo desta página pode mover dinheiro entre as suas contas bancárias.
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
Você já está logado na sua própria conta, então criar uma chave não precisa da aprovação de mais ninguém — não há revisão nem lista de espera, e 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.
As chaves são hasheadas, não armazenadas
Sua chave são 256 bits de dados aleatórios, com hash SHA-256 antes de ser armazenada. Guardamos o hash, não a chave. Se perder, revogue 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: totalAssets, totalLiabilities e netWorthHint, que é o primeiro menos o segundo. Não aceita parâmetros.

Resposta · 200
{
  "userId": "7d1c0b93a8e24f60",
  "accounts": [ … ],
  "totalVisibleCount": 6,
  "totalHiddenCount": 2,
  "totalAssets": 48210.75,
  "totalLiabilities": 9327.40,
  "netWorthHint": 38883.35,
  "computedAt": "2026-08-11T09:32:00Z"
}

netWorthHint conta só as contas desta resposta, então totalHiddenCount diz o que está faltando: tierExcludedAccountCount delas ficam de fora pelo limite de contas do seu plano, e userExcludedAccountCount você mesmo escondeu. 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. 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. Modifica dados, então precisa de banking:write em vez de banking:read.

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 é um objeto grande que ainda está mudando. 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. Modifica dados, então precisa de banking:write em vez de banking:read.

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. Modifica dados, então precisa de banking:write em vez de banking:read.

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 — campos que essa chamada compartilha com fusões de categorias, não mostrados aqui — 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

A new tag, canonicalized to lowercase. Mutating, so it needs banking:write rather than banking:read. System tags cannot be created through the API; user and auto tags can.

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"
  }
}

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.

era© 2026 Tinwell Labs Inc. DBA Era