API de Era
Conoce los endpoints disponibles, las cabeceras de autenticación, la paginación y los límites de la API de Era.
Última actualización: 29 de septiembre de 2026
Estos endpoints funcionan hoy, pero la API todavía está evolucionando, así que algunos detalles pueden cambiar. Consulta la fecha de última actualización en la parte superior para ver cuándo se revisó esta página por última vez.
Inicio rápido
Antes de empezar necesitas una cuenta de Era con al menos una institución conectada: sin conexión no hay nada que estos endpoints puedan devolver.
- 1
Inicia sesión en Era y conecta una institución, si aún no lo has hecho.
- 2
Abre tus claves de API en el panel y crea una. Todos los alcances vienen marcados, así que desmarca los que no necesites: para estos endpoints queda banking:read. También eliges una caducidad; no hay opción de que nunca caduque.
- 3
Copia la clave. Se muestra una sola vez y no podemos volver a mostrarla. Cópiala y guárdala en un lugar seguro, como un gestor de secretos. Si pierdes una clave, no puedes volver a verla. Crea una nueva en su lugar.
- 4
Mándala en un encabezado junto con tu petición.
curl "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
-H "X-API-Key: fmk_your_key_here"{
"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 disponibles
La API de Era incluye las siguientes APIs:
- GET/banking
/accountsCada cuenta que puedas ver, en todas tus instituciones conectadas. - GET/banking
/accounts /{accountId} /balanceEl saldo de una cuenta, con los campos de crédito incluidos si es un pasivo. - GET/banking
/accounts /summaryTotales de todas las cuentas que puedas ver. - GET/banking
/transactionsTus transacciones, una página a la vez. - PUT/banking
/transactions /{id}Cambiar una transacción - PUT/banking
/transactions /bulkCambiar hasta 100 a la vez - GET/banking
/categoriesToda la taxonomía de categorías, con las subcategorías anidadas. - POST/banking
/categoriesAgregar una categoría - GET
- POST/banking
/tagsCrear una etiqueta
Autenticación
Envía tu clave de una de estas dos formas:
- Encabezado
- X-API-Key: fmk_your_key_here
- Token Bearer
- Authorization: Bearer fmk_your_key_here
Toda petición va cifrada con TLS.
Las claves caducan, y tú eliges qué tan pronto al crearlas. Lo máximo son 90 días en el plan gratis y 365 en uno de pago; no existe la opción de que nunca caduquen, así que lo que construyas sobre esto necesita un plan para rotar la clave antes de que venza.
Encabezados de respuesta
Un ID de solicitud vuelve en todas las respuestas. Los encabezados de límite vuelven en las llamadas que Era midió contra un presupuesto diario, y en un 429 solo cuando ese presupuesto diario rechazó la llamada: un 429 del tope de ráfaga por minuto solo lleva Retry-After. Por ahora, solo el plan gratuito tiene presupuesto diario. Si Era no puede medir tu uso, atiende la llamada y no envía ninguno.
- fly-request-id
- Un identificador único de la solicitud. Inclúyelo cuando contactes a soporte sobre una solicitud específica — ver ID de solicitud
- X-RateLimit-Limit
- El presupuesto diario de tu plan. Solo se envía en planes con presupuesto diario, y nunca en un 429 del tope de ráfaga por minuto.
- X-RateLimit-Remaining
- Lo que queda de tu presupuesto diario. Nunca baja de cero. Solo se envía en planes con presupuesto diario, y nunca en un 429 del tope de ráfaga por minuto.
- X-RateLimit-Reset
- Cuándo tu presupuesto diario libera una solicitud más, como marca de tiempo Unix en segundos. No es cuando se recarga el presupuesto entero: el presupuesto se renueva de forma continua, así que las solicitudes vuelven de una en una. Solo se envía en planes con presupuesto diario, y nunca en un 429 del tope de ráfaga por minuto. El tope de ráfaga por minuto no tiene encabezado propio. Ver Límites
- Retry-Aftersolo en un 429
- Segundos que esperar antes de reintentar, según el límite que rechazó la solicitud. Un 429 que además lleva X-RateLimit-* lo rechazó el presupuesto diario; uno sin ellos, el tope de ráfaga por minuto. Ver Límites
Errores
La API devuelve estos códigos de estado de error:
- 400
Entrada malformada: un parámetro incorrecto, una actualización masiva vacía o con más de 100 elementos, o una escritura que establece y borra el mismo campo en la misma llamada.
- 401
Sin clave, o una que no se puede interpretar. Envíala como cabecera X-API-Key o como token bearer.
- 402
Una cuota del plan se interpone — hoy, eso ocurre solo al crear categorías. Va de qué estás creando, no de a qué velocidad llamas: esperar no lo resuelve y un plan mayor sí. Llamar demasiado rápido es un 429.
- 403
La clave no lleva el alcance que esta llamada necesita — o, en cualquiera de las dos escrituras de transacciones, el id pertenece a otra persona o no existe. La API no distingue entre esos dos casos.
- 404
Una cuenta que no existe. Solo lo devuelve el endpoint de saldo: un accountGroupKey que no nombra ninguna cuenta, o que ni siquiera tiene forma de clave, vuelve como 404 sin cuerpo. Las transacciones nunca dan 404 — ver 403.
- 409
Algo más cambió la fila mientras escribías. Léela de nuevo y envía tu escritura de nuevo.
- 429
Demasiadas solicitudes. Llegaste al tope de ráfaga por minuto o, en el plan gratuito, gastaste tu presupuesto diario. Un 429 con los encabezados X-RateLimit-* es el presupuesto diario, y uno sin ellos, el tope de ráfaga. Retry-After dice cuánto esperar y, a diferencia de un 402, esperar libera tu próxima solicitud. En Límites verás las cifras por plan.
Formas de error
La mayoría de los errores vuelven con la misma forma: statusCode, message y un objeto errors que nombra lo que falló. No todos: un 401 y un 404 vuelven sin cuerpo en absoluto, así que lee el estado antes que el cuerpo.
{
"statusCode": 403,
"message": "One or more errors occurred!",
"errors": {
"generalErrors": ["Transaction does not belong to the authenticated user"]
}
}ID de solicitud
Toda respuesta lleva un encabezado fly-request-id. Inclúyelo cuando contactes a soporte sobre una solicitud específica.
# 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"# 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"}'Errores comunes
Establecer un campo y borrarlo en la misma escritura — 400.
Más de 100 ids en una actualización masiva — 400, y no se cambia nada. Menos de uno es igual.
Una transacción que no es tuya, o que no existe — 403, nunca 404. Así que la respuesta nunca te dice si un id existe, solo que no es tuyo para verlo.
Algo más cambió la fila primero — 409.
Límites
Dos de los diez endpoints documentados limitan cuánto puedes pedir en una sola llamada. Los otros ocho no.
Sin tope por llamada no significa ilimitado. Las claves siguen caducando, las escrituras siguen teniendo límites de longitud de campo, crear una categoría puede alcanzar una cuota del plan, tu plan puede seguir ocultando historial antiguo y cada llamada cuenta para los límites de uso de tu plan, que se explican abajo.
Cuentas, saldo, resumen, las listas de categorías y etiquetas, crear una categoría, crear una etiqueta y la escritura de una sola transacción no tienen límite de volumen por llamada. Recibes el conjunto completo, o la única fila que nombraste.
pageSize se limita a 100, no se rechaza. Pide más y recibes 100 filas con un 200 — lee pagination.pageSize en la respuesta en vez de confiar en lo que enviaste.
La escritura masiva de transacciones está topada en 100 ids, y a diferencia de pageSize se rechaza en vez de limitarse: envía 101 y recibes un 400 sin que cambie nada.
Las claves caducan según el plazo que elijas al crearlas — hasta 90 días en el plan gratuito, 365 en uno de pago. No hay opción de que nunca caduquen.
Tu plan puede aplicar un límite de ventana de historial que oculta transacciones más antiguas. La respuesta de transacciones lleva los campos historyWindow que te dicen si se aplicó uno y dónde cayó.
Límites de tasa
La API aplica dos límites de uso. Todos los planes tienen un tope de ráfaga: un límite de solicitudes en cualquier minuto móvil. El plan gratuito tiene además un presupuesto diario: un límite de solicitudes en cualquier periodo móvil de 24 horas. Una solicitud deja de contar para el tope de ráfaga un minuto después de hacerla, y para el presupuesto diario, un día después. Los planes de pago no tienen presupuesto diario por ahora, así que en un plan de pago el tope de ráfaga es el único límite. Si te pasas de cualquiera de los dos, la llamada vuelve con 429.
Los límites son de tu cuenta, no de una clave. Todas las claves REST que creas tiran del mismo tope de ráfaga y, en el plan gratuito, del mismo presupuesto diario, así que una segunda clave no te da más llamadas. Las llamadas a herramientas MCP se cuentan aparte, así que las llamadas REST y las MCP nunca gastan los límites de las otras.
| Plan | Presupuesto diario | Tope de ráfaga |
|---|---|---|
| Básico | 100 al día | 10 por minuto |
| Organize | Ninguno | 30 por minuto |
| Automate | Ninguno | 60 por minuto |
| Optimize | Ninguno | 60 por minuto |
| Operate | Ninguno | 120 por minuto |
Por ahora, los planes de pago no tienen presupuesto diario.
Los planes de pago también funcionan con uso razonable. Es una política, no un contador, así que la API nunca rechaza una llamada por eso. La API está pensada para scripts, tableros e integraciones con tus propios datos financieros, a un volumen propio de una persona. Si creemos que tu uso va más allá, no cortaremos tu cuenta sin contactarte antes. En los precios aparece como «Ilimitado (uso razonable) por ahora».
En el plan gratuito, cada respuesta servida informa tu presupuesto diario en los encabezados X-RateLimit-* que se describen en Encabezados de respuesta. Las respuestas de un plan de pago no llevan ninguno. Ningún encabezado informa el tope de ráfaga en ningún plan, así que guíate por la tabla: en el plan gratuito, Remaining puede marcar bastante más de cero justo antes de que una ráfaga vuelva con 429. Si Era no puede medir tu uso, sirve la llamada sin los encabezados, así que en el plan gratuito interpreta una respuesta sin ellos como un conteo desconocido, no como un error.
Qué te dice un 429
Qué límite te rechazó. Un 429 con los encabezados X-RateLimit-* viene del presupuesto diario; uno sin ellos, del tope de ráfaga. Eso vale para todos los planes. El cuerpo es problem-details, y su campo detail explica el límite, lo que permite, cuándo se libera tu próxima solicitud y el plan que lo sube o lo quita, o que ya estás en el más alto. Está escrito para personas, así que lee los encabezados en lugar de analizarlo.
{
"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."
}Cada 429 lleva además Retry-After: un número entero de segundos, nunca menos de uno. Es de hasta un minuto para el tope de ráfaga y de hasta 24 horas para el presupuesto diario del plan gratuito. Una llamada rechazada no cuenta para ninguno de los dos límites, pero si reintentas antes de que pase Retry-After, se vuelve a rechazar, así que espera. Después se libera una solicitud, no todo el límite. Envíala y mira qué vuelve: otro Retry-After si se rechaza o, en el plan gratuito, los encabezados cuando se sirve.
Los límites de uso no protegen una clave que has perdido de vista. Una clave filtrada descuenta de los mismos límites que todas las demás claves de tu cuenta, y puede hacer todo lo que le permitan sus alcances. Revocarla no te devuelve las llamadas que ya hizo. Si tienes dudas sobre una clave, revócala. Mira Seguridad y gestión de claves más abajo.
Convenciones
Los campos de respuesta van en camelCase. Los parámetros de consulta no distinguen mayúsculas de minúsculas, así que ahí camelCase también funciona: la especificación publicada los escribe en PascalCase, y por eso verás las dos formas dando vueltas.
Un campo que nombra un día del calendario va en YYYY-MM-DD. Un campo que nombra un instante va en ISO 8601 con desfase horario.
Los tamaños de página se recortan, no se rechazan. Pide un pageSize de 500 y recibes 100 filas y un 200, no un error, así que lee de vuelta pagination.pageSize en lugar de confiar en lo que mandaste.
Una respuesta puede traer campos que esta página no lista. Ignora los que no reconozcas en vez de fallar por ellos: eso es lo que mantiene tu cliente funcionando conforme la API va creciendo.
REST es HTTP normal, así que no se necesita ningún SDK para llamarlo: cualquier lenguaje con un cliente HTTP ya sirve. No hay nada que instalar.
Versionado y cambios
Todo lo que está documentado aquí queda cubierto por esta política.
No hay número de versión en la ruta ni encabezado de versión. Cada endpoint tiene una versión activa, y es la que está documentada aquí.
Lo que podemos cambiar sin avisar
Nada de esto rompe un cliente que siga las convenciones de arriba.
Agregar un endpoint, o una operación sobre uno que ya existe.
Agregar un campo a una respuesta.
Agregar un parámetro opcional. Omítelo y no cambia nada.
Agregar un valor a un conjunto fijo, como un estado o un tipo.
Agregar un encabezado de respuesta.
Lo que no cambiamos sin avisar
Cualquiera de estos puede romper un cliente que ya funciona.
Quitar un endpoint, o cambiar su ruta o su método.
Quitar un campo de respuesta o cambiarle el nombre.
Cambiar el tipo de un campo o su significado.
Volver obligatorio un parámetro que hoy es opcional.
Rechazar entradas que hoy se aceptan.
Cambiar el alcance que necesita un endpoint.
Antes de cualquiera de ellos, el changelog lo anuncia con al menos 90 días de antelación y te dice qué cambiar. Lo que funciona hoy sigue funcionando hasta entonces.
Los cambios se anuncian en el changelog, enlazado en la sección Changelog de abajo. Todavía no hay correo ni feed, así que revísalo cuando planifiques trabajo sobre la API.
Mientras la API esté en beta, el conjunto documentado seguirá creciendo. Lo que ya está aquí no te va a romper nada sin avisar.
Changelog
Novedades de la Era Developer Platform, incluida la API de Era, de la más reciente a la más antigua. La política de arriba dice qué se avisa y con cuánta antelación; el changelog es donde aparecen esos avisos.
Seguridad y gestión de claves
Aprobar un agente crea una clave
Cuando apruebas un agente por OAuth, Era le crea una clave de API. Aparece en la misma lista del panel que las que creas tú, con un nombre que Era arma a partir del nombre del propio cliente.
Cómo se llama
Auto -- ClaudeLleva exactamente los alcances que aprobaste en esa pantalla, y nada más. Revócala desde el panel y el agente no podrá obtener acceso nuevo hasta que lo apruebes de nuevo. Un token que ya tenga sigue funcionando hasta que venza, como mucho en una hora.
Las escrituras aparecen en tu registro de actividad, las lecturas no
Crear y revocar una clave aparecen en tu registro de actividad, igual que cada llamada a una herramienta que hace un agente por MCP. Una escritura REST también aparece — como el cambio que hizo, por ejemplo una etiqueta creada o una transacción editada. Una lectura REST no genera ninguna entrada. Era registra estas entradas en todos los planes, pero leer el registro completo requiere Organize o superior: por debajo solo ves las entradas más recientes. Incluso en una escritura, REST no lleva un registro petición por petición: lo que queda registrado es el cambio, no la llamada, y queda bajo tu cuenta, no bajo la clave que lo hizo.
Si alguna vez dudas de una clave, revócala. Una clave que creaste tú deja de funcionar en REST y en MCP desde su siguiente petición. La clave de un agente deja de obtener acceso nuevo al instante, y cualquier token que ya tenga vence en menos de una hora. Crear otra te cuesta un minuto.
- Los alcances son amplios
- banking:read cubre mucho más que las seis lecturas de esta página: el mismo alcance cubre el resto de las lecturas de tu cuenta también — saldos, posiciones, conexiones, gastos. Un solo alcance, no hay opción más estrecha. Los de escritura también están en la lista, igual que los de lectura, así que trata cualquier clave como una contraseña. Actúa como tu cuenta, no como una parte de ella. banking:write puede cambiar categorías, etiquetas y metadatos de transacciones, gestionar cuentas y saldos manuales, y conectar o desconectar instituciones — ningún alcance de esta página puede mover dinero entre tus cuentas bancarias.
- Los alcances no se actualizan
- Los alcances de una clave quedan fijos al crearla y no cambian después. Eso importa para todo lo que un alcance cubre y todavía no está disponible: si concedes social:write hoy, la clave lo seguirá teniendo cuando lleguen las vistas compartidas. Concede lo que estés usando ahora, no lo que quizá uses después.
- No hace falta aprobación
- Ya iniciaste sesión en tu propia cuenta, así que crear una clave no necesita la aprobación de nadie más: no hay revisión ni lista de espera, y nadie en Era aprueba la solicitud. Queda escrito en tu registro de actividad en el momento en que la creas, así que una clave desconocida es fácil de detectar.
- El acceso al banco queda fuera de alcance
- Una clave no alcanza el acceso a tu banco, porque Era nunca lo tiene. Lo escribes en el flujo de conexión que corre el proveedor de datos, no en una pantalla de Era; lo que Era guarda después es un token de acceso por conexión, cifrado en reposo con AES-256, que puedes tirar desconectando la institución.
- Las claves se hashean, no se guardan
- Tu clave son 256 bits de datos aleatorios, con hash SHA-256 antes de guardarse. Nos quedamos con el hash, no con la clave. Si la pierdes, revócala y crea otra.
Recursos principales
Cuentas
Todas las cuentas que puedes ver, en cada institución conectada, con el conteo de las que quedan fuera al lado: excludedAccountCount, dividido en tierExcludedAccountCount para las cuentas que deja fuera el límite de cuentas de tu plan y userExcludedAccountCount para las que ocultaste. accountLimit es cuántas cuentas muestra tu plan a la vez, sumando todas tus conexiones. accountLimitLift nombra el plan más barato con espacio para todas las cuentas que no ocultaste, y es null cuando tu plan no deja nada fuera. Cada cuenta lleva su accountGroupKey —el valor que el endpoint de saldo toma en su ruta— y el connectionId al que pertenece, así que esta es la primera llamada que debes hacer. Acepta connectionId para reducirlo a una sola conexión (los conteos se reducen con él; accountLimit y accountLimitLift no), e includeExcluded para incluir las cuentas que tu plan deja fuera y las que ocultaste.
- connectionIdopcional
- Reduce la lista a las cuentas de una sola conexión.
- includeExcludedopcional
- Incluye también las cuentas que tu plan deja fuera y las que ocultaste, con sus saldos retenidos. El campo visibility de cada fila te dice cuál es cuál: tierExcluded o userExcluded, y visible en las demás. El endpoint de saldo escribe estos valores de otra forma, así que no uses el mismo parser para los dos. excludedAccountCount sigue llegando cuando esto es true, y esas cuentas ya están en la lista, así que no sumes las dos cosas. Por defecto, false.
{
"accounts": [
{
"accountGroupKey": "uagr_7f3c9a21",
"connectionId": "ucon_4b19e02c",
"name": "Everyday Checking",
"currentBalance": 4820.16,
"supportsTransactions": true,
…
}
],
"excludedAccountCount": 1
}En una cuenta que has ocultado o que tu plan excluye, los campos de saldo vuelven como null y no como cero: null significa retenido, no vacío. supportsTransactions es null con el mismo sentido: quiere decir que Era no lo puede afirmar, nunca que la respuesta sea no. Lo mismo pasa con los campos del plan: si Era no pudo leer tu plan en esa llamada, tierExcludedAccountCount, userExcludedAccountCount, accountLimit y accountLimitLift vuelven todos como null. accountLimit también es null en un plan sin límite de cuentas, y accountLimitLift cuando ningún plan tiene más espacio o cuando tu plan no deja nada fuera.
Saldo de una cuenta
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.
{
"accountGroupKey": "uagr_7f3c9a21",
"currentBalance": 4820.16,
"availableBalance": 4712.03,
"creditLimit": null,
"currencyCode": "USD",
"availableCredit": null,
"asOf": "2026-08-11T09:32:00Z",
"visibility": null
}Una cuenta oculta, o una cuya conexión se cortó, sigue respondiendo 200, con los campos de saldo en null. Un 404 significa que la cuenta de verdad no está, o que la clave no tenía forma de clave. Fíjate aquí en el campo visibility: es null cuando la cuenta está visible, tier_excluded cuando el límite de cuentas de tu plan la deja fuera, user_excluded cuando tú la ocultaste y connection_severed cuando se cortó su conexión. Con tier_excluded, accountLimit es el límite de tu plan y accountLimitLift nombra el plan más barato con espacio para todas las cuentas que no ocultaste, esta incluida. accountLimitLift es null en cualquier otro estado, y con connection_severed accountLimit también es null.
Resumen de cuentas
Los totales de las cuentas que puedes ver: totalAssets, totalLiabilities y netWorthHint, que es el primero menos el segundo. No acepta parámetros.
{
"userId": "7d1c0b93a8e24f60",
"accounts": [ … ],
"totalVisibleCount": 6,
"totalHiddenCount": 2,
"totalAssets": 48210.75,
"totalLiabilities": 9327.40,
"netWorthHint": 38883.35,
"computedAt": "2026-08-11T09:32:00Z"
}netWorthHint solo cuenta las cuentas de esta respuesta, así que totalHiddenCount te dice lo que le falta: tierExcludedAccountCount de ellas las deja fuera el límite de cuentas de tu plan, y userExcludedAccountCount las ocultaste tú. accountLimitLift nombra el plan más barato que recupera las primeras, y es null cuando no hay ninguna. Toma netWorthHint como una cifra de partida y no como tu patrimonio neto definitivo.
Transacciones
Tus transacciones, de página en página, envueltas junto con los conteos de paginación. Acepta page y pageSize (100 es el tope), además de filtros opcionales por cuenta, rango de fechas, reglas aplicadas y etiquetas asignadas.
- accountIdopcional
- Reduce a las transacciones de una cuenta, por su accountGroupKey.
- fromDateopcional
- Solo transacciones en esta fecha o después.
- toDateopcional
- Solo transacciones en esta fecha o antes.
- pageopcional
- Número de página, empieza en 1. Por defecto, 1.
- pageSizeopcional
- Filas por página. Por defecto, 50; se limita a 100.
- sortByopcional
- Campo por el que ordenar: transactionDate, amount, description, category o merchantName.
- sortDirectionopcional
- asc o desc. Por defecto, descendente.
- 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
- Búsqueda de texto completo en comercio, descripción, categoría, nombre de cuenta y monto.
- ruleIdsopcional
- Solo transacciones que tocó una regla de automatización, por la clave de la regla.
- tagKeysopcional
- Solo transacciones que llevan alguna de estas etiquetas.
- reviewStatusesopcional
- needs_review, reviewed o flagged. Acepta una lista; una transacción coincide si su estado de revisión es cualquiera de ellos.
- includeChildrenopcional
- With a category filter set, also include transactions in the subcategories of every key you passed. Defaults to false.
- includePendingopcional
- Devuelve también los cargos pendientes de los últimos 7 días, marcados con isPending. Por defecto, false. Las filas pendientes son de solo lectura.
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}Tu plan puede aplicar un límite de ventana de historial, que oculta las transacciones más antiguas que él. Por eso la respuesta trae los campos historyWindow: historyWindowApplied te dice que el límite sí ocultó algo, historyWindowFloorDate es dónde cayó, historyWindowHiddenCount cuántas filas quedaron detrás, e historyWindowEarliestDate hasta dónde llega de verdad tu historial. Sin ellos, un resultado corto es indistinguible de una cuenta sin transacciones más antiguas. Dos de ellos cambian lo que escribes: historyWindowHiddenCount puede llegar como null aunque el límite sí se haya aplicado, así que lee null como desconocido y no como cero; y cuando historyWindowDegraded es true, Era no pudo confirmar tu plan en esa lectura, así que la fecha del límite es una suposición, no un hecho. En una lectura de pago confirmada no se aplica ningún límite y historyWindowApplied vuelve como false. El límite de cuentas de tu plan también deja transacciones fuera: tierExcludedAccountCount te dice cuántas de tus cuentas quedan fuera de esta lectura por ese límite, y userExcludedAccountCount cuántas ocultaste, las dos reducidas a la cuenta por la que filtras, si filtras por una. Las dos son null cuando Era no pudo leer tu plan en esa llamada.
Recorrer un historial largo página por página gasta solicitudes. Tu plan limita qué tan rápido puedes llamar y, en el plan gratuito, cuántas llamadas tienes al día. En Límites están las cifras por plan, los encabezados de límite y lo que te dice un 429.
Cambiar una transacción
Hay cuatro cosas en una transacción que puedes anular: su categoría, el nombre de comercio, una nota propia y su estado de revisión. Manda solo las que estés cambiando —lo que omitas se queda como está. El id de la ruta es la clave utgr_ de la transacción. Modifica datos, así que necesita banking:write en vez de banking:read.
- categoryKeyopcional
- La clave fcat_ de la categoría que quieres asignar. Si la omites, la transacción conserva la categoría que tiene.
- merchantNameopcional
- Un nombre de comercio propio, de hasta 1000 caracteres. Si lo omites, se mantiene el nombre actual.
- descriptionopcional
- Una nota propia sobre esta transacción, de hasta 5000 caracteres. Si la omites, se mantiene la nota actual.
- clearCategoryopcional
- Quita tu categoría manual, así que vuelve a mandar la categorización propia de Era. Por defecto, false.
- clearMerchantNameopcional
- Quita tu nombre de comercio manual, así que vuelve el nombre que mandó tu banco. Por defecto, false.
- clearDescriptionopcional
- Quita tu descripción manual, así que vuelve la descripción que mandó tu banco. Por defecto, false.
- reviewStatusopcional
- Márcala como needs_review, reviewed o flagged.
- clearReviewStatusopcional
- Quita tu estado de revisión manual. Por defecto, false.
{
"transaction": { … }
}Recibes de vuelta la transacción completa actualizada, en la misma forma que devuelve la lista de arriba —no se reimprime aquí, porque es un objeto grande que todavía se está moviendo. Definir un campo y limpiarlo en la misma llamada devuelve 400. Una transacción que no es tuya, o que no existe, devuelve 403 —la API no distingue entre esos dos casos. Y si algo más cambió la misma fila mientras escribías, recibes 409: léela otra vez y mándala otra vez.
Cambiar hasta 100 a la vez
Las mismas cuatro anulaciones, aplicadas a una lista de transacciones en una sola llamada. Cada id de la lista recibe los mismos cambios —no hay variación por transacción. Modifica datos, así que necesita banking:write en vez de banking:read.
- transactionIds
- Las claves utgr_ de las transacciones que quieres cambiar. Al menos una, y no más de 100. Pasar de 100 se rechaza en vez de recortarse —a diferencia de pageSize arriba, recibes un 400 y no cambia nada.
- categoryKeyopcional
- La clave fcat_ de la categoría que quieres asignar. Si la omites, la transacción conserva la categoría que tiene.
- merchantNameopcional
- Un nombre de comercio propio, de hasta 1000 caracteres. Si lo omites, se mantiene el nombre actual.
- descriptionopcional
- Una nota propia sobre esta transacción, de hasta 5000 caracteres. Si la omites, se mantiene la nota actual.
- clearCategoryopcional
- Quita tu categoría manual, así que vuelve a mandar la categorización propia de Era. Por defecto, false.
- clearMerchantNameopcional
- Quita tu nombre de comercio manual, así que vuelve el nombre que mandó tu banco. Por defecto, false.
- clearDescriptionopcional
- Quita tu descripción manual, así que vuelve la descripción que mandó tu banco. Por defecto, false.
- reviewStatusopcional
- Márcala como needs_review, reviewed o flagged.
- clearReviewStatusopcional
- Quita tu estado de revisión manual. Por defecto, false.
{
"transactions": [ … ]
}Recibes de vuelta las transacciones actualizadas, en la misma forma que devuelve la lista de arriba. Definir un campo y limpiarlo en la misma llamada devuelve 400, y también una lista vacía. Una lista que incluye una transacción que no es tuya, o que no existe, devuelve 403 para toda la llamada —no se cambia nada. Si algo más cambió alguna de esas filas mientras escribías, recibes 409: léelas otra vez y mándalas otra vez.
Categorías
Toda la taxonomía de categorías: cada conjunto de categorías, con sus subcategorías anidadas dentro. La taxonomía es compartida, no por cuenta.
{
"packs": [
{
"packSlug": "default",
"packName": "Era default categories",
"isDefault": true,
"categories": [
{
"projectionKey": "fcat_food_dining",
"categoryName": "Food & dining",
"isTopLevel": true,
"children": [ … ]
}
]
}
],
"meterLimit": 25,
"canCreateCustomCategories": true
}Agregar una categoría
Una categoría definida por el usuario bajo un padre existente. Modifica datos, así que necesita banking:write en vez de banking:read.
- slug
- Identificador apto para URL: letras minúsculas, números y guiones, de 2 a 50 caracteres.
- parentCategoryKey
- La clave fcat_ de la categoría bajo la que se anida esta.
- name
- Nombre para mostrar.
- descriptionopcional
- Descripción opcional.
- iconNameopcional
- Nombre de ícono opcional.
- spendingTypeopcional
- Clasificación de gasto opcional.
- displayOrderopcional
- Posición de orden opcional entre sus hermanas.
- assignmentEligibilityopcional
- Regla opcional sobre a qué transacciones se puede asignar esta categoría.
- sourceSystemKeysopcional
- Lista opcional de claves de categorías existentes cuyas transacciones deben enrutarse aquí de ahora en adelante.
- applyRetroactivelyopcional
- Si es true, también reevalúa las transacciones pasadas contra el nuevo enrutado. Por defecto, false.
{
"categoryKey": "fcat_side_hustle_9f2a",
"overlayProjectionKey": "fcov_9f2a1c",
"action": "created",
"isQuotaExceeded": false,
"createdMappingRuleKeys": [ … ],
…
}La respuesta también lleva retroactiveAffectedCount, mergeSourcesHiddenCount y mergeSourcesTotalCount —campos que esta llamada comparte con las fusiones de categorías y que no se muestran aquí—, además de isQuotaExceeded, quotaExceededMessage y meterGate, que en una categoría creada siempre valen false, null y null. Si la cuota de tu plan rechaza la creación, recibes un 402 sin ninguno de esos campos: su cuerpo es statusCode, message y errors.generalErrors, cuya única entrada te dice qué límite alcanzaste.
Etiquetas
Todas las etiquetas de tu cuenta, en una sola lista. Sin paginación: una sola respuesta te las devuelve todas.
- tagTypeopcional
- Filtra por origen de la etiqueta: user, system o auto.
- includeDeletedopcional
- Incluye las etiquetas eliminadas. Por defecto, false.
{
"tags": [
{
"tagKey": "utag_9c2f01ab",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"color": "#6DC6BA",
"transactionCount": 42
}
]
}Crear una 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.
- name
- El nombre canónico de la etiqueta.
- displayNameopcional
- Nombre para mostrar opcional. Por defecto, el nombre canónico.
- tagTypeopcional
- user or auto. Defaults to user. system is refused — it is reserved for tags Era creates itself.
- coloropcional
- Color hexadecimal opcional para mostrar.
- iconopcional
- Nombre de ícono opcional.
{
"tag": {
"tagKey": "utag_9c2f01ab",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"version": 1,
"createdAt": "2026-08-26T09:15:00Z"
}
}