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: 5 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
}

Autenticação

Envie sua chave de uma das duas formas:

Métodos de autenticação
MétodoCredencial
CabeçalhoX-API-Key: fmk_your_key_here
Token BearerAuthorization: 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. Se a Era não conseguir medir seu uso, ela atende a chamada e não envia nenhum deles.

Cabeçalhos de resposta
CabeçalhoDescrição
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.

X-RateLimit-Remaining

O que resta do seu orçamento diário. Nunca abaixo de zero.

X-RateLimit-Reset

Quando seu orçamento diário libera a próxima requisição, como timestamp Unix em segundos. 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. 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ê gastou seu orçamento diário ou bateu no teto de rajada por minuto. Retry-After diz quanto esperar e, diferente de um 402, esperar resolve. Veja em Limites qual limite recusou e 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.

Isso 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, e seu plano ainda pode ocultar histórico antigo. Nada disso é um limite de taxa — veja 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

Todo plano pode chamar essa API, e todo plano é medido. O que conta: as chamadas que você faz com uma chave. Dois limites valem ao mesmo tempo — um orçamento diário e um teto de rajada por minuto — e passar de qualquer um deles volta como 429.

Seu orçamento diário é seu, não da chave. Todas as chaves REST da sua conta descontam do mesmo orçamento diário, então criar uma segunda chave não compra mais chamadas. As chamadas de ferramentas MCP são contadas à parte: gastar uma nunca gasta a outra.

Requisições por dia e por minuto, por plano
PlanoPor diaPor minuto
Básico

250

30

Organize

1.000

30

Automate

10.000

60

Operate

25.000

120

Quando a Era mede uma chamada, a resposta carrega X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Os três descrevem seu orçamento diário, que se renova continuamente ao longo de 24 horas em vez de zerar à meia-noite: as requisições voltam uma de cada vez conforme suas chamadas mais antigas completam 24 horas. O teto de rajada por minuto não tem cabeçalho, então controle o ritmo você mesmo pelo número da tabela. O Remaining pode estar bem acima de zero e, ainda assim, uma rajada voltar com 429. Se a Era não conseguir medir seu uso, ela atende a chamada e não envia cabeçalhos de limite, então trate a falta de cabeçalhos como uma leitura ausente, não como um erro.

O que um 429 te diz

Um corpo problem-details. O campo detail é texto simples, não campos estruturados: ele diz qual limite você atingiu, quanto esse limite permite, quando sua próxima requisição é liberada e o plano que o aumenta, ou que você já está no mais alto. Não faça parse dele. Para ramificar no código, leia os cabeçalhos: Remaining em 0 significa que o orçamento diário recusou, e acima de 0, que foi o teto de rajada por minuto.

Resposta 429

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

Um 429 também carrega Retry-After, um número inteiro de segundos medido a partir do limite que recusou: até um minuto para o teto de rajada por minuto, até 24 horas para o orçamento diário. Uma chamada recusada não gasta nada, então tentar de novo cedo não custa nada, mas ela volta com 429 outra vez. Quando o Retry-After passa, uma requisição é liberada, não o orçamento inteiro. Envie-a e depois leia os cabeçalhos ou o próximo Retry-After.

Nada disso protege uma chave que você perdeu de vista. Uma chave vazada gasta seu orçamento exatamente como você gastaria. Se tiver dúvida sobre alguma, 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.

Abrir o changelog

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.
FatoO que significa
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ário

banking:read

Todas as contas que você consegue ver, em cada instituição conectada, com a contagem das que ficaram de fora ao lado delas. 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, e includeExcluded para trazer as contas que você escondeu.

Parâmetros de consulta
connectionIdopcional

Restringe a lista às contas de uma única conexão.

includeExcludedopcional

Inclui também as contas excluídas por nível e as ocultas, com os saldos ofuscados. 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.

Saldo de uma conta

GET/banking/accounts/{accountId}/balance

Escopo necessário

banking: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, e uma string como tier_excluded quando não está.

Resumo das contas

GET/banking/accounts/summary

Escopo necessário

banking: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. Trate como um número de partida, não como o seu patrimônio líquido definitivo.

Transações

GET/banking/transactions

Escopo necessário

banking: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.

Seu plano também define quantas requisições por dia você tem, e essa API faz valer isso. Os números por plano, os cabeçalhos que toda resposta carrega e o que um 429 te diz estão todos em Limites.

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ário

banking: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ário

banking: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ário

banking: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ário

banking: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, mergeSourcesTotalCount e meterGate — campos que essa chamada compartilha com fusões de categorias e criações limitadas por cota, não mostrados aqui.

Etiquetas

GET/banking/tags

Escopo necessário

banking: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ário

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