Skip to main content

Expenses

Expense tracking, budgets, invoices, and ROI.

Base path:

/api/v1/{workspace_id}/expenses/

Expense items​

GET /api/v1/{workspace_id}/expenses/items/
POST /api/v1/{workspace_id}/expenses/items/
GET /api/v1/{workspace_id}/expenses/items/{expense_id}/
PUT /api/v1/{workspace_id}/expenses/items/{expense_id}/
PATCH /api/v1/{workspace_id}/expenses/items/{expense_id}/
GET /api/v1/{workspace_id}/expenses/items/field-choices/
POST /api/v1/{workspace_id}/expenses/items/{expense_id}/approve/
POST /api/v1/{workspace_id}/expenses/items/{expense_id}/reject/
GET /api/v1/{workspace_id}/expenses/items/{expense_id}/activity-log/
Authorization: Bearer <token>
Content-Type: application/json

Create expense — request body​

{
"name": "Booth rental",
"amount": 8500,
"currency": "USD",
"event": "550e8400-e29b-41d4-a716-446655440000",
"category": "660e8400-e29b-41d4-a716-446655440001",
"description": "Main hall booth — 3 days",
"spent_from": "2026-09-15",
"spent_to": "2026-09-17"
}

Create expense — response (201 Created)​

{
"id": "880e8400-e29b-41d4-a716-446655440003",
"name": "Booth rental",
"amount": "8500.00",
"currency": "USD",
"amount_base": "8500.00",
"effective_amount_base": 8500,
"status": "pending",
"event": "550e8400-e29b-41d4-a716-446655440000",
"event_title": "SaaStr Annual 2026",
"category_name": "Venue",
"created_at": "2026-06-20T11:00:00Z"
}

Approve expense — response (200 OK)​

{
"id": "880e8400-e29b-41d4-a716-446655440003",
"status": "approved",
"approved_at": "2026-06-21T09:00:00Z",
"approved_by_name": "Finance Admin"
}

Bulk expense actions​

POST /api/v1/{workspace_id}/expenses/bulk-delete/
POST /api/v1/{workspace_id}/expenses/bulk-approve/
POST /api/v1/{workspace_id}/expenses/bulk-reject/
GET /api/v1/{workspace_id}/expenses/export/
GET /api/v1/{workspace_id}/expenses/report/pdf/

Line items​

DELETE /api/v1/{workspace_id}/expenses/items/{expense_id}/line-items/{line_item_id}/

Categories​

GET /api/v1/{workspace_id}/expenses/categories/
POST /api/v1/{workspace_id}/expenses/categories/
GET /api/v1/{workspace_id}/expenses/categories/{category_id}/
PUT /api/v1/{workspace_id}/expenses/categories/{category_id}/
PATCH /api/v1/{workspace_id}/expenses/categories/{category_id}/
DELETE /api/v1/{workspace_id}/expenses/categories/{category_id}/

Invoices & OCR​

GET /api/v1/{workspace_id}/expenses/invoices/
POST /api/v1/{workspace_id}/expenses/invoices/
GET /api/v1/{workspace_id}/expenses/invoices/{invoice_id}/
GET /api/v1/{workspace_id}/expenses/invoices/{invoice_id}/ocr-result/

Budgets​

GET /api/v1/{workspace_id}/expenses/budgets/
POST /api/v1/{workspace_id}/expenses/budgets/
GET /api/v1/{workspace_id}/expenses/budgets/{budget_id}/
GET /api/v1/{workspace_id}/expenses/budgets/workspace-summary/
GET /api/v1/{workspace_id}/expenses/budgets/linked-event-ids/
GET /api/v1/{workspace_id}/expenses/budgets/{budget_id}/summary/
POST /api/v1/{workspace_id}/expenses/budgets/bulk-delete/

Create budget — request body​

{
"title": "SaaStr 2026 budget",
"event": "550e8400-e29b-41d4-a716-446655440000",
"total_budget": 25000,
"currency": "USD"
}

Budget summary — response​

{
"total_budget": "25000.00",
"total_budget_base": "25000.00",
"effective_budget_base": 25000,
"total_spent": "8500.00",
"effective_total_spent": 8500,
"total_committed": "2000.00",
"effective_total_committed": 2000,
"remaining_budget": 14500,
"utilization": 34.0,
"rollup_currency": "USD"
}

Exchange rate​

GET /api/v1/{workspace_id}/expenses/exchange-rate/

Query params: from, to, date.

ROI​

GET /api/v1/{workspace_id}/expenses/roi/event/{event_id}/
GET /api/v1/{workspace_id}/expenses/roi/workspace/
GET /api/v1/{workspace_id}/expenses/roi/no-event/
GET /api/v1/{workspace_id}/expenses/roi/categories/

Webhooks​

  • expense.created / expense.submitted / expense.status_changed

See Webhooks.