MoneyStyle API Documentation

REST API for programmatic access to your MoneyStyle data.

Authentication

All requests require a Bearer token. Generate your API key in Settings → Integrations → API.

curl -H "Authorization: Bearer ms_your_api_key" \
  https://moneystyle.app/api/v1/transactions

Transactions

GET/api/v1/transactions

List transactions with filtering, sorting, and pagination.

Query Parameters:

pagenumberPage number (default: 1)
pageSizenumberItems per page (default: 20, max: 100)
sortBystringSort field: date, amount, type, merchant
sortOrderstringasc or desc (default: desc)
dateFromstringISO date filter (gte)
dateTostringISO date filter (lte)
typestringincome, expense, transfer, other
categoryIdstringFilter by category ID
accountIdstringFilter by account ID
merchantstringCase-insensitive substring match
confirmedbooleanFilter by confirmation status

Response:

{
  "data": [
    {
      "id": "clx...",
      "date": "2026-03-19T00:00:00.000Z",
      "amount": 45.99,
      "currency": "USD",
      "type": "expense",
      "merchant": "Amazon",
      "description": null,
      "source": "manual",
      "confirmed": true,
      "category": { "id": "...", "name": "Shopping", "color": "#f59e0b" },
      "account": { "id": "...", "name": "Cash", "type": "cash" },
      "tags": [{ "id": "...", "name": "Online", "color": "#6366f1" }],
      "createdAt": "2026-03-19T10:30:00.000Z"
    }
  ],
  "total": 142,
  "page": 1,
  "pageSize": 20,
  "totalPages": 8
}
POST/api/v1/transactions

Create a new transaction.

Request Body:

{
  "date": "2026-03-19",        // required
  "type": "expense",           // required: income, expense, transfer, other
  "accountId": "clx...",       // required
  "amount": 45.99,             // optional
  "currency": "USD",           // optional (default: your primary currency)
  "merchant": "Amazon",        // optional
  "description": "Books",      // optional
  "categoryId": "clx...",      // optional
  "tagIds": ["clx..."],        // optional
  "spreadMonths": null          // optional: 2-24
}

Response:

{
  "id": "clx...",
  "date": "2026-03-19T00:00:00.000Z",
  "amount": 45.99,
  "currency": "USD",
  "type": "expense",
  "merchant": "Amazon",
  "category": { "id": "...", "name": "Shopping", "color": "#f59e0b" },
  "account": { "id": "...", "name": "Cash", "type": "cash" },
  "createdAt": "2026-03-19T10:30:00.000Z"
}
GET/api/v1/transactions/:id

Get a single transaction with line items.

PATCH/api/v1/transactions/:id

Update a transaction. All fields optional.

Request Body:

{
  "amount": 50.00,
  "merchant": "Amazon Prime"
}
DELETE/api/v1/transactions/:id

Delete a transaction.

Categories

GET/api/v1/categories

List all categories with transaction counts.

Response:

{
  "data": [
    { "id": "clx...", "name": "Groceries", "color": "#10b981", "icon": null, "transactionCount": 45 }
  ]
}
POST/api/v1/categories

Create a category.

Request Body:

{ "name": "Groceries", "color": "#10b981" }
GET/api/v1/categories/:id

Get a single category.

PATCH/api/v1/categories/:id

Update a category.

Request Body:

{ "name": "Food", "color": "#22c55e" }
DELETE/api/v1/categories/:id

Delete a category.

Accounts

GET/api/v1/accounts

List all accounts with transaction counts.

Response:

{
  "data": [
    { "id": "clx...", "name": "Cash", "type": "cash", "bank": null, "color": "#3b82f6", "icon": null, "transactionCount": 120 }
  ]
}
POST/api/v1/accounts

Create an account.

Request Body:

{ "name": "Savings", "type": "bank", "bank": "Chase", "color": "#3b82f6" }
GET/api/v1/accounts/:id

Get a single account.

PATCH/api/v1/accounts/:id

Update an account.

Request Body:

{ "name": "Main Checking" }
DELETE/api/v1/accounts/:id

Delete an account (must have 0 transactions).

Error Handling

All errors return JSON with an error field:

// 401 Unauthorized
{ "error": "Invalid API key" }

// 404 Not Found
{ "error": "Transaction not found" }

// 422 Validation Error
{ "error": "date is required, type is required" }

// 409 Conflict
{ "error": "Category already exists" }

Rate Limits

Currently no rate limits are enforced. Please be reasonable with your usage.