Astrada bank-transactions API
Access bank transactions synced from connected accounts. Transactions are ingested via Plaid and can be matched against card transactions.
Access bank transactions synced from connected accounts. Transactions are ingested via Plaid and can be matched against card transactions.
openapi: 3.0.3
info:
title: Astrada bank-accounts bank-transactions API
version: '2024-02-28'
contact:
email: developer@astrada.co
description: 'Welcome to our API Reference. 👋
'
servers:
- url: https://api.astrada.co
security: null
tags:
- name: bank-transactions
description: Access bank transactions synced from connected accounts. Transactions are ingested via Plaid and can be matched against card transactions.
paths:
/bank-transactions/{subaccountId}/{transactionId}:
parameters:
- $ref: '#/components/parameters/subaccount-id-2'
- $ref: '#/components/parameters/transaction-id'
get:
tags:
- bank-transactions
summary: Retrieve bank transaction
description: Returns detailed information about a specific bank transaction by its identifier, including match status and transaction metadata.
operationId: GetBankTransaction
security:
- main-auth:
- banking:read
responses:
'200':
description: Successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/bank-transaction'
examples:
Example Get Bank Transaction Response:
$ref: '#/components/examples/bank-transaction'
'401':
$ref: '#/components/responses/unauthorized'
'403':
$ref: '#/components/responses/forbidden'
'404':
$ref: '#/components/responses/not-found'
'500':
$ref: '#/components/responses/server-error'
/bank-transactions/{subaccountId}:
parameters:
- $ref: '#/components/parameters/subaccount-id-2'
get:
tags:
- bank-transactions
summary: List bank transactions
description: 'Returns a list of bank transactions for a subaccount. Bank transactions are synced from connected financial institutions. A movement may briefly appear as its pending posting until the posted transaction replaces it (the pending row is then removed from the feed).
By default, `GET /bank-transactions/{subaccountId}` returns transactions ordered by the latest `date`.
This endpoint supports cursor-based pagination and various filters including date range, amount range, and match status.
'
operationId: ListBankTransactions
parameters:
- $ref: '#/components/parameters/bank-account-id-2'
- $ref: '#/components/parameters/card-id-2'
- $ref: '#/components/parameters/start-date'
- $ref: '#/components/parameters/end-date'
- $ref: '#/components/parameters/min-amount'
- $ref: '#/components/parameters/max-amount'
- $ref: '#/components/parameters/transaction-type'
- $ref: '#/components/parameters/matched'
- in: query
name: source
description: Filter transactions by source.
required: false
schema:
type: string
enum:
- PLAID
- UPLOAD
- in: query
name: statementId
description: Filter transactions by the statement they were imported from.
required: false
schema:
type: string
format: uuid
- $ref: '#/components/parameters/banking-limit'
- $ref: '#/components/parameters/cursor'
security:
- main-auth:
- banking:read
responses:
'200':
description: Successful operation
content:
application/json:
schema:
type: object
required:
- items
- pagination
properties:
items:
type: array
items:
$ref: '#/components/schemas/bank-transaction'
pagination:
type: object
required:
- hasMore
properties:
cursor:
type: string
description: Cursor to use for the next page of results.
hasMore:
type: boolean
description: Whether there are more results available.
examples:
Example List Bank Transactions Response:
value:
items:
- _links:
self:
href: /bank-transactions/1fcb895e-9217-4a6f-9d10-5a7dcef86c11/7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
bankAccount:
href: /bank-accounts/3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
card:
href: /cards/5dec2c49-0aa5-4683-a317-427eb5d115f3
match:
href: /transaction-matches/1fcb895e-9217-4a6f-9d10-5a7dcef86c11/b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e
id: 7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
accountId: 8f3a1b2c-4d5e-6f7a-8b9c-0d1e2f3a4b5c
subaccountId: 1fcb895e-9217-4a6f-9d10-5a7dcef86c11
bankAccountId: 3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
cardId: 5dec2c49-0aa5-4683-a317-427eb5d115f3
matchId: b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e
date: '2025-10-15'
amount: 42.5
currency: USD
description: UBER TRIP
merchantName: Uber
category:
- Travel
transactionType: debit
source: PLAID
statementId: null
status: matched
settlement: null
createdAt: '2025-10-15T14:30:00.000Z'
- _links:
self:
href: /bank-transactions/1fcb895e-9217-4a6f-9d10-5a7dcef86c11/2e5f8a1b-4c7d-3e9f-b0a2-8d6c4f1e7b3a
bankAccount:
href: /bank-accounts/3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
card:
href: /cards/5dec2c49-0aa5-4683-a317-427eb5d115f3
id: 2e5f8a1b-4c7d-3e9f-b0a2-8d6c4f1e7b3a
accountId: 8f3a1b2c-4d5e-6f7a-8b9c-0d1e2f3a4b5c
subaccountId: 1fcb895e-9217-4a6f-9d10-5a7dcef86c11
bankAccountId: 3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
cardId: 5dec2c49-0aa5-4683-a317-427eb5d115f3
matchId: null
date: '2025-10-14'
amount: 156.23
currency: USD
description: AMAZON MARKETPLACE
merchantName: Amazon
category:
- Shopping
transactionType: debit
source: PLAID
statementId: null
status: posted
settlement: null
createdAt: '2025-10-14T09:15:00.000Z'
pagination:
cursor: ZXhhbXBsZQ==
hasMore: true
links:
GetFirstBankTransaction:
operationId: GetBankTransaction
parameters:
transactionId: $response.body#/items/0/id
description: Retrieve the first bank transaction from the list.
'400':
$ref: '#/components/responses/bad-request'
'401':
$ref: '#/components/responses/unauthorized'
'403':
$ref: '#/components/responses/forbidden'
'500':
$ref: '#/components/responses/server-error'
/bank-transactions/{subaccountId}/webhooks:
parameters:
- $ref: '#/components/parameters/subaccount-id-2'
post:
tags:
- bank-transactions
summary: Trigger bank transaction webhooks
description: 'Manually triggers webhook delivery for specified bank transactions. This can be used to re-emit webhooks that may have been missed or to force re-matching of transactions.
You can specify which webhook event types to emit: `banktransaction.created` for transaction data or `transaction.match.created` for match results.
'
operationId: TriggerBankTransactionWebhooks
security:
- main-auth:
- banking:admin
requestBody:
description: Webhook trigger request
required: true
content:
application/json:
schema:
type: object
required:
- ids
properties:
ids:
description: List of bank transaction identifiers to emit webhooks for. Must contain at least one ID.
type: array
minItems: 1
items:
type: string
format: uuid
webhooks:
description: The types of webhook events to emit.
type: array
items:
type: string
enum:
- banktransaction.created
- transaction.match.created
forceRematch:
description: 'Set to `true` to re-run the matching algorithm for the named transactions before emitting webhooks. Transactions that already have a match are genuinely re-scored: the existing match id is preserved when the pairing survives, updated when a better pairing exists, and removed when the movement no longer matches.'
type: boolean
default: false
dispatchUnmatched:
description: 'After the re-match, emit the standalone bank-only feed entry for each named transaction the matcher left unmatched (idempotent per transaction — already-emitted standalones are skipped). Requires `forceRematch: true` and `webhooks` to include `transaction.match.created`; the request is rejected with `400` otherwise, because only a same-run re-match can distinguish a genuinely unmatched movement from a duplicate of an already-settled purchase.'
type: boolean
default: false
examples:
TriggerWebhooksExample:
value:
ids:
- 7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
webhooks:
- banktransaction.created
- transaction.match.created
forceRematch: false
RematchAndDispatchExample:
value:
ids:
- 7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
webhooks:
- transaction.match.created
forceRematch: true
dispatchUnmatched: true
responses:
'200':
description: Webhooks triggered
content:
application/json:
schema:
type: object
required:
- message
- emitted
- resent
- matched
- skipped
- failed
properties:
message:
type: string
description: Human-readable summary of the operation.
emitted:
type: integer
description: Number of webhook events emitted.
resent:
type: integer
description: Number of webhooks resent.
matched:
type: integer
description: Number of transactions that were matched.
skipped:
type: integer
description: Number of transactions that were skipped.
failed:
type: array
description: Transactions that failed to process.
items:
type: object
properties:
id:
type: string
description: The transaction identifier that failed.
error:
type: string
description: The error message describing why processing failed.
dispatched:
type: integer
description: Number of standalone bank-only emissions dispatched for still-unmatched transactions. Only present when `dispatchUnmatched` was requested (and on service versions that support the flag).
dispatchError:
type: string
description: Present when the standalone dispatch step failed after a successful re-match; the matching results above still stand.
examples:
Example Trigger Webhooks Response:
value:
message: Processed 1 transactions
emitted: 2
resent: 0
matched: 1
skipped: 0
failed: []
'400':
$ref: '#/components/responses/bad-request'
'401':
$ref: '#/components/responses/unauthorized'
'403':
$ref: '#/components/responses/forbidden'
'500':
$ref: '#/components/responses/server-error'
components:
examples:
bank-transaction:
description: Example of a Bank Transaction resource
value:
_links:
self:
href: /bank-transactions/1fcb895e-9217-4a6f-9d10-5a7dcef86c11/7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
bankAccount:
href: /bank-accounts/3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
card:
href: /cards/5dec2c49-0aa5-4683-a317-427eb5d115f3
match:
href: /transaction-matches/1fcb895e-9217-4a6f-9d10-5a7dcef86c11/b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e
id: 7f2a9c4e-3b1d-4e8f-a5c7-6d0e2f9b8a3c
accountId: 8f3a1b2c-4d5e-6f7a-8b9c-0d1e2f3a4b5c
subaccountId: 1fcb895e-9217-4a6f-9d10-5a7dcef86c11
bankAccountId: 3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
cardId: 5dec2c49-0aa5-4683-a317-427eb5d115f3
matchId: b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e
date: '2025-10-15'
amount: 42.5
currency: USD
description: UBER TRIP
merchantName: Uber
category:
- Travel
transactionType: debit
source: PLAID
statementId: null
status: early_cleared
settlement:
state: early_cleared
emissionType: early_clearing
emittedAt: '2025-10-15T15:00:00.000Z'
supersededAt: null
createdAt: '2025-10-15T14:30:00.000Z'
parameters:
transaction-type:
in: query
name: transactionType
description: Filter bank transactions by transaction type
required: false
schema:
type: string
enum:
- debit
- credit
example: debit
min-amount:
in: query
name: minAmount
description: Filter transactions with an amount greater than or equal to this value
required: false
schema:
type: number
example: 10
matched:
in: query
name: matched
description: Filter bank transactions by match status. Set to `true` to return only matched transactions, or `false` for unmatched.
required: false
schema:
type: string
enum:
- 'true'
- 'false'
example: 'true'
end-date:
in: query
name: endDate
description: Filter results up to this date (inclusive), in YYYY-MM-DD format
required: false
schema:
type: string
format: date
example: '2025-10-31'
bank-account-id-2:
in: query
name: bankAccountId
description: Filter by bank account identifier
required: false
schema:
type: string
format: uuid
example: 3a8f2c1d-5e7b-4d9a-b6c8-9f0e1d2a3b4c
banking-limit:
in: query
name: limit
description: Maximum number of items to return
required: false
schema:
type: integer
minimum: 1
maximum: 1000
default: 250
example: 250
transaction-id:
in: path
name: transactionId
required: true
schema:
type: string
format: uuid
example: 9340721f-bdce-4afa-bd9d-26cceb9d2176
cursor:
in: query
name: cursor
required: false
description: The cursor to use for pagination. Identifies your place on the list
schema:
type: string
format: byte
example: ZXhhbXBsZQ==
subaccount-id-2:
in: path
name: subaccountId
required: true
schema:
type: string
format: uuid
example: 24c4f90d-ab3b-4f6e-8a1d-d251a4fcf34c
start-date:
in: query
name: startDate
description: Filter results from this date (inclusive), in YYYY-MM-DD format
required: false
schema:
type: string
format: date
example: '2025-10-01'
card-id-2:
in: path
name: cardId
required: true
schema:
type: string
format: uuid
example: 6d18f5bb-b9d6-4237-97c2-44b1bdb71d6b
max-amount:
in: query
name: maxAmount
description: Filter transactions with an amount less than or equal to this value
required: false
schema:
type: number
example: 500
responses:
server-error:
description: The server encountered an unexpected condition that prevented it from fulfilling the request
content:
application/problem+json:
schema:
type: object
properties:
detail:
type: string
title:
type: string
enum:
- Internal Server Error
required:
- detail
- title
example:
title: Internal Server Error
detail: The server encountered an unexpected condition that prevented it from fulfilling the request.
bad-request:
description: The server cannot or will not process the request due to something that is perceived to be a client error
content:
application/problem+json:
schema:
type: object
properties:
detail:
type: string
title:
type: string
enum:
- Bad Request
errors:
type: array
items:
type: object
properties:
title:
type: string
detail:
type: string
required:
- title
- detail
required:
- detail
- title
examples:
Example Generic Bad Request Payload Response:
value:
title: Bad Request
detail: Request object failed validation.
Example Generic Bad Request Parameters Response:
value:
title: Bad Request
detail: Request parameters are invalid.
not-found:
description: The requested resource was not found on the server
content:
application/problem+json:
schema:
type: object
properties:
type:
type: string
instance:
type: string
detail:
type: string
title:
type: string
enum:
- Not Found
required:
- detail
- title
example:
title: Not Found
detail: The requested resource was not found on the server.
unauthorized:
description: Authentication credentials were either missing or incorrect
content:
application/problem+json:
schema:
type: object
properties:
detail:
type: string
title:
type: string
enum:
- Unauthorized
required:
- detail
- title
example:
title: Unauthorized
detail: Authentication credentials were either missing or incorrect.
forbidden:
description: Authentication credentials used do not have have permissions to perform the request
content:
application/problem+json:
schema:
type: object
properties:
detail:
type: string
title:
type: string
enum:
- Forbidden
required:
- detail
- title
example:
title: Forbidden
detail: You do not have permission to access the requested resource.
schemas:
link:
type: object
properties:
href:
type: string
templated:
type: boolean
type:
type: string
deprecation:
type: string
name:
type: string
profile:
type: string
title:
type: string
hreflang:
type: string
required:
- href
bank-transaction:
type: object
required:
- _links
- id
- accountId
- subaccountId
- bankAccountId
- cardId
- matchId
- date
- amount
- currency
- description
- merchantName
- category
- transactionType
- source
- status
- settlement
- createdAt
properties:
_links:
type: object
description: HAL-style links to related resources.
required:
- self
- bankAccount
properties:
self:
$ref: '#/components/schemas/link'
bankAccount:
$ref: '#/components/schemas/link'
card:
$ref: '#/components/schemas/link'
match:
$ref: '#/components/schemas/link'
id:
type: string
format: uuid
description: The unique identifier of the bank transaction.
accountId:
type: string
format: uuid
description: The unique identifier of the account that owns this transaction.
subaccountId:
type: string
format: uuid
description: The unique identifier of the subaccount associated with this transaction.
bankAccountId:
type: string
format: uuid
description: The unique identifier of the bank account this transaction belongs to.
cardId:
type: string
format: uuid
nullable: true
description: The identifier of the card linked to the bank account, used for transaction matching.
matchId:
type: string
format: uuid
nullable: true
description: The identifier of the transaction match, if this bank transaction has been matched to a card transaction.
date:
type: string
format: date
description: The date the transaction was posted, in YYYY-MM-DD format.
amount:
type: number
description: The transaction amount.
currency:
type: string
description: The currency of the transaction following ISO 4217 format.
minLength: 3
maxLength: 3
description:
type: string
nullable: true
description: The transaction description provided by the financial institution.
merchantName:
type: string
nullable: true
description: The name of the merchant.
category:
type: array
nullable: true
description: The transaction categories assigned by the provider.
items:
type: string
transactionType:
type: string
description: 'The type of transaction.
- `debit`: Money sent (outflow).
- `credit`: Money received (inflow).
'
enum:
- debit
- credit
source:
type: string
description: 'The source of this transaction.
- `PLAID`: Synced from a connected financial institution via Plaid.
- `UPLOAD`: Imported from a manually uploaded bank statement.
'
enum:
- PLAID
- UPLOAD
statementId:
type: string
format: uuid
nullable: true
description: The identifier of the bank statement this transaction was imported from, if applicable.
status:
type: string
description: 'The lifecycle stage of the bank movement, derived from its match pointer and settlement state.
- `posted`: Synced, not yet matched.
- `matched`: Paired to a card transaction without an early settlement of its own (e.g. connector off, or a below-HIGH match) — the movement is represented by the card transaction''s network settlement, and any standalone it previously emitted is netted to zero.
- `settled`: A bank-only movement settled standalone on the unified feed.
- `early_cleared`: A matched movement settled its card transaction early.
- `superseded`: A previously bank-only movement was retracted or corrected.
'
enum:
- posted
- matched
- settled
- early_cleared
- superseded
settlement:
type: object
nullable: true
description: Settlement outcome on the unified transaction feed. Present when the movement has settled live; null otherwise (unmatched, connector off, or shadow-only).
required:
- state
- emissionType
- emittedAt
- supersededAt
properties:
state:
type: string
enum:
- settled
- early_cleared
- superseded
emissionType:
type: string
enum:
- early_clearing
- bank_only
emittedAt:
type: string
format: date-time
nullable: true
description: When the settlement was emitted to the feed.
supersededAt:
type: string
format: date-time
nullable: true
description: When the settlement was superseded or corrected, if applicable.
createdAt:
description: Date and time when this resource was created, in UTC, following ISO 8601 format.
type: string
format: date-time
securitySchemes:
main-auth:
type: oauth2
flows:
implicit:
authorizationUrl: https://api.astrada.co/auth/realms/{accountId}/protocol/openid-connect/token
refreshUrl: https://api.astrada.co/auth/realms/{accountId}/protocol/openid-connect/token
scopes:
accounts:write: Accounts write resource
accounts:read: Accounts read resource
subaccounts:write: Subaccounts write resource
subaccounts:read: Subaccounts read resource
card-connector-data-links:write: card-connector-data-link resource
card-connector-consents:read: Card Consent read resource
card-connector-consents:write: Card Consent write resource
webhooks:read: Read Webhook resources
webhooks:write: Write Webhook resources
card-subscriptions:write: Create card subscription
card-subscriptions:read: Read card subscription
card-verifications:write: Create card verification
card-verifications:read: Read Card verification
cards:read: Read Card resources
cardholder:read: Read Cardholder resources
cardholder:write: Write Cardholder resources
transactions:read: Read Transaction resources
transaction-messages:read: Read Transaction Message resources
network-bulk-feeds:read: Read network bulk feed
network-bulk-feeds:write: Write network bulk feed
network-links:write: Write network link
enrollment-methods:write: Write enrollment methods
simulation:write: Write sandbox simulations
banking:read: Read banking resources
banking:write: Write banking resources
banking:admin: Admin banking operations
appstore:enrollment:write: Enroll cards via the appstore B2C flow
appstore:cards:read: View enrolled cards in the appstore
appstore:transactions:read: View synced transactions in the appstore
appstore:transactions:sync: Trigger transaction sync in the appstore
appstore:sessions:read: Read appstore session state
appstore:sessions:write: Write or delete appstore session state
appstore:tokens:read: Read appstore stored tokens and connections
appstore:tokens:write: Write appstore stored tokens and connections
externalDocs:
description: Find out more about Astrada API.
url: https://docs.astrada.co/reference