MoneySheets API

The MoneySheets API lets you read the financial data MoneySheets syncs into your Google Sheet — transactions, categories, and categorization rules — and control how and when that data is synced.

It is a small, predictable REST API. All requests are made over HTTPS, authenticated with a personal API token, and all responses are JSON.

Every endpoint is scoped to a single MoneySheets account: the token you send determines whose data you read and write.

Prefer to explore interactively? Try it in Swagger — sign-in required.

Authentication

The API authenticates with a personal API token. Create one in the dashboard under API tokens — you will see the token value once, so copy it somewhere safe.

Send the token in the Authorization header as a bearer token on every request. Tokens always start with the prefix ms_.

Each token carries one or more scopes. The read scope grants access to the GET endpoints (transactions, categories, rules, schedule). The write scope is required to trigger a sync or change your schedule. Requesting an endpoint without the required scope returns 403.

Example
curl https://moneysheets.io/api/v2/transactions \
  -H "Authorization: Bearer ms_your_token_here"

Base URL

All endpoints live under the https://moneysheets.io/api/v2 base path. Paths in this reference are written relative to that base.

Requests must use HTTPS. Plain HTTP requests are redirected.

Base URL
https://moneysheets.io/api/v2

Errors

The API uses conventional HTTP status codes. Any non-2xx response has a JSON body with a single error field describing what went wrong.

Error response
{
  "error": "Authentication required"
}
StatusMeaning
400 Bad RequestA parameter is malformed — for example an invalid date or an invalid schedule payload.
401 UnauthorizedThe Authorization header is missing, or the token is invalid or revoked.
403 ForbiddenThe token lacks the scope the endpoint requires, or the action needs an active subscription.
429 Too Many RequestsThe sync rate limit has been reached. Wait before retrying.

Rate limits

The sync endpoint is rate limited to protect the underlying Google Sheets integration. When you exceed the limit the API returns 429; wait a short while before retrying.

The read endpoints are not rate limited under normal use, but please avoid tight polling loops — the data changes at most a few times a day.

List transactions

GET/api/v2/transactionsread scope

Returns the transactions synced to your sheet within a date range, keyed by a unique transaction id. When the same transaction id occurs more than once in the range, later occurrences are suffixed with #2, #3, and so on.

Query parameters

FieldTypeDescription
start_datestringInclusive start date, YYYY-MM-DD. Defaults to 30 days ago.
end_datestringInclusive end date, YYYY-MM-DD. Defaults to today.
Request
curl "https://moneysheets.io/api/v2/transactions?start_date=2026-01-01&end_date=2026-01-31" \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "transactions": {
    "a1b2c3": {
      "row_index": 42,
      "amount": "-24.90",
      "date": "2026-01-14",
      "date_added": "2026-01-15T03:12:00+00:00",
      "account_id": "acc_123",
      "bank_account_identifier": "Revolut EUR",
      "sheet_description": "NETFLIX.COM",
      "category": "Subscriptions"
    }
  },
  "count": 1,
  "start_date": "2026-01-01",
  "end_date": "2026-01-31"
}

Response fields

FieldTypeDescription
transactionsrequiredobjectMap of transaction id to a transaction object (fields below).
countrequiredintegerNumber of transactions returned.
start_daterequiredstringThe resolved start date of the range.
end_daterequiredstringThe resolved end date of the range.
transactions[].amountrequiredstringSigned transaction amount.
transactions[].daterequiredstringTransaction date as shown in the sheet.
transactions[].date_addedrequiredstringISO 8601 timestamp of when the row was added.
transactions[].bank_account_identifierrequiredstringIdentifier of the source bank account.
transactions[].account_idstring | nullProvider account id, when available.
transactions[].sheet_descriptionrequiredstringTransaction description.
transactions[].categoryrequiredstringAssigned category, or empty if uncategorized.
transactions[].row_indexrequiredintegerRow number in the underlying sheet.

Errors

