Public API v1
The public REST API is intended for server-to-server integrations with, for example, CRM or billing software.
Base URL: https://auto.manisma.com/api/v1
Do not use the Directus API directly and never place an API key in frontend JavaScript.
Creating an API key
As an Admin, open Admin → API keys. Give the key a recognizable name and choose scopes:
read: marks a key intended for reading;write: create or modify writable resources and use scheduling endpoints.plan: request a scheduling proposal.
For a normal read/write integration, select both scopes. Note: the current v1 backend checks write explicitly for POST/PATCH, but allows GET for any valid active key; read is therefore currently an administrative label and not yet a separate technical block. The raw key starts with msk_, is shown once, and cannot be recovered. If lost, create a new key and deactivate or delete the old one.
Authentication
Use one of these headers:
Authorization: Bearer msk_...
X-API-Key: msk_...
All results are server-side scoped to the key’s organization. An id from another tenant returns the same 404 as an unknown id.
Resources and methods
| Resource | GET list/detail | POST | PATCH |
|---|---|---|---|
/clients |
Yes | Yes | Yes |
/jobs |
Yes | Yes | Yes |
/assets |
Yes | Yes | Yes |
/task_types |
Yes | Yes | Yes |
/materials |
Yes | Yes | Yes |
/asset_models |
Yes | No | No |
/technicians |
Yes | No | No |
There is no DELETE endpoint in v1.
Lists and pagination
GET /clients?limit=50&page=1
limit: 1 to 100, default 50;page: starts at 1.search: for client and material lists, case-insensitive partial matching of literal text. A percent sign searches for a percent sign. Clients match name, email, or customer number; materials match SKU or name.
{
"data": [],
"meta": { "total": 0, "page": 1, "limit": 50 }
}
A detail or write response uses { "data": { ... } }.
Clients
Read fields: id, tenant_id, customer_number, name, client_type, email, phone, vat_number, status, created_at, updated_at.
POST /clients requires name. Allowed write fields are name, customer_number, client_type, email, phone, vat_number, and status. For PATCH they are all optional, but at least one valid field must be present. Unknown fields and a supplied tenant_id are ignored.
POST /addresses creates an address for a client and requires client_id. The client must belong to the same tenant.
curl -X POST 'https://auto.manisma.com/api/v1/clients' \
-H 'Authorization: Bearer msk_...' \
-H 'Content-Type: application/json' \
-d '{"name":"Bakkerij Peeters","client_type":"b2b","email":"info@example.com"}'
Jobs
Read fields include id, tenant, job number, client id, title, description, priority, status, expected duration, lead technician id, required number of technicians, scheduling, service address id, task type id, required skills, and timestamps. Internal and technician notes are not exposed.
POST /jobs requires title. Allowed fields:
job_number, client_id, title, description, priority, status, estimated_duration_minutes, required_technicians, scheduled_date, scheduled_start, scheduled_end, service_address_id, task_type_id, required_skills.
When status is missing, unplanned is used. When job_number is missing, Manisma generates a number with the configured tenant prefix. For PATCH, job_number, status, and assigned_technician_id cannot be changed.
Foreign keys for client, service address, and task type must belong to the same tenant.
POST /jobs/:id/assign schedules a job with technician_id, scheduled_start, and scheduled_end. POST /jobs/:id/unassign removes its assignment and returns it to the unplanned queue; it does not delete the job.
Planning proposal
POST /plan returns a scheduling proposal and changes nothing: it does not create or move any job. It requires the separate plan scope and is limited to 3 calls per organization per 10 minutes; further calls return a clear 429 error. It does not use Manisma’s AI or consume the AI actions included in your Manisma plan, because your calling assistant supplies the reasoning.
Other resources
-
assets: installed devices at a client; writable with POST and PATCH. -
task_types: writable with POST and PATCH. -
materials: writable with POST and PATCH; purchase price and stock are readable and writable. -
asset_models: read-only. -
technicians: name, email, phone, active status, and skills. Work hours, addresses, and user id are not public.
Errors and limits
| Status | Meaning |
|---|---|
| 400 | Invalid body, required field missing, or PATCH contains no valid field. |
| 401 | Key missing, invalid, or deactivated. |
| 403 | Valid key without the required write or plan scope. |
| 404 | Record unknown or from another tenant. |
| 429 | Limit exceeded. |
| 502 | Temporary issue with the underlying data service. |
| 503 | Planning rate limiting is temporarily unavailable. |
The API is limited to 600 requests per minute per source IP. Build retries with exponential backoff for 429, 502, and temporary network errors. Do not retry validation errors without correcting the request.