Publieke API v1
De publieke REST API is bedoeld voor server-naar-serverkoppelingen met bijvoorbeeld CRM- of facturatiesoftware.
Basis-URL: https://auto.manisma.com/api/v1
Gebruik niet rechtstreeks de Directus API en plaats een API-sleutel nooit in frontend-JavaScript.
API-sleutel maken
Open als Admin Beheer → API-sleutels. Geef de sleutel een herkenbare naam en kies scopes:
read: markeert een sleutel die voor lezen bedoeld is;write: schrijfbare resources aanmaken of wijzigen en planningsendpoints gebruiken.plan: een planningsvoorstel aanvragen.
Selecteer voor een normale lees/schrijfkoppeling beide scopes. Let op: de huidige v1-backend controleert write expliciet voor POST/PATCH, maar laat GET toe voor iedere geldige actieve sleutel; read is momenteel dus een administratieve aanduiding en nog geen afzonderlijke technische blokkade. De ruwe sleutel begint met msk_, wordt één keer getoond en kan niet worden hersteld. Maak bij verlies een nieuwe sleutel en deactiveer of verwijder de oude.
Authenticatie
Gebruik één van deze headers:
Authorization: Bearer msk_...
X-API-Key: msk_...
Alle resultaten worden server-side beperkt tot de organisatie van de sleutel. Een id van een andere tenant geeft dezelfde 404 als een onbekend id.
Resources en methoden
| Resource | GET lijst/detail | POST | PATCH |
|---|---|---|---|
/clients |
Ja | Ja | Ja |
/jobs |
Ja | Ja | Ja |
/assets |
Ja | Ja | Ja |
/task_types |
Ja | Ja | Ja |
/materials |
Ja | Ja | Ja |
/asset_models |
Ja | Nee | Nee |
/technicians |
Ja | Nee | Nee |
Er is in v1 geen DELETE-endpoint.
Lijsten en paginering
GET /clients?limit=50&page=1
limit: 1 tot 100, standaard 50;page: begint bij 1.search: voor klanten- en materiaallijsten, hoofdletterongevoelig gedeeltelijk zoeken naar letterlijke tekst. Een procentteken zoekt naar een procentteken. Klanten komen overeen op naam, e-mail of klantnummer; materiaal op SKU of naam.
{
"data": [],
"meta": { "total": 0, "page": 1, "limit": 50 }
}
Een detail- of schrijfantwoord gebruikt { "data": { ... } }.
Klanten
Leesvelden: id, tenant_id, customer_number, name, client_type, email, phone, vat_number, status, created_at, updated_at.
POST /clients vereist name. Toegestane schrijfvelden zijn name, customer_number, client_type, email, phone, vat_number en status. Bij PATCH zijn ze allemaal optioneel, maar er moet minstens één geldig veld aanwezig zijn. Onbekende velden en een aangeleverd tenant_id worden genegeerd.
POST /addresses maakt een adres voor een klant aan en vereist client_id. De klant moet tot dezelfde tenant behoren.
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"}'
Opdrachten
Leesvelden omvatten id, tenant, opdrachtnummer, klant-id, titel, omschrijving, prioriteit, status, verwachte duur, hoofdtechnieker-id, vereist aantal techniekers, planning, serviceadres-id, taaktype-id, vereiste vaardigheden en timestamps. Interne en techniekernotities worden niet blootgesteld.
POST /jobs vereist title. Toegestane velden:
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.
Wanneer status ontbreekt, wordt unplanned gebruikt. Wanneer job_number ontbreekt, genereert Manisma een nummer met de ingestelde tenantprefix. Bij PATCH zijn job_number, status en assigned_technician_id niet wijzigbaar.
Foreign keys voor klant, serviceadres en taaktype moeten tot dezelfde tenant behoren.
POST /jobs/:id/assign plant een opdracht met technician_id, scheduled_start en scheduled_end. POST /jobs/:id/unassign verwijdert de toewijzing en zet de opdracht terug in de ongeplande wachtrij; de opdracht wordt niet verwijderd.
Planningsvoorstel
POST /plan geeft een planningsvoorstel terug en wijzigt niets: het maakt geen opdracht aan en verplaatst er geen. Het vereist de afzonderlijke scope plan en is beperkt tot 3 oproepen per organisatie per 10 minuten; verdere oproepen geven een duidelijke 429-fout. Het gebruikt geen AI van Manisma en verbruikt geen AI-acties uit je Manisma-abonnement, omdat je aanroepende assistent het denkwerk doet.
Andere resources
-
assets: bij een klant geïnstalleerde apparaten; schrijfbaar met POST en PATCH. -
task_types: schrijfbaar met POST en PATCH. -
materials: schrijfbaar met POST en PATCH; aankoopprijs en voorraad zijn leesbaar en schrijfbaar. -
asset_models: alleen-lezen. -
technicians: naam, e-mail, telefoon, actiefstatus en vaardigheden. Werkuren, adressen en gebruikers-id zijn niet publiek.
Fouten en limieten
| Status | Betekenis |
|---|---|
| 400 | Ongeldige body, verplicht veld ontbreekt of PATCH bevat geen geldig veld. |
| 401 | Sleutel ontbreekt, is ongeldig of is gedeactiveerd. |
| 403 | Geldige sleutel zonder de vereiste scope write of plan. |
| 404 | Record onbekend of van een andere tenant. |
| 429 | Limiet overschreden. |
| 502 | Tijdelijk probleem met de achterliggende gegevensservice. |
| 503 | De snelheidsbeperking voor planning is tijdelijk niet beschikbaar. |
De API is begrensd op 600 verzoeken per minuut per bron-IP. Bouw retries met exponentiële backoff voor 429, 502 en tijdelijke netwerkfouten. Retry geen validatiefouten zonder het verzoek te corrigeren.