StatusWhen
400Invalid date format — dates must be YYYY-MM-DD.
401Missing or invalid token.
403The token lacks the read scope.

List categories

GET/api/v2/categoriesread scope

Returns the list of categories defined in your sheet.

Request
curl https://moneysheets.io/api/v2/categories \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "categories": ["Groceries", "Rent", "Subscriptions", "Salary"]
}

Response fields

FieldTypeDescription
categoriesrequiredstring[]The category names, in sheet order.

Errors

StatusWhen
401Missing or invalid token.
403The token lacks the read scope.

List rules

GET/api/v2/rulesread scope

Returns your categorization rules. Each rule maps a description pattern to a category, optionally constrained to an amount range.

Request
curl https://moneysheets.io/api/v2/rules \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "rules": [
    {
      "description": "NETFLIX",
      "category": "Subscriptions",
      "minAmount": "",
      "maxAmount": ""
    }
  ]
}

Response fields

FieldTypeDescription
rules[].descriptionrequiredstringDescription pattern the rule matches on.
rules[].categoryrequiredstringCategory applied when the rule matches.
rules[].minAmountstringLower bound of the amount range, or empty.
rules[].maxAmountstringUpper bound of the amount range, or empty.

Errors

StatusWhen
401Missing or invalid token.
403The token lacks the read scope.

Sync transactions

POST/api/v2/sync-transactionswrite scope

Triggers a sync of the latest bank transactions into your sheet. The sync runs in the background; the response confirms it was scheduled.

Request
curl -X POST https://moneysheets.io/api/v2/sync-transactions \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "success": true,
  "message": "Sync scheduled"
}

Response fields

FieldTypeDescription
successrequiredbooleanWhether the sync was scheduled.
messagerequiredstringHuman-readable status message.

Errors

StatusWhen
401Missing or invalid token.
403The token lacks the write scope, or the trial/subscription is inactive.
429The sync rate limit has been reached.

Get schedule

GET/api/v2/scheduleread scope

Returns your current automatic sync schedule.

Request
curl https://moneysheets.io/api/v2/schedule \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "active": true,
  "start_time": "08:00",
  "period_minutes": 1440,
  "cron": "0 8 * * *",
  "last_run_time": "2026-01-15T08:00:00+00:00"
}

Response fields

FieldTypeDescription
activerequiredbooleanWhether an automatic sync schedule is set.
start_timestring | nullTime of the first run each cycle.
period_minutesinteger | nullInterval between runs, in minutes.
cronstring | nullThe underlying cron expression.
last_run_timestring | nullISO 8601 timestamp of the last run.

Errors

StatusWhen
401Missing or invalid token.
403The token lacks the read scope.

Set schedule

POST/api/v2/schedulewrite scope

Creates or updates the recurring sync schedule. start_time is the time of the first run; hours and minutes set the interval between runs.

Body parameters

FieldTypeDescription
start_timerequiredstringTime of the first run, e.g. "08:00".
hoursintegerHours between runs. Defaults to 0.
minutesintegerMinutes between runs. Defaults to 0.
Request
curl -X POST https://moneysheets.io/api/v2/schedule \
  -H "Authorization: Bearer ms_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{"start_time": "08:00", "hours": 24, "minutes": 0}'
Response
{
  "success": true
}

Response fields

FieldTypeDescription
successrequiredbooleanWhether the schedule was saved.

Errors

StatusWhen
400The schedule payload is invalid.
401Missing or invalid token.
403The token lacks the write scope.

Cancel schedule

DELETE/api/v2/schedulewrite scope

Removes the recurring sync schedule. Automatic syncs stop; you can still sync manually.

Request
curl -X DELETE https://moneysheets.io/api/v2/schedule \
  -H "Authorization: Bearer ms_your_token_here"
Response
{
  "success": true
}

Response fields

FieldTypeDescription
successrequiredbooleanWhether the schedule was cancelled.

Errors

StatusWhen
401Missing or invalid token.
403The token lacks the write scope.