A live, fully synthetic motor-insurance API for the analyst workshop series. Every insurer, vehicle, person and policy is fictional by construction — nothing here is real, so you can experiment freely from any device.
Working through this on your own? Press the button. It creates a throwaway client id and secret for you, and nothing else is needed to finish every step on this page.
Copy the secret now — it is shown once and is never retrievable again. Lost it? Press the button again; there is nothing worth recovering.
These credentials extend themselves while you use them, so a session in progress will not expire under you. Leave them alone for a day and they are removed, along with any policies you created.
Use the client id on your card — analyst-01 … analyst-20 — with the shared secret the facilitator reads out. That path still works exactly as before, and your policies are still yours alone.
curl -s https://api.cybernotes.it/mtpl/v1/coverage-options
200 OK
{ "options": [ { "code": "MTPL-STD", "name": "Mandatory motor liability", "term": "P1Y" } ] }
curl -s https://api.cybernotes.it/mtpl/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"client_id":"<your client_id>","client_secret":"<your client_secret>"}'
200 OK
{ "access_token": "eyJhbGciOiJIUzI1NiIs…", "token_type": "Bearer", "expires_in": 3600, … }
The token is a real JWT — paste it into jwt.io and inspect the sub, scope and exp claims.
curl -s -X POST https://api.cybernotes.it/mtpl/v1/policies \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{"regNumber":"ABC-103"}'
201 Created
{ "id": "pol-…", "status": "active", "startDate": "…", "endDate": "…", … }
| Errors | always RFC 9457 application/problem+json — read type, title, detail |
|---|---|
| Rate limits | 60 requests/min per address; watch the RateLimit-* headers. GET /limited/ping allows only 5/min — call it six times to see a live 429 + Retry-After |
| Pagination | GET /policies?page=2&pageSize=20 — you only see policies your client created; fleet.demo owns 70+ |
| Lifecycle | active → updated (PUT) → cancelled (POST …/cancel, idempotent); cancelled/expired are immutable |
| Clients |
Postman without an account accepts only pasted cURL — use the ready-made commands on the cURL cheat sheet: Import → paste one command → Send, one request at a time. Postman signed in (free account) or Bruno (desktop, no account needed): import the full collection from https://api.cybernotes.it/mtpl/postman-collection.json — in Postman Import → paste the URL; in Bruno Import Collection → Postman format (URL or the downloaded file).
|
| Specs | truthful: /mtpl/v1/openapi.yaml · the gap-hunt draft: /mtpl/v0/openapi.yaml |