Saltar al contenido principal

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: 5 de septiembre de 2026

Todavía en beta

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, estos endpoints no tienen nada que devolver.

  1. 1

    Inicia sesión en Era y conecta una institución, si aún no lo has hecho.

  2. 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 no caduque nunca.

  3. 3

    Copia la clave. Se muestra una sola vez y no podemos volver a enseñártela. 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. 4

    Mándala en una cabecera junto con tu petición.

cURL

curl "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
  -H "X-API-Key: fmk_your_key_here"

Respuesta · 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
}

Autenticación

Envía tu clave de una de estas dos formas:

Métodos de autenticación
MétodoCredencial
CabeceraX-API-Key: fmk_your_key_here
Token BearerAuthorization: Bearer fmk_your_key_here

Toda petición va cifrada con TLS.

Las claves caducan, y al crearlas eliges en cuánto tiempo. Lo máximo son 90 días en el plan gratuito y 365 en uno de pago; no existe la opción de que no caduquen nunca, así que lo que construyas sobre esto necesita un plan para rotar la clave antes de que venza.

Cabeceras de respuesta

Un ID de petición vuelve en todas las respuestas. Las cabeceras de límite vuelven en las llamadas que Era ha medido. Si Era no puede medir tu uso, atiende la llamada y no envía ninguna.

Cabeceras de respuesta
CabeceraDescripción
fly-request-id

Un identificador único de la petición. Inclúyelo cuando contactes con soporte sobre una petición concreta — ver ID de petición

X-RateLimit-Limit

El presupuesto diario de tu plan.

X-RateLimit-Remaining

Lo que queda de tu presupuesto diario. Nunca baja de cero.

X-RateLimit-Reset

Cuándo tu presupuesto diario libera la próxima petición, como marca de tiempo Unix en segundos. El tope de ráfaga por minuto no tiene cabecera propia. Ver Límites

Retry-Aftersolo en un 429

Segundos que esperar antes de reintentar, según el límite que rechazó la petición. 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 peticiones. Has gastado tu presupuesto diario o has llegado al tope de ráfaga por minuto. Retry-After dice cuánto esperar y, a diferencia de un 402, esperar lo resuelve. En Límites verás qué límite la rechazó y 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.

Ejemplo

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

ID de solicitud

Toda respuesta lleva una cabecera fly-request-id. Inclúyela cuando contactes con soporte sobre una solicitud concreta.

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 (escritura)

# 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.

Eso 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, y tu plan puede seguir ocultando historial antiguo. Nada de esto es un límite de tasa — ver más 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

Todos los planes pueden llamar a esta API, y todos están medidos. Lo que cuenta: las llamadas que haces con una clave. Funcionan dos límites a la vez — un presupuesto diario y un tope de ráfaga por minuto — y pasarte de cualquiera de los dos devuelve un 429.

Tu presupuesto diario es tuyo, no de una clave. Todas las claves REST de tu cuenta descuentan del mismo presupuesto diario, así que crear una segunda clave no te compra más llamadas. Las llamadas a herramientas MCP se miden aparte: gastar una nunca gasta la otra.

Peticiones por día y por minuto, según el plan
PlanPor díaPor minuto
Básico

250

30

Organize

1000

30

Automate

10.000

60

Operate

25.000

120

Cuando Era mide una llamada, la respuesta lleva X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. Las tres describen tu presupuesto diario, que se renueva de forma continua a lo largo de 24 horas en vez de reiniciarse a medianoche: las peticiones vuelven de una en una a medida que tus llamadas más antiguas cumplen 24 horas. El tope de ráfaga por minuto no tiene cabecera, así que marca tú el ritmo con la cifra de la tabla. Remaining puede estar muy por encima de cero y, aun así, una ráfaga volver con 429. Si Era no puede medir tu uso, atiende la llamada y no envía cabeceras de límite, así que trata la falta de cabeceras como una lectura que falta, no como un error.

Qué te dice un 429

