everything you need to talk to your ledger
a clean REST API. bearer token auth, JSON in and out, consistent error envelopes. read on Free, write on Plus and above.
Authentication
every request needs an API key. pass it as a Bearer token or via the X-Api-Key header. create keys from Settings → API Keys once you have an account.
free-tier keys are read-only. write attempts return 403.
Rate Limits
daily request limits reset at midnight UTC. every response includes these headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997
X-RateLimit-Reset: 1750896000Transactions API
List transactions
curl "https://api.ledger-post.com/v1/transactions?wallet=checking&from=2026-06-01&to=2026-06-30&page=1&pageSize=25" \
-H "Authorization: Bearer lp_live_YOUR_KEY"filter by wallet (slug) or walletId (UUID), category or categoryId, from, to (dates). paginate with page and pageSize (max 100, default 50).
{
"data": [ { ... }, { ... } ],
"pagination": {
"total": 42,
"page": 1,
"pageSize": 25
}
}Get a transaction
Create a transaction
curl -X POST https://api.ledger-post.com/v1/transactions \
-H "Authorization: Bearer lp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"wallet": "checking",
"amount": "12.50",
"type": "Expense",
"note": "coffee",
"category": "food",
"occurredAt": "2026-06-23T10:00:00Z"
}'amount (decimal string, required), type (Income, Expense, or Transfer), and a wallet are required — pass wallet (slug) or walletId (UUID). category / categoryId, note, and occurredAt are optional.
Pass "category": "auto" — or leave category off entirely — and your auto-categorization rules pick one from the note. No rule matches, and the entry just lands uncategorized. auto is a reserved keyword here, not a category slug, and it's a Plus feature; on Free the entry stays uncategorized. It only applies when you first write the line — rules fill blanks, they don't second-guess a category you already set.
{
"data": {
"id": "a1b2c3d4-...",
"walletId": "...",
"walletName": "Checking",
"walletSlug": "checking",
"categoryId": "...",
"categoryName": "Food",
"categorySlug": "food",
"amount": "12.50",
"type": "expense",
"note": "coffee",
"occurredAt": "2026-06-23T10:00:00.0000000Z",
"source": "api",
"createdAt": "2026-06-23T10:00:01.0000000Z"
}
}Update a transaction
curl -X PATCH https://api.ledger-post.com/v1/transactions/TXN_UUID \
-H "Authorization: Bearer lp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "note": "updated note", "amount": "15.00" }'all fields optional. send only what you want to change.
Delete a transaction
curl -X DELETE https://api.ledger-post.com/v1/transactions/TXN_UUID \
-H "Authorization: Bearer lp_live_YOUR_KEY"Error Handling
all errors return a consistent envelope with a machine-readable code and a human-readable message.
{
"error": {
"code": "validation_error",
"message": "wallet not found."
}
}Apple Shortcuts
use Get Contents of URL to POST to the API. add the X-Ledgerpost-Source: shortcut header and entries show up with a Shortcuts badge in your dashboard.
curl -X POST https://api.ledger-post.com/v1/transactions \
-H "Authorization: Bearer lp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "X-Ledgerpost-Source: shortcut" \
-d '{
"wallet": "checking",
"amount": "12.50",
"type": "Expense",
"note": "coffee"
}'want to build on ledgerpost?
join the waitlist and you'll be the first to get an API key.