Customer Portal API
Self-service portal for customers to view quotes, orders, invoices, deliveries, and payment history.
Authentication
The customer portal uses token-based authentication (no login required). Tokens are generated by admin users and shared with clients via email or link.
Generate a Token (Admin)
POST /api/v1/customer-portal/tokens
Authorization: Bearer ADMIN_JWT_TOKEN
{
"client_id": "uuid",
"permissions": {
"view_quotes": true,
"accept_quotes": true,
"view_orders": true,
"view_invoices": true,
"view_payments": true,
"view_deliveries": true,
"submit_feedback": true
},
"expires_at": "2026-12-31T23:59:59Z"
}Use the Token
All portal endpoints use the token in the URL path — no Authorization header needed:
GET /api/v1/customer-portal/view/{token}/dashboardEndpoints
Dashboard
GET /customer-portal/view/{token}/dashboardReturns a summary: recent quotes, orders, invoices, deliveries, outstanding balance.
Quotes
GET /customer-portal/view/{token}/quotes
GET /customer-portal/view/{token}/quotes?state=sent
POST /customer-portal/view/{token}/quotes/{id}/accept
POST /customer-portal/view/{token}/quotes/{id}/declineClients can accept or decline sent quotes. Declined quotes accept an optional reason field.
Orders
GET /customer-portal/view/{token}/orders
GET /customer-portal/view/{token}/orders/{id}Order detail includes line items, delivery status, and delivery tracking info.
Invoices
GET /customer-portal/view/{token}/invoices
GET /customer-portal/view/{token}/invoices?payment_state=not_paidPayments
GET /customer-portal/view/{token}/paymentsIncludes allocation details showing which invoices each payment covers.
Deliveries
GET /customer-portal/view/{token}/deliveriesIncludes carrier name, tracking number, shipment dates, and line items.
Permissions
Each token has configurable permissions:
| Permission | Default | Controls |
|---|---|---|
view_quotes | true | See quote list and details |
accept_quotes | true | Accept or decline quotes |
view_orders | true | See order list and details |
view_invoices | true | See invoice list with balances |
view_payments | true | See payment history |
view_deliveries | true | See delivery tracking |
submit_feedback | true | Submit feedback tickets |
Rate Limiting
Portal endpoints are rate-limited to 30 reads/minute and 10 writes/minute per token.