Un cuerpo problem-details. Su campo detail es texto plano, no campos estructurados: nombra el límite que alcanzaste, lo que permite ese límite, cuándo se libera tu próxima petición y el plan que lo sube, o que ya estás en el más alto. No lo analices. Para ramificar en el código, lee las cabeceras: Remaining en 0 significa que lo rechazó el presupuesto diario, y por encima de 0, el tope de ráfaga por minuto.

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

Un 429 también lleva Retry-After, un número entero de segundos medido desde el límite que rechazó: hasta un minuto para el tope de ráfaga por minuto, hasta 24 horas para el presupuesto diario. Una llamada rechazada no gasta nada, así que reintentar antes no te cuesta nada, pero vuelve con 429 otra vez. Cuando pasa el tiempo de Retry-After, se libera una petición, no el presupuesto entero. Envíala y luego lee las cabeceras o el siguiente Retry-After.

Nada de esto protege una clave que has perdido de vista. Una clave filtrada gasta tu presupuesto igual que lo harías tú. Si tienes dudas sobre una, 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 por ahí.

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 fiarte de 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 a medida que la API va creciendo.

REST es HTTP normal, así que no hace falta 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 cabecera 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.

  • Añadir un endpoint, o una operación sobre uno que ya existe.

  • Añadir un campo a una respuesta.

  • Añadir un parámetro opcional. Omítelo y no cambia nada.

  • Añadir un valor a un conjunto fijo, como un estado o un tipo.

  • Añadir una cabecera 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 o renombrar un campo de respuesta.

  • 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 consúltalo 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.

Abrir el changelog

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 genera a partir del nombre del propio cliente.

Cómo se llama

Auto -- Claude

Lleva 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 caduque, 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 a 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 caduca en menos de una hora. Crear otra te lleva un minuto.

Más cosas que conviene saber antes de confiar en una clave.
DatoQué significa
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 fijados al crearla y no cambian después. Eso importa para todo lo que cubre un alcance 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 más adelante.

No hace falta aprobación

Ya has iniciado 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.

Las credenciales del banco quedan fuera de alcance

Una clave no llega a las credenciales de tu banco, porque Era nunca las tiene. Las introduces en el flujo de conexión que gestiona 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, del que te deshaces 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

GET/banking/accounts

Alcance necesario

banking:read

Todas las cuentas que puedes ver, en cada institución conectada, con el recuento de las que quedan fuera al lado. 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 acotarlo a una sola conexión, e includeExcluded para incluir las cuentas que has ocultado.

Parámetros de consulta
connectionIdopcional

Acota la lista a las cuentas de una sola conexión.

includeExcludedopcional

Incluye también las cuentas excluidas por nivel y las ocultas, con sus saldos ofuscados. Por defecto, false.

Respuesta · 200

