Era API
Era API의 엔드포인트, 인증, 페이지네이션, 제한을 복사해 쓸 수 있는 요청과 함께 정리했습니다.
마지막 업데이트: 2026년 10월 1일
이 엔드포인트들은 오늘 기준으로 동작하지만, API는 아직 발전하는 중이라 일부 세부 사항이 바뀔 수 있습니다. 이 페이지가 마지막으로 언제 수정됐는지는 상단의 최종 수정일을 확인하세요.
빠른 시작
시작하기 전에 Era 계정과 연결된 금융기관이 최소 하나 필요합니다. 연결이 없으면 이 엔드포인트들이 돌려줄 것이 없습니다.
- 1
Era에 로그인하고, 아직이라면 금융기관을 연결합니다.
- 2
대시보드에서 API 키를 열고 키를 만듭니다. 대부분의 범위는 처음부터 체크되어 있지만, 돈을 옮기거나, 매매 주문을 넣거나, 요금제와 결제를 바꾸거나, 문서를 삭제하거나, 키를 더 만들 수 있는 범위는 체크되어 있지 않습니다. 필요 없는 것은 해제하세요. 읽기에는 banking:read가, 무언가를 바꾸려면 banking:write가 필요합니다. 만료 기간도 고르는데, 만료되지 않는 선택지는 없습니다.
- 3
키를 복사해서 시크릿 매니저 같은 안전한 곳에 보관하세요. 한 번만 보여 주므로, 잃어버리면 새 키를 만드세요.
- 4
요청 헤더에 담아 보냅니다.
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
}직접 클라이언트를 만드시나요? https://forge.era.app/api/openapi/public.json에 있는 OpenAPI 문서에서 생성하세요. 이 페이지의 모든 엔드포인트를 설명합니다. 모든 필드, 모든 상태, 규칙의 모든 필터와 액션 종류까지요. API가 직접 제공하므로 뒤처지지 않습니다.
엔드포인트
엔드포인트는 열일곱 개입니다. 읽기 여덟 개, 쓰기 아홉 개입니다.
- GET/banking
/accounts - GET/banking
/accounts /{accountId} /balance - GET/banking
/accounts /summary - GET/banking
/transactions - PUT/banking
/transactions /{id} - PUT/banking
/transactions /bulk - GET/banking
/categories - POST/banking
/categories - GET/banking
/tags - POST/banking
/tags - GET/banking
/rules - POST/banking
/rules - POST/banking
/rules /preview - PUT/banking
/rules /{ruleId} - POST/banking
/rules /{ruleId} /enable - POST/banking
/rules /{ruleId} /disable - DELETE/banking
/rules /{ruleId}
인증
키는 다음 두 가지 방법 중 하나로 보내세요:
- 헤더
- X-API-Key: fmk_your_key_here
- 베어러 토큰
- Authorization: Bearer fmk_your_key_here
모든 요청은 TLS로 암호화됩니다.
키는 만료되고, 만들 때 얼마 뒤에 만료될지 고릅니다. 최대는 무료 요금제 90일, 유료 요금제 365일입니다. 만료되지 않는 선택지는 없으니, 이 위에 무언가를 만든다면 만료 전에 키를 교체할 계획이 필요합니다.
응답 헤더
X-RateLimit-* 헤더는 하루 예산을 알려 주므로, 하루 예산을 공개한 요금제에서만 보입니다. 당분간은 무료 요금제뿐입니다. 무료 요금제에서도 이 헤더는 없을 수 있다고 보세요. 헤더가 없는 응답은 집계를 알 수 없다는 뜻이지, 문제가 생겼다는 뜻이 아닙니다. 모든 429에는 Retry-After가 붙습니다.
- X-RateLimit-Limit
- 요금제의 하루 예산입니다. 하루 예산을 공개한 요금제에서만 보내며, 다른 상한 때문에 돌아온 429에는 보내지 않습니다.
- X-RateLimit-Remaining
- 하루 예산에서 남은 양입니다. 0 아래로 내려가지 않습니다. 하루 예산을 공개한 요금제에서만 보내며, 다른 상한 때문에 돌아온 429에는 보내지 않습니다.
- X-RateLimit-Reset
- 하루 예산에서 다음 요청 한 건이 비는 시각을 Unix 타임스탬프 초로 알려줍니다. 예산 전체가 다시 차는 시각이 아닙니다. 예산은 굴러가므로 요청은 한 건씩 돌아옵니다. 하루 예산을 공개한 요금제에서만 보내며, 다른 상한 때문에 돌아온 429에는 보내지 않습니다. 분당 버스트 상한에는 전용 헤더가 없습니다. 참고: 제한
- Retry-After429에만
- 모든 429에는 Retry-After가 실립니다. 그 초만큼 기다린 뒤 다시 시도하세요. X-RateLimit-* 헤더도 실린 429는 무료 요금제의 하루 예산이 거절한 것입니다. 헤더가 없는 429는 분당 버스트 상한 같은 다른 상한이 거절한 것입니다. Retry-After는 1초에서 24시간까지 될 수 있습니다. 참고: 제한
오류
이 API가 반환하는 오류 상태 코드는 다음과 같습니다:
- 400
잘못된 입력: 잘못된 파라미터, 비어 있거나 100개를 넘는 일괄 업데이트, 같은 호출에서 같은 필드를 설정하면서 동시에 지우는 쓰기, 또는 앞뒤가 맞지 않는 규칙. 규칙 삭제, 켜기, 끄기는 받지 않는 쿼리 키도 거부하며, 400이 그 키 이름을 알려 줍니다.
- 401
키가 없거나 파싱할 수 없는 키입니다. X-API-Key 헤더나 베어러 토큰으로 보내세요.
- 402
플랜 쿼터에 걸렸습니다. 오늘 기준으로는 카테고리나 패턴 규칙을 만들 때만 해당합니다. 기다려도 풀리지 않고, 상위 요금제로 올리면 풀립니다. 너무 빨리 호출해서 걸리는 건 429입니다.
- 403
키가 이 호출에 필요한 범위를 지니지 않았거나 — 두 거래 쓰기 중 하나에서 id가 다른 사람의 것이거나 아예 존재하지 않는 경우입니다. API는 이 둘을 구분하지 않습니다. Era 라이브러리의 규칙을 삭제하거나 이름, 설명, 우선순위, 날짜, applicationScope를 바꾸려고 하면 403이 돌아옵니다. 필터, 액션, 그룹을 바꾸면 대신 400이 돌아옵니다.
- 404
존재하지 않는 것입니다. 잔액 엔드포인트는 어떤 계좌도 가리키지 않는 accountGroupKey나 아예 키 형태가 아닌 값에 대해 본문 없이 404를 돌려줍니다. 규칙 엔드포인트는 내 것이 아닌 규칙 키에 대해 404를 돌려줍니다. 거래는 404를 반환하지 않습니다 — 403을 참고하세요.
- 409
쓰는 동안 다른 무언가가 그 행을 바꿨습니다. 규칙이라면 version이 현재 버전이 아니라는 뜻입니다. 다시 읽고 다시 쓰세요. 규칙에서 409는 그 액션이 규칙들을 끝없이 서로 실행시킨다는 뜻일 수도 있습니다. 그럴 때는 액션을 바꾸세요.
- 429
요청이 너무 많습니다. 무료 요금제에서 하루 예산을 다 썼거나, 분당 버스트 상한 같은 다른 상한에 걸렸습니다. 얼마나 기다릴지는 Retry-After가 1초에서 24시간 사이로 알려주고, 402와 달리 기다리면 다음 요청 한 건이 빕니다. 공개된 수치와 429가 알려주는 내용은 제한 섹션을 참고하세요.
오류 형태
대부분의 오류는 같은 형태로 돌아옵니다: statusCode, message, 그리고 무엇이 잘못됐는지 이름 붙인 errors 객체입니다. 전부는 아닙니다. 401과 잔액 엔드포인트의 404는 본문 없이 돌아오므로 본문보다 상태 코드를 먼저 확인하세요.
{
"statusCode": 403,
"message": "One or more errors occurred!",
"errors": {
"generalErrors": ["Transaction does not belong to the authenticated user"]
}
}흔한 오류
같은 쓰기에서 필드를 설정하면서 동시에 지우기 — 400.
일괄 업데이트에 100개를 넘는 id — 400, 아무것도 바뀌지 않습니다. 1개 미만도 마찬가지입니다.
내 것이 아니거나 존재하지 않는 거래 — 403, 절대 404가 아닙니다. 그래서 응답은 그 id가 존재하는지는 절대 알려주지 않고, 단지 당신 것이 아니라는 것만 알려줍니다.
다른 무언가가 먼저 그 행을 바꿨습니다 — 409.
제한
문서화된 엔드포인트 중 두 개는 한 번의 호출로 요청할 수 있는 양에 상한이 있습니다. 나머지는 없습니다.
호출당 상한이 없다고 해서 무제한이라는 뜻은 아닙니다. 키는 여전히 만료되고, 쓰기에는 여전히 필드 길이 제한이 있고, 카테고리나 패턴 규칙 생성은 요금제 쿼터에 걸릴 수 있고, 요금제에 따라 오래된 내역이 계속 숨겨질 수 있으며, 모든 호출은 아래에서 설명하는 요금제의 속도 제한에 포함됩니다.
계좌, 잔액, 요약, 카테고리와 태그 목록, 카테고리 생성, 태그 생성, 단일 거래 쓰기, 그리고 모든 규칙 엔드포인트는 호출당 물량 상한이 없습니다. 요청한 전체 세트, 또는 지정한 한 행 그대로를 돌려받습니다. 다만 규칙 미리 보기는 예외로, 맞은 거래를 세지만 돌려주는 것은 그 키 최대 50개와 샘플 최대 10개뿐입니다.
pageSize는 거부되지 않고 100으로 조정됩니다. 더 많이 요청해도 200과 함께 100개 행이 돌아옵니다 — 보낸 값을 믿지 말고 응답의 pagination.pageSize를 읽으세요.
거래 일괄 쓰기는 id 100개로 제한되며, pageSize와 달리 조정이 아니라 거부됩니다: 101개를 보내면 400이 오고 아무것도 바뀌지 않습니다.
키는 생성할 때 선택한 일정에 따라 만료됩니다 — 무료 플랜은 최대 90일, 유료 플랜은 365일입니다. 만료되지 않는 옵션은 없습니다.
플랜에 따라 오래된 거래를 숨기는 히스토리 윈도우 하한이 적용될 수 있습니다. 거래 응답에는 하한이 적용됐는지와 어디에 걸렸는지를 알려주는 historyWindow 필드가 담겨 있습니다.
속도 제한
Era가 공개하는 속도 제한은 두 가지입니다. 모든 요금제에는 버스트 상한이 있습니다. 직전 1분 동안의 요청 수 상한입니다. 무료 요금제에는 하루 예산도 있습니다. 직전 24시간 동안의 요청 수 상한입니다. 요청은 보낸 지 1분이 지나면 버스트 상한 계산에서, 하루가 지나면 하루 예산 계산에서 빠집니다. 당분간 유료 요금제에는 공개된 하루 예산이 없습니다. 둘 중 하나나 API가 적용하는 다른 상한을 넘기면 호출은 429로 돌아옵니다.
상한은 키가 아니라 계정에 속합니다. 만든 모든 REST 키가 같은 버스트 상한을, 무료 요금제에서는 같은 하루 예산도 함께 쓰므로 키를 하나 더 만들어도 호출이 늘지 않습니다. MCP 도구 호출은 따로 집계되므로, REST 호출과 MCP 호출이 서로의 상한을 쓰는 일은 없습니다.
| 요금제 | 하루 예산 | 버스트 상한 |
|---|---|---|
| Basic | 하루 100건 | 분당 10건 |
| Organize | 없음 | 분당 30건 |
| Automate | 없음 | 분당 60건 |
| Optimize | 없음 | 분당 60건 |
| Operate | 없음 | 분당 120건 |
당분간 유료 요금제에는 공개된 하루 예산이 없습니다.
유료 요금제에는 공정 사용도 적용됩니다. API는 본인의 금융 데이터를 다루는 스크립트, 대시보드, 연동을 위한 것이며, 한 사람이 쓰기에 알맞은 양을 전제로 합니다.
어느 요금제에서도 버스트 상한을 알려주는 헤더는 없으므로, 표를 기준으로 속도를 조절하세요. 무료 요금제에서는 버스트가 429로 돌아오기 직전에도 X-RateLimit-Remaining이 0보다 훨씬 클 수 있습니다.
429가 알려주는 것
어떤 상한에 걸렸는지 알려줍니다. X-RateLimit-* 헤더가 실린 429는 무료 요금제의 하루 예산, 없는 429는 버스트 상한 같은 다른 상한 때문입니다. 본문은 problem-details 형식이며, detail 필드에는 다음 요청이 비는 시각이 적혀 있습니다. 하루 예산이나 버스트 상한에 걸린 경우에는 그 상한, 그 상한이 허용하는 양, 그리고 상한을 올리거나 없애주는 요금제(이미 최상위라면 그렇다는 사실)도 적혀 있습니다. 사람이 읽도록 쓴 글이므로, 파싱하지 말고 헤더를 읽으세요.
{
"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."
}모든 429에는 Retry-After도 실립니다. 초 단위의 정수이며, 1초에서 24시간까지입니다. 버스트 상한의 대기는 최대 1분이고, 무료 요금제의 하루 예산은 24시간을 꽉 채워 요구할 수 있습니다. 거부된 호출은 어느 상한에도 포함되지 않지만, 서둘러 다시 시도하지 마세요. 모든 429에서 Retry-After가 지날 때까지 기다리세요. 하루 예산과 버스트 상한에서는 이르게 다시 시도하면 또 거부되고, 대기가 끝나면 비는 것은 요청 한 건이지, 상한 전체가 아닙니다. 보내고 돌아오는 내용을 확인하세요. 거부되면 다른 Retry-After가, 무료 요금제에서 처리되면 헤더가 돌아옵니다.
속도 제한은 행방을 놓친 키를 지켜주지 않습니다. 유출된 키는 계정의 다른 모든 키와 같은 한도에서 차감되며, 그 키의 범위가 허용하는 일은 무엇이든 할 수 있습니다. 키를 폐기해도 이미 한 호출은 돌려받을 수 없습니다. 키가 의심스러우면 폐기하세요. 아래의 보안과 키 관리를 참고하세요.
공통 규칙
응답 필드는 camelCase입니다. 쿼리 파라미터 이름은 대소문자를 가리지 않지만, 그 밖에는 이 페이지에 적힌 그대로 써야 합니다. 그래서 pageSize와 PageSize는 둘 다 통합니다. 공개된 명세는 대부분을 PascalCase로 적습니다. 대부분의 엔드포인트는 받지 않는 쿼리 키를 무시하므로, 철자가 틀린 필터는 그냥 적용되지 않습니다. 돌아온 결과를 확인하세요. 규칙 삭제, 켜기, 끄기 호출은 예외입니다. 다른 키는 그 이름을 밝힌 400으로 거부합니다. revert_retroactively는 밑줄을 넣어 보내세요(revertRetroactively는 거부됩니다). 그리고 삭제와 끄기에만 보내세요. 켜기는 version만 받습니다.
달력의 하루를 가리키는 필드는 YYYY-MM-DD입니다. 어느 한 시점을 가리키는 필드는 오프셋이 붙은 ISO 8601입니다.
페이지 크기는 거절되는 것이 아니라 잘려 맞춰집니다. pageSize에 500을 넣어도 돌아오는 것은 100건과 200이지 오류가 아닙니다. 그러니 보낸 값을 믿지 말고 pagination.pageSize를 다시 읽으세요.
응답에는 이 페이지에 적히지 않은 필드가 담길 수 있습니다. 모르는 필드는 오류로 만들지 말고 그냥 넘기세요. 그래야 API가 자라도 당신의 클라이언트가 계속 동작합니다.
REST는 평범한 HTTP라 호출하는 데 SDK가 필요 없습니다. HTTP 클라이언트가 있는 언어면 어떤 것이든 됩니다. 설치할 것은 없습니다.
버전과 변경
API는 베타 단계라서, 엔드포인트나 필드, 호출의 동작 방식 등 여기 문서로 적힌 내용은 바뀔 수 있습니다.
경로에 버전 번호가 없고 버전 헤더도 없습니다. 엔드포인트마다 살아 있는 버전은 하나이고, 그것이 여기 적힌 버전입니다.
변경 이력
Era API를 포함한 Era Developer Platform의 변경 사항을 최신순으로 정리했습니다. 이메일이나 피드로는 알려 드리지 않으니, API로 작업을 계획할 때는 변경 이력을 확인하세요.
보안과 키 관리
에이전트를 승인하면 키가 만들어집니다
OAuth로 에이전트를 승인하면 Era가 그 에이전트용 API 키를 만듭니다. 직접 만든 키들과 같은 대시보드 목록에, 클라이언트 이름을 바탕으로 Era가 지은 이름으로 나타납니다.
이름이 붙는 방식
Auto -- Claude그 화면에서 승인한 범위만 정확히 지니고, 그 밖의 것은 없습니다. 대시보드에서 폐기하면, 다시 승인할 때까지 에이전트는 새 액세스 권한을 받을 수 없습니다. 이미 가진 토큰은 만료될 때까지, 최대 한 시간 동안 계속 작동합니다.
쓰기는 활동 기록에 남고, 읽기는 남지 않습니다
키를 만들고 폐기하는 일은 둘 다 활동 기록에 남고, 에이전트가 MCP로 하는 모든 도구 호출도 남습니다. REST 쓰기도 남습니다 — 태그를 만들었다, 거래를 수정했다처럼 그 쓰기가 만든 변경으로 기록됩니다. REST 읽기는 항목을 전혀 만들지 않습니다. 이 항목들은 어느 요금제에서나 기록되지만, 기록 전체를 읽으려면 Organize 이상이 필요합니다. 그 아래에서는 가장 최근 항목만 보입니다. 쓰기 항목에는 계정이 기록되며, 변경을 만든 키는 기록되지 않습니다.
어떤 키가 미덥지 않다면 폐기하세요. 직접 만든 키는 다음 요청부터 REST와 MCP에서 작동하지 않습니다. 에이전트의 키는 즉시 새 액세스 권한을 받지 못하고, 이미 가진 토큰도 한 시간 이내에 만료됩니다. 새로 만드는 데는 1분이면 됩니다.
- 범위는 성깁니다
- banking:read는 이 페이지의 읽기보다 훨씬 넓은 범위를 읽습니다. 같은 범위가 계정의 나머지 읽기, 곧 잔액·보유 자산·연결·지출까지 덮습니다. 범위는 이 하나뿐이고, 이보다 좁은 선택지는 없습니다. 쓰기 범위도 읽기 범위와 마찬가지로 선택지에 있습니다. 어떤 키든 당신의 Era 계정으로서 동작하니, 비밀번호처럼 다루세요. 계정의 일부가 아니라 Era 계정 전체로서 동작합니다.
- banking:write는 은행이 아니라 Era를 바꿉니다
- banking:write는 Era가 보관하는 것만 바꾸고, 은행이 가진 것은 하나도 바꾸지 않습니다. 돈을 옮기거나 결제를 할 수 없습니다. banking:read처럼 banking:write도 하나의 넓은 범위입니다. Era에서 직접 할 수 있는 변경을 다루며, 예를 들어 거래의 카테고리, 가맹점 이름, 메모, 검토 상태; 카테고리, 태그, 자동화 규칙; Era가 계좌에 표시하는 이름과 어떤 계좌를 볼지; 그리고 수동 계좌와 그 잔액·거래가 있습니다. 새 연결을 시작할 수는 있지만, 은행 로그인은 키가 아니라 제공자의 화면에서 당신이 직접 합니다. 새 동기화를 요청하거나(읽기만 합니다) 금융기관 연결을 해제할 수도 있습니다. 연결을 해제하면 Era와의 연결만 끊기고, 은행의 계좌는 열린 채 그대로 유지됩니다.
- 범위는 갱신되지 않습니다
- 키의 범위는 만들 때 정해지고 이후로 바뀌지 않습니다. 어떤 범위가 덮고 있지만 아직 열리지 않은 것에서 이 점이 중요합니다. 오늘 social:write를 부여하면, 공유 뷰가 열리는 날에도 그 키는 그것을 그대로 지니고 있습니다. 지금 쓰는 것만 부여하고, 언젠가 쓸지도 모르는 것은 두세요.
- 승인이 필요 없습니다
- 키를 만드는 데 심사도 대기열도 없고, Era의 누구도 요청을 승인하지 않습니다. 만드는 순간 활동 기록에 남으니, 만든 적 없는 키는 쉽게 알아챌 수 있습니다.
- 은행 로그인에는 닿지 않습니다
- 키는 은행 로그인에 닿지 못합니다. Era가 그것을 아예 갖고 있지 않기 때문입니다. 로그인 정보는 데이터 제공자가 운영하는 연결 화면에서 입력하지, Era 화면에서 입력하지 않습니다. 이후 Era가 보관하는 것은 연결마다 하나씩 있는 액세스 토큰뿐이며, AES-256으로 암호화되어 저장되고, 기관 연결을 끊으면 버릴 수 있습니다.
- Era는 키의 해시만 보관합니다
- 키는 256비트의 무작위 데이터입니다. Era는 이를 SHA-256으로 해시하고 해시만 보관하므로, 잃어버리면 폐기하고 새로 만드세요.
핵심 리소스
계좌
연결된 모든 기관에 걸쳐, 볼 수 있는 계좌를 전부 돌려줍니다. 빠진 계좌가 몇 개인지도 함께 옵니다. 그 수가 excludedAccountCount이고, 요금제의 계좌 한도 때문에 빠진 tierExcludedAccountCount와 직접 숨긴 userExcludedAccountCount로 나뉩니다. accountLimit은 모든 연결을 합쳐 요금제가 한 번에 보여 주는 계좌 수입니다. accountLimitLift는 숨기지 않은 계좌가 모두 들어가는 가장 저렴한 요금제의 이름이고, 요금제 때문에 빠진 계좌가 없으면 null입니다. 계좌마다 잔액 엔드포인트가 경로로 받는 값인 accountGroupKey와, 그 계좌가 속한 connectionId가 함께 담겨 있으니 먼저 이 호출부터 하시면 됩니다. connectionId로 한 연결만 좁힐 수 있고(개수는 함께 좁혀지지만 accountLimit과 accountLimitLift는 그대로입니다), includeExcluded로 요금제 때문에 빠진 계좌와 숨겨 둔 계좌까지 넣을 수 있습니다.
- connectionId선택
- 목록을 한 연결의 계좌로만 좁힙니다.
- includeExcluded선택
- 요금제 때문에 빠진 계좌와 숨긴 계좌도 포함하되, 잔액은 알려 주지 않습니다. 어느 쪽인지는 각 행의 visibility가 알려 줍니다. tierExcluded 또는 userExcluded이고, 나머지는 visible입니다. 잔액 엔드포인트는 이 값을 다르게 표기하니, 두 곳에 같은 파서를 쓰지 마세요. 이 값이 true여도 excludedAccountCount는 오고, 그 계좌들은 이미 목록에 들어 있으니 둘을 더하지 마세요. 기본값은 false입니다.
{
"accounts": [
{
"accountGroupKey": "uagr_7f3c9a21",
"connectionId": "ucon_4b19e02c",
"name": "Everyday Checking",
"currentBalance": 4820.16,
"supportsTransactions": true,
…
}
],
"excludedAccountCount": 1
}숨겨 둔 계좌나 요금제에서 제외된 계좌에서는 잔액 필드가 0이 아니라 null로 옵니다. null은 비었다는 뜻이 아니라 알려 주지 않는다는 뜻입니다. supportsTransactions의 null도 같은 뜻으로, Era가 말할 수 없다는 것이지 답이 아니라는 뜻은 결코 아닙니다. 요금제 필드도 마찬가지입니다. 그 호출에서 Era가 요금제를 읽지 못했다면 tierExcludedAccountCount, userExcludedAccountCount, accountLimit, accountLimitLift가 모두 null로 옵니다. 계좌 한도가 없는 요금제에서는 accountLimit도 null이고, 더 여유 있는 요금제가 없거나 요금제 때문에 빠진 계좌가 없을 때는 accountLimitLift가 null입니다.
계좌 잔액
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
}숨긴 계좌도, 연결이 끊긴 계좌도 여전히 200으로 답합니다. 대신 잔액 필드가 null입니다. 404는 그 계좌가 정말로 없거나, 키가 키 형태가 아니었다는 뜻입니다. 여기서는 visibility 필드를 눈여겨보세요. 계좌가 보일 때는 null, 요금제의 계좌 한도 때문에 빠졌을 때는 tier_excluded, 직접 숨겼을 때는 user_excluded, 연결이 끊겼을 때는 connection_severed가 들어갑니다. tier_excluded일 때는 accountLimit이 요금제의 한도이고, accountLimitLift는 이 계좌를 포함해 숨기지 않은 계좌가 모두 들어가는 가장 저렴한 요금제의 이름입니다. 그 밖의 상태에서는 accountLimitLift가 null이고, connection_severed일 때는 accountLimit도 null입니다.
계좌 요약
볼 수 있는 계좌들의 합계이며, 기본은 라이브 계좌입니다. totalAssets, totalLiabilities, 그리고 앞의 것에서 뒤의 것을 뺀 netWorthHint가 들어 있습니다. simulationModes를 넘기면 어떤 모드를 셀지 고를 수 있으며, 계좌 목록과 합계는 지정한 모드만 포함합니다. 어떤 모드를 포함했는지는 includedSimulationModes가 모든 응답에서 알려 줍니다. simulationExcludedAccountCount는 모드 때문에 빠진, 볼 수 있는 계좌의 수입니다. totalHiddenCount는 별도의 수치로, 요금제나 직접 설정한 표시 설정 때문에 숨겨진 계좌를 모든 모드에서 세며, simulationModes가 제외한 계좌는 절대 포함하지 않습니다.
- simulationModes선택
- 합산할 계좌의 종류입니다. live는 실제 돈, paper는 증권사의 연습용 계좌, scenario는 가상의 계좌입니다. 둘 이상 요청하려면 simulationModes=live&simulationModes=paper처럼 파라미터를 반복하세요. 생략하면 라이브 계좌만 포함합니다. 비어 있거나 알 수 없는 값은 허용되는 값을 알려 주는 400으로 거부됩니다.
{
"userId": "7d1c0b93a8e24f60",
"accounts": [ … ],
"totalVisibleCount": 6,
"totalHiddenCount": 2,
"totalAssets": 48210.75,
"totalLiabilities": 9327.40,
"netWorthHint": 38883.35,
"includedSimulationModes": [ "live" ],
"simulationExcludedAccountCount": 0,
"computedAt": "2026-08-11T09:32:00Z"
}netWorthHint가 세는 것은 이 응답에 담긴 계좌뿐이며, 무엇이 빠졌는지는 두 수치가 알려 줍니다. simulationExcludedAccountCount는 요청한 모드 밖의 계좌 수입니다. totalHiddenCount는 모든 모드에서 숨겨진 계좌 수입니다. 이 수치는 둘로 나뉩니다. tierExcludedAccountCount는 요금제의 계좌 한도 때문에 빠진 계좌이고, userExcludedAccountCount는 직접 숨긴 계좌입니다. 해당 호출에서 Era가 요금제를 읽지 못했다면 둘 다 null입니다. accountLimitLift는 앞의 계좌들을 되돌리는 가장 저렴한 요금제의 이름이고, 그런 계좌가 없으면 null입니다. netWorthHint는 확정된 순자산이 아니라 출발점이 되는 숫자로 다루세요.
거래
거래를 한 페이지씩, 페이지 수 정보와 함께 감싸서 돌려줍니다. page와 pageSize(최대 100)를 받고, 계좌·기간·적용된 규칙·부여된 태그로 선택적 필터를 걸 수 있습니다.
- accountId선택
- 한 계좌의 거래로만 좁힙니다. 그 계좌의 accountGroupKey로 지정합니다.
- fromDate선택
- 이 날짜 이후 거래만 반환합니다.
- toDate선택
- 이 날짜 이전 거래만 반환합니다.
- page선택
- 페이지 번호, 1부터 시작. 기본값은 1입니다.
- pageSize선택
- 페이지당 행 수. 기본값은 50이며, 100까지 제한됩니다.
- sortBy선택
- 정렬 기준 필드: transactionDate, amount, description, category, merchantName 중 하나.
- sortDirection선택
- asc 또는 desc. 기본값은 내림차순입니다.
- categoryKeys선택
- 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.
- search선택
- 가맹점, 설명, 카테고리, 계좌 이름, 금액에 걸친 전체 텍스트 검색입니다.
- ruleIds선택
- 자동화 규칙이 적용된 거래만, 규칙의 키로 지정합니다.
- tagKeys선택
- 이 태그 중 하나가 붙은 거래만 반환합니다.
- reviewStatuses선택
- needs_review, reviewed, flagged 중 하나입니다. 여러 개를 지정할 수 있으며, 검토 상태가 그중 하나인 거래가 반환됩니다.
- includeChildren선택
- With a category filter set, also include transactions in the subcategories of every key you passed. Defaults to false.
- includePending선택
- 지난 7일간의 보류 중 거래도 함께 반환하며, isPending으로 표시됩니다. 기본값은 false입니다. 보류 중 행은 읽기 전용입니다.
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}요금제에 따라 히스토리 윈도 경계가 적용되어, 그보다 오래된 거래는 가려집니다. 응답에 historyWindow 필드들이 담기는 이유가 이것입니다. historyWindowApplied는 경계가 실제로 무언가를 가렸음을, historyWindowFloorDate는 그 경계가 어디인지를, historyWindowHiddenCount는 뒤에 몇 건이 있는지를, historyWindowEarliestDate는 히스토리가 실제로 어디까지 거슬러 가는지를 알려 줍니다. 이것이 없으면 짧은 결과는 더 오래된 거래가 없는 계정과 구분되지 않습니다. 이 가운데 둘은 코드를 다르게 쓰게 만듭니다. historyWindowHiddenCount는 경계가 적용된 경우에도 null일 수 있으니, null은 0이 아니라 알 수 없음이라는 뜻으로 읽으세요. 그리고 historyWindowDegraded가 true이면 그 조회에서 Era가 요금제를 확인하지 못한 것이므로, 경계 날짜는 사실이 아니라 추정입니다. 요금제가 확인된 유료 조회에서는 경계가 적용되지 않고 historyWindowApplied는 false로 돌아옵니다. 요금제의 계좌 한도 때문에 빠지는 거래도 있습니다. tierExcludedAccountCount는 이 조회에서 한도 때문에 빠진 계좌 수이고, userExcludedAccountCount는 직접 숨긴 계좌 수입니다. 계좌로 필터링했다면 둘 다 그 계좌만 셉니다. 그 호출에서 Era가 요금제를 읽지 못했다면 둘 다 null입니다.
긴 내역을 페이지별로 넘기면 요청이 소모됩니다. 요금제는 호출 속도를 제한하고, 무료 요금제에서는 하루에 쓸 수 있는 호출 수도 제한합니다. 유료 요금제는 공정 사용 원칙에 따라 운영됩니다. 요금제별 수치, 속도 제한 헤더, 그리고 429가 알려주는 내용은 제한 섹션에 있습니다.
거래 하나 바꾸기
거래에서 직접 재지정할 수 있는 것은 네 가지입니다: 카테고리, 가맹점 이름, 직접 남긴 메모, 그리고 검토 상태. 바꾸려는 것만 보내세요 — 빼놓은 것은 그대로 남습니다. 경로의 id는 그 거래의 utgr_ 키입니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 거래 사본뿐이고 은행에 있는 거래는 그대로입니다.
- categoryKey선택
- 지정할 카테고리의 fcat_ 키입니다. 빼면 거래는 지금 가진 카테고리를 그대로 유지합니다.
- merchantName선택
- 직접 정한 가맹점 이름, 최대 1000자. 빼면 지금 이름이 그대로 유지됩니다.
- description선택
- 이 거래에 대한 직접 남긴 메모, 최대 5000자. 빼면 지금 메모가 그대로 유지됩니다.
- clearCategory선택
- 카테고리 재지정을 지워서, Era 자체 분류가 다시 적용되게 합니다. 기본값은 false입니다.
- clearMerchantName선택
- 가맹점 이름 재지정을 지워서, 은행이 보낸 이름이 다시 돌아오게 합니다. 기본값은 false입니다.
- clearDescription선택
- 메모 재지정을 지워서, 은행이 보낸 설명이 다시 돌아오게 합니다. 기본값은 false입니다.
- reviewStatus선택
- needs_review, reviewed, flagged 중 하나로 표시합니다.
- clearReviewStatus선택
- 검토 상태 재지정을 지웁니다. 기본값은 false입니다.
{
"transaction": { … }
}업데이트된 거래 전체가 응답으로 돌아오는데, 위 목록이 돌려주는 것과 같은 형태입니다 — 크고 API가 베타인 동안 계속 바뀌기 때문에 여기서는 다시 적지 않았습니다. 같은 필드를 지정하면서 동시에 지우면 400이 돌아옵니다. 당신 것이 아니거나 아예 존재하지 않는 거래라면 403이 돌아옵니다 — API는 이 둘을 구분해 알려주지 않습니다. 그리고 쓰는 동안 다른 무언가가 같은 행을 바꿨다면 409가 돌아옵니다: 다시 읽고 다시 보내세요.
한 번에 최대 100개 바꾸기
같은 네 가지 재지정을, 한 번의 호출로 거래 목록 전체에 적용합니다. 목록의 모든 id가 같은 변경을 받습니다 — 거래마다 다르게 적용할 수는 없습니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 그 거래들의 사본뿐이고 은행에 있는 거래는 그대로입니다.
- transactionIds
- 바꿀 거래들의 utgr_ 키. 최소 하나, 최대 100개까지입니다. 100개를 넘으면 잘라내지 않고 아예 거절합니다 — 위의 pageSize와 달리, 400이 돌아오고 아무것도 바뀌지 않습니다.
- categoryKey선택
- 지정할 카테고리의 fcat_ 키입니다. 빼면 거래는 지금 가진 카테고리를 그대로 유지합니다.
- merchantName선택
- 직접 정한 가맹점 이름, 최대 1000자. 빼면 지금 이름이 그대로 유지됩니다.
- description선택
- 이 거래에 대한 직접 남긴 메모, 최대 5000자. 빼면 지금 메모가 그대로 유지됩니다.
- clearCategory선택
- 카테고리 재지정을 지워서, Era 자체 분류가 다시 적용되게 합니다. 기본값은 false입니다.
- clearMerchantName선택
- 가맹점 이름 재지정을 지워서, 은행이 보낸 이름이 다시 돌아오게 합니다. 기본값은 false입니다.
- clearDescription선택
- 메모 재지정을 지워서, 은행이 보낸 설명이 다시 돌아오게 합니다. 기본값은 false입니다.
- reviewStatus선택
- needs_review, reviewed, flagged 중 하나로 표시합니다.
- clearReviewStatus선택
- 검토 상태 재지정을 지웁니다. 기본값은 false입니다.
{
"transactions": [ … ]
}업데이트된 거래들이 응답으로 돌아오는데, 위 목록이 돌려주는 것과 같은 형태입니다. 같은 필드를 지정하면서 동시에 지우면 400이 돌아오고, 빈 목록을 보내도 마찬가지입니다. 당신 것이 아니거나 아예 존재하지 않는 거래가 목록에 하나라도 있다면, 호출 전체에 403이 돌아옵니다 — 아무것도 바뀌지 않습니다. 쓰는 동안 다른 무언가가 그 행들 중 하나를 바꿨다면 409가 돌아옵니다: 다시 읽고 다시 보내세요.
카테고리
카테고리 체계 전체입니다. 카테고리 묶음마다 하위 카테고리가 중첩되어 들어 있습니다. 이 체계는 공용이며 계좌별이 아닙니다.
{
"packs": [
{
"packSlug": "default",
"packName": "Era default categories",
"isDefault": true,
"categories": [
{
"projectionKey": "fcat_food_dining",
"categoryName": "Food & dining",
"isTopLevel": true,
"children": [ … ]
}
]
}
],
"meterLimit": 25,
"canCreateCustomCategories": true
}카테고리 추가하기
기존 상위 카테고리 아래에 만드는 사용자 정의 카테고리입니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 카테고리뿐이고 은행에서는 아무것도 바뀌지 않습니다.
- slug
- URL에 쓸 수 있는 식별자 — 소문자, 숫자, 하이픈만, 2~50자.
- parentCategoryKey
- 이 카테고리가 속할 상위 카테고리의 fcat_ 키.
- name
- 표시 이름.
- description선택
- 선택적 설명.
- iconName선택
- 선택적 아이콘 이름.
- spendingType선택
- 선택적 지출 분류.
- displayOrder선택
- 형제 카테고리들 사이의 선택적 정렬 위치.
- assignmentEligibility선택
- 이 카테고리를 어떤 거래에 지정할 수 있는지에 대한 선택적 규칙.
- sourceSystemKeys선택
- 앞으로 이곳으로 라우팅할, 기존 카테고리 키들의 선택적 목록.
- applyRetroactively선택
- true면 과거 거래도 새 라우팅 기준으로 다시 평가합니다. 기본값은 false입니다.
{
"categoryKey": "fcat_side_hustle_9f2a",
"overlayProjectionKey": "fcov_9f2a1c",
"action": "created",
"isQuotaExceeded": false,
"createdMappingRuleKeys": [ … ],
…
}응답에는 retroactiveAffectedCount, mergeSourcesHiddenCount, mergeSourcesTotalCount도 담겨 있는데, 이 페이지에서는 다루지 않습니다. 여기에 isQuotaExceeded, quotaExceededMessage, meterGate도 오는데, 생성된 카테고리에서는 항상 false, null, null입니다. 요금제 한도 때문에 생성이 거절되면 대신 402가 오고, 이 필드들은 하나도 담기지 않습니다. 본문은 statusCode, message, errors.generalErrors이며, errors.generalErrors의 유일한 항목이 어느 한도에 걸렸는지 알려 줍니다.
태그
계정의 모든 태그를 한 목록으로 돌려줍니다. 페이지 나눔은 없습니다. 한 번의 응답이 전부를 돌려줍니다.
- tagType선택
- 태그 출처로 필터링합니다: user, system, auto 중 하나.
- includeDeleted선택
- 삭제된 태그도 포함합니다. 기본값은 false입니다.
{
"tags": [
{
"tagKey": "utag_9c2f01ab",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"color": "#6DC6BA",
"transactionCount": 42
}
]
}태그 만들기
새 태그이며, 이름은 소문자로 정규화됩니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 태그뿐이고 은행에서는 아무것도 바뀌지 않습니다. 시스템 태그는 API로 만들 수 없고, user 태그와 auto 태그는 만들 수 있습니다.
- name
- 태그의 표준 이름.
- displayName선택
- 선택적 표시 이름. 기본값은 표준 이름입니다.
- tagType선택
- user or auto. Defaults to user. system is refused — it is reserved for tags Era creates itself.
- color선택
- 표시용 선택적 16진 색상.
- icon선택
- 선택적 아이콘 이름.
{
"tag": {
"tagKey": "utag_9c2f01ab",
"name": "business-expense",
"displayName": "Business expense",
"tagType": "user",
"version": 1,
"createdAt": "2026-08-26T09:15:00Z"
}
}규칙
계정의 모든 자동화 규칙입니다. 직접 만든 규칙과 Era가 규칙 라이브러리에서 설정해 준 규칙 모두, 각각의 조건(filters), 하는 일(actions), 켜져 있는지 여부, 그리고 버전을 함께 돌려줍니다. 페이지 나눔은 없습니다. 한 번의 응답이 전부를 돌려줍니다. 꺼진 규칙은 요청하지 않으면 빠집니다.
- includeInactive선택
- 꺼져 있는 규칙도 돌려줍니다. 기본값은 false입니다.
{
"rules": [
{
"id": "rule_4c1e7a90",
"ruleName": "Coffee shops",
"isActive": true,
"version": 3,
"priority": 10,
"filters": [{ "type": "merchant_match", "pattern": "Blue Bottle", "mode": "contains" }],
"actions": [{ "type": "set_category", "categoryKey": "fcat_coffee_shops", "categoryDisplayName": "Coffee shops" }],
"source": "user",
"matchedTransactionCount": 42,
…
}
]
}filters와 actions는 타입이 지정된 객체의 목록입니다. 각 객체는 type 필드에 종류를 적습니다 — 필터라면 merchant_match나 category, 액션이라면 set_category나 add_tag처럼요. 모든 종류와 각 종류가 받는 필드는 빠른 시작에서 링크한 OpenAPI 문서에 나와 있습니다.
규칙 만들기
새 자동화 규칙입니다. 거래를 골라내는 조건과, 조건에 맞는 거래 각각에 일어나는 일로 이루어집니다. 만든 뒤로는 새 거래마다 실행되고, 요청하면 이미 있는 거래에도 실행됩니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 규칙과 거래뿐이고 은행에서는 아무것도 바뀌지 않습니다.
- ruleName
- 규칙의 이름입니다.
- description선택
- 규칙의 용도에 대한 선택 메모입니다.
- priority선택
- 다른 규칙들 사이에서 이 규칙이 실행되는 순서입니다. 높은 것이 먼저 실행되고, 두 규칙이 한 거래에 같은 항목을 설정하려 하면 높은 쪽이 이깁니다. 기본값은 0입니다.
- filters
- 조건입니다. 타입이 지정된 필터 객체의 목록이며, 각 객체는 type 필드에 종류를 적습니다. 거래는 모든 조건을 만족해야 합니다. 다르게 조합하려면 and, or, not 필터를 중첩하세요. 최소 하나가 필요합니다. 계좌 유형을 지정한 account_type 필터는 패턴 규칙에서만 작동하며, 거래 규칙에서는 400으로 거부됩니다.
- actions
- 규칙에 맞는 거래 각각에 일어나는 일입니다. 타입이 지정된 액션 객체의 목록으로, 카테고리 설정, 태그 추가나 제거, 가맹점 이름 변경, 설명 다시 쓰기, 검토 상태 설정, 숨기기, 이체로 표시하기를 할 수 있습니다. 최소 하나가 필요하고, 태그 액션을 빼면 종류마다 하나까지입니다. 각 태그는 이미 있어야 하며, 한 번만 넣을 수 있습니다.
- isActive선택
- 규칙을 켠 상태로 시작할지 여부입니다. 기본값은 true입니다.
- applyRetroactively선택
- 새 거래뿐 아니라 이미 있는 거래에도 규칙을 실행합니다. 규칙이 켠 상태로 시작할 때만 적용됩니다. 기본값은 false입니다.
- appliesFrom선택
- 이 날짜 또는 그 이후의 거래만 대상입니다.
- appliesTo선택
- 이 날짜 또는 그 이전의 거래만 대상입니다.
- applicationScope선택
- 규칙이 실행되는 때입니다. 새 거래에만 적용하면 prospective, 기존 거래에 대해 실행할 때는 retroactive, 둘 다면 both입니다. 기본값은 both입니다.
- ruleScope선택
- 기본값인 transaction은 거래를 하나씩 판단합니다. pattern은 반복 청구나 한 쌍의 이체처럼 여러 거래에 걸친 패턴을 찾으며, 그 패턴은 patternSpec으로 기술합니다.
- triggerMode선택
- 패턴 규칙에서 패턴을 확인하는 때입니다. onEachTransaction, onBatchComplete, onSchedule, onDemand 중 하나이며, 기본값은 onEachTransaction입니다.
- patternSpec선택
- 패턴 규칙에서 찾을 패턴으로, 타입이 지정된 객체로 지정합니다. ruleScope가 pattern이면 필수입니다.
- windowDays선택
- 패턴 규칙에서 패턴의 나머지를 며칠 전까지 거슬러 찾을지입니다(1~365일). ruleScope가 pattern이면 필수입니다.
- windowLookaheadDays선택
- 패턴 규칙에서 패턴의 나머지를 며칠 뒤까지 찾을지입니다.
- windowExcludeTriggerAccount선택
- 패턴 규칙에서 확인을 시작하게 한 거래의 계좌를 검색에서 뺍니다. 기본값은 false입니다.
- group선택
- 규칙을 넣을 그룹입니다. spendingHabits, problemsAndAnomalies, incomeAndTransfers, subscriptionsAndRecurring, taxAndRecordKeeping 중 하나입니다. 빼면 어느 그룹에도 넣지 않습니다. categoryMapping은 Era가 직접 만드는 규칙용으로 예약되어 있어 400으로 거부됩니다.
{
"rule": { … },
"retroactiveStatus": "completed",
"affectedTransactionCount": 18
}retroactiveStatus는 호출에 이미 있던 거래에 규칙을 적용하거나 규칙이 한 일을 되돌리도록 요청한 경우가 아니면 null입니다. completed는 그 작업이 응답 전에 끝났다는 뜻이고, in_progress는 아직 진행 중이라 affectedTransactionCount가 확정되지 않았다는 뜻이며, queue_full은 대기열이 가득 차서 작업이 시작되지 않았다는 뜻입니다(규칙 자체의 변경은 저장되었습니다). partial_success는 일부만 처리되었다는 뜻으로, 일부 변경이 저장되지 않았거나 작업의 일부만 대기열에 들어갔습니다.
규칙 미리 보기
규칙의 조건을 최근 거래에 적용해 보고, 아무것도 저장하지 않은 채 무엇에 맞을지 알려 줍니다. 확인한 거래 중 몇 개가 맞았는지, 맞은 거래의 키를 최대 50개, 그리고 샘플을 최대 10개 돌려줍니다. 거래 규칙은 최근 90일 동안의 거래를 최대 5,000개까지 확인하며, 그 샘플에는 가맹점·금액·날짜가 담깁니다. 패턴 규칙의 샘플에는 패턴이 감지된 이유인 detectionReason(비어 있을 수 있습니다)이 담기며 가맹점·금액·날짜는 없습니다. 아무것도 쓰지 않으므로 banking:read로 충분합니다.
- filters
- 조건입니다. 타입이 지정된 필터 객체의 목록이며, 각 객체는 type 필드에 종류를 적습니다. 거래는 모든 조건을 만족해야 합니다. 다르게 조합하려면 and, or, not 필터를 중첩하세요. 최소 하나가 필요합니다. 계좌 유형을 지정한 account_type 필터는 패턴 규칙에서만 작동하며, 거래 규칙에서는 400으로 거부됩니다.
- ruleScope선택
- 기본값인 transaction은 거래를 하나씩 판단합니다. pattern은 반복 청구나 한 쌍의 이체처럼 여러 거래에 걸친 패턴을 찾으며, 그 패턴은 patternSpec으로 기술합니다.
- patternSpec선택
- 패턴 규칙에서 찾을 패턴으로, 타입이 지정된 객체로 지정합니다. ruleScope가 pattern이면 필수입니다.
- windowDays선택
- 패턴 규칙에서 패턴의 나머지를 며칠 전까지 거슬러 찾을지입니다(1~365일). ruleScope가 pattern이면 필수입니다.
{
"matchCount": 12,
"totalEvaluated": 418,
"matchingGroupKeys": ["utgr_5d0e2b77", … ],
"sampleMatches": [
{
"groupKey": "utgr_5d0e2b77",
"merchantName": "Blue Bottle Coffee",
"amount": -6.25,
"currency": "USD",
"transactionDate": "2026-09-12"
},
…
]
}규칙 바꾸기
규칙의 정의를 보낸 내용으로 바꿉니다. 그러니 바꾸는 항목만이 아니라 남기고 싶은 항목도 모두 보내세요. 경로의 ruleId는 규칙 목록이 돌려주는 id이고, version은 마지막으로 읽은 것이어야 합니다. Era 라이브러리의 규칙에서는 userOverrides만 바꿀 수 있습니다. 나머지는 목록이 돌려준 그대로 다시 보내세요. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 규칙과 거래뿐이고 은행에서는 아무것도 바뀌지 않습니다.
- version선택
- 마지막으로 읽었을 때의 규칙 버전입니다. 규칙의 현재 버전과 일치해야 하며, 그렇지 않으면 호출이 409로 거부됩니다. 그러니 빼면 확인을 건너뛰는 게 아니라 실패하게 됩니다.
- ruleName
- 규칙의 이름입니다.
- description선택
- 규칙의 용도에 대한 선택 메모입니다.
- priority선택
- 다른 규칙들 사이에서 이 규칙이 실행되는 순서입니다. 높은 것이 먼저 실행되고, 두 규칙이 한 거래에 같은 항목을 설정하려 하면 높은 쪽이 이깁니다. 기본값은 0입니다.
- filters
- 조건입니다. 타입이 지정된 필터 객체의 목록이며, 각 객체는 type 필드에 종류를 적습니다. 거래는 모든 조건을 만족해야 합니다. 다르게 조합하려면 and, or, not 필터를 중첩하세요. 최소 하나가 필요합니다. 계좌 유형을 지정한 account_type 필터는 패턴 규칙에서만 작동하며, 거래 규칙에서는 400으로 거부됩니다.
- actions
- 규칙에 맞는 거래 각각에 일어나는 일입니다. 타입이 지정된 액션 객체의 목록으로, 카테고리 설정, 태그 추가나 제거, 가맹점 이름 변경, 설명 다시 쓰기, 검토 상태 설정, 숨기기, 이체로 표시하기를 할 수 있습니다. 최소 하나가 필요하고, 태그 액션을 빼면 종류마다 하나까지입니다. 각 태그는 이미 있어야 하며, 한 번만 넣을 수 있습니다.
- applyRetroactively선택
- 바뀐 규칙을 이미 있는 거래에 다시 실행합니다. 그 전에 이전 버전이 한 일을 먼저 되돌립니다. 기본값은 false입니다.
- appliesFrom선택
- 이 날짜 또는 그 이후의 거래만 대상입니다.
- appliesTo선택
- 이 날짜 또는 그 이전의 거래만 대상입니다.
- applicationScope선택
- 규칙이 실행되는 때입니다. 새 거래에만 적용하면 prospective, 기존 거래에 대해 실행할 때는 retroactive, 둘 다면 both입니다. 기본값은 both입니다.
- userOverrides선택
- Era 라이브러리의 규칙에서, 조정할 수 있게 허용된 설정에 대한 내 값입니다. 규칙의 패턴과 같은 종류의 타입 지정 객체로 보냅니다. 직접 만든 규칙에서는 무시됩니다.
- group선택
- 규칙을 넣을 그룹으로, 만들 때와 같은 목록에서 고릅니다. 변경은 정의 전체를 바꾸므로 빼면 규칙의 그룹이 지워집니다. 유지하려면 현재 그룹을 보내세요. Era 라이브러리의 규칙에서는 빼거나 이미 가진 그룹을 보내세요.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus는 호출에 이미 있던 거래에 규칙을 적용하거나 규칙이 한 일을 되돌리도록 요청한 경우가 아니면 null입니다. completed는 그 작업이 응답 전에 끝났다는 뜻이고, in_progress는 아직 진행 중이라 affectedTransactionCount가 확정되지 않았다는 뜻이며, queue_full은 대기열이 가득 차서 작업이 시작되지 않았다는 뜻입니다(규칙 자체의 변경은 저장되었습니다). partial_success는 일부만 처리되었다는 뜻으로, 일부 변경이 저장되지 않았거나 작업의 일부만 대기열에 들어갔습니다.
규칙 켜기
규칙을 다시 켜서 새 거래에 다시 실행되게 합니다. 이미 켜진 규칙을 켜도 아무것도 바뀌지 않습니다. Era 라이브러리의 규칙도 내 규칙처럼 켜고 끌 수 있습니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 규칙과 거래뿐이고 은행에서는 아무것도 바뀌지 않습니다.
- version선택
- 마지막으로 읽었을 때의 규칙 버전입니다. 빼면 확인을 건너뜁니다. 보내면, 그 뒤로 규칙이 바뀐 경우 호출이 409로 거부됩니다.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}규칙 끄기
규칙을 꺼서 새 거래에 더 이상 실행되지 않게 합니다. 정의는 그대로 남고, 이미 한 일도 revert_retroactively로 되돌려 달라고 하지 않는 한 남습니다. 이미 꺼진 규칙을 끄면 꺼진 상태로 남습니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 규칙과 거래뿐이고 은행에서는 아무것도 바뀌지 않습니다.
- version선택
- 마지막으로 읽었을 때의 규칙 버전입니다. 빼면 확인을 건너뜁니다. 보내면, 그 뒤로 규칙이 바뀐 경우 호출이 409로 거부됩니다.
- revert_retroactively선택
- 규칙이 이미 거래에 적용한 카테고리, 태그, 그 밖의 변경도 되돌립니다. 기본값은 false이며, 이 경우 그 변경은 그대로 남습니다.
{
"rule": { … },
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus는 호출에 이미 있던 거래에 규칙을 적용하거나 규칙이 한 일을 되돌리도록 요청한 경우가 아니면 null입니다. completed는 그 작업이 응답 전에 끝났다는 뜻이고, in_progress는 아직 진행 중이라 affectedTransactionCount가 확정되지 않았다는 뜻이며, queue_full은 대기열이 가득 차서 작업이 시작되지 않았다는 뜻입니다(규칙 자체의 변경은 저장되었습니다). partial_success는 일부만 처리되었다는 뜻으로, 일부 변경이 저장되지 않았거나 작업의 일부만 대기열에 들어갔습니다.
규칙 삭제하기
규칙을 완전히 삭제합니다. 규칙을 잃지 않고 멈추려면 대신 끄세요. 경로의 ruleId는 규칙 목록이 돌려주는 id이고, version은 마지막으로 읽은 것이어야 합니다. Era 라이브러리의 규칙은 삭제할 수 없고 끌 수만 있습니다. banking:read가 아니라 banking:write가 필요하지만, 바뀌는 것은 Era에 있는 당신의 규칙과 거래뿐이고 은행에서는 아무것도 바뀌지 않습니다. 삭제에 revert_retroactively를 요청하는 것은 한 번뿐인 시도입니다. queue_full이 돌아오면 규칙은 이미 사라졌고 다시 시도할 대상이 남아 있지 않습니다. 규칙을 삭제하면서 그 규칙이 한 일도 되돌리려면, 먼저 revert_retroactively와 함께 끄고(받아들여질 때까지 반복할 수 있습니다) 그다음에 삭제하세요.
- version선택
- 마지막으로 읽었을 때의 규칙 버전입니다. 규칙의 현재 버전과 일치해야 하며, 그렇지 않으면 호출이 409로 거부됩니다. 그러니 빼면 확인을 건너뛰는 게 아니라 실패하게 됩니다.
- revert_retroactively선택
- 규칙이 이미 거래에 적용한 카테고리, 태그, 그 밖의 변경도 되돌립니다. 기본값은 false이며, 이 경우 그 변경은 그대로 남습니다.
{
"success": true,
"retroactiveStatus": null,
"affectedTransactionCount": 0
}retroactiveStatus는 호출에 이미 있던 거래에 규칙을 적용하거나 규칙이 한 일을 되돌리도록 요청한 경우가 아니면 null입니다. completed는 그 작업이 응답 전에 끝났다는 뜻이고, in_progress는 아직 진행 중이라 affectedTransactionCount가 확정되지 않았다는 뜻이며, queue_full은 대기열이 가득 차서 작업이 시작되지 않았다는 뜻입니다(규칙 자체의 변경은 저장되었습니다). partial_success는 일부만 처리되었다는 뜻으로, 일부 변경이 저장되지 않았거나 작업의 일부만 대기열에 들어갔습니다.