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.