{
  "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.

Saldo de una cuenta

GET/banking/accounts/{accountId}/balance

Alcance necesario

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.

Respuesta · 200

{
  "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, y una cadena como tier_excluded cuando no lo está.

Resumen de cuentas

GET/banking/accounts/summary

Alcance necesario

banking:read

Los totales de las cuentas que puedes ver: totalAssets, totalLiabilities y netWorthHint, que es el primero menos el segundo. No acepta parámetros.

Respuesta · 200

{
  "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. Tómalo como una cifra de partida y no como tu patrimonio neto definitivo.

Transacciones

GET/banking/transactions

Alcance necesario

banking:read

Tus transacciones, de página en página, envueltas junto con los recuentos 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.

Parámetros de consulta
accountIdopcional

Acota 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 e importe.

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.

Respuesta · 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
}

Tu plan puede aplicar un límite de ventana de historial, que oculta las transacciones anteriores a ese límite. Por eso la respuesta trae los campos historyWindow: historyWindowApplied te dice que el límite sí ha ocultado algo, historyWindowFloorDate indica dónde ha quedado ese límite, historyWindowHiddenCount cuántas filas se quedan 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 ha podido 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.

Tu plan también fija cuántas peticiones al día te tocan, y esta API lo hace cumplir. Las cifras por plan, las cabeceras que lleva cada respuesta y lo que te dice un 429 están todas en Límites.

Cambiar una transacción

Hay cuatro cosas de una transacción que puedes anular tú: su categoría, el nombre del 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.

PUT/banking/transactions/{id}

Alcance necesario

banking:write
Cuerpo de la petición
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

Elimina tu categoría manual, para que la categorización propia de Era vuelva a aplicarse. Por defecto, false.

clearMerchantNameopcional

Elimina tu nombre de comercio manual, para que vuelva el nombre que mandó tu banco. Por defecto, false.

clearDescriptionopcional

Elimina tu descripción manual, para que vuelva la descripción que mandó tu banco. Por defecto, false.

reviewStatusopcional

Márcala como needs_review, reviewed o flagged.

clearReviewStatusopcional

Elimina tu estado de revisión manual. Por defecto, false.

Respuesta · 200

{
  "transaction": {}
}

Recibes de vuelta la transacción actualizada entera, con la misma forma que devuelve la lista de arriba — no se reproduce aquí, porque es un objeto grande que todavía está en movimiento. Definir un campo y borrarlo en la misma llamada da 400. Una transacción que no es tuya, o que no existe, da 403 — la API no distingue entre las dos cosas. 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.

PUT/banking/transactions/bulk

Alcance necesario

banking:write
Cuerpo de la petición
transactionIds

Las claves utgr_ de las transacciones que quieres cambiar. Al menos una, y no más de 100. Pasarte de 100 se rechaza en vez de recortarse — a diferencia de pageSize más 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

Elimina tu categoría manual, para que la categorización propia de Era vuelva a aplicarse. Por defecto, false.

clearMerchantNameopcional

Elimina tu nombre de comercio manual, para que vuelva el nombre que mandó tu banco. Por defecto, false.

clearDescriptionopcional

Elimina tu descripción manual, para que vuelva la descripción que mandó tu banco. Por defecto, false.

reviewStatusopcional

Márcala como needs_review, reviewed o flagged.

clearReviewStatusopcional

Elimina tu estado de revisión manual. Por defecto, false.

Respuesta · 200

{
  "transactions": []
}

Recibes de vuelta las transacciones actualizadas, con la misma forma que devuelve la lista de arriba. Definir un campo y borrarlo en la misma llamada da 400, y una lista vacía también. Una lista que incluya una transacción que no es tuya, o que no existe, da 403 para toda la llamada — no 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

GET/banking/categories

Alcance necesario

banking:read

Toda la taxonomía de categorías: cada conjunto de categorías, con sus subcategorías anidadas dentro. La taxonomía es compartida, no va por cuenta.

Respuesta · 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
}

Añadir 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.

POST

Alcance necesario

banking:write
Cuerpo de la petición
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 icono 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í a partir de ahora.

applyRetroactivelyopcional

Si es true, también reevalúa las transacciones pasadas contra el nuevo enrutado. Por defecto, false.

Respuesta · 201

{
  "categoryKey": "fcat_side_hustle_9f2a",
  "overlayProjectionKey": "fcov_9f2a1c",
  "action": "created",
  "isQuotaExceeded": false,
  "createdMappingRuleKeys": [],

}

La respuesta también lleva retroactiveAffectedCount, mergeSourcesHiddenCount, mergeSourcesTotalCount y meterGate: campos que esta llamada comparte con las fusiones de categorías y las creaciones limitadas por cuota, y que no se muestran aquí.

Etiquetas

GET/banking/tags

Alcance necesario

banking:read

Todas las etiquetas de tu cuenta, en una sola lista. Sin paginación: una única respuesta las devuelve todas.

Parámetros de consulta
tagTypeopcional

Filtra por origen de la etiqueta: user, system o auto.

includeDeletedopcional

Incluye las etiquetas borradas. Por defecto, false.

Respuesta · 200

{
  "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.

POST

Alcance necesario

banking:write
Cuerpo de la petición
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 icono opcional.

Respuesta · 201

{
  "tag": {
    "tagKey": "utag_9c2f01ab",
    "name": "business-expense",
    "displayName": "Business expense",
    "tagType": "user",
    "version": 1,
    "createdAt": "2026-08-26T09:15:00Z"
  }
}