Getting started
With the API another system reads and writes data in your Asset Management System. With webhooks that system is notified the moment something happens.
- Create an API key under Settings > Integrations and API.
- Send the key with every request.
- Optionally add a webhook to receive events.
curl https://ams.software/api/v1/assets?limit=2 \
-H "Authorization: Bearer ams_live_..."Base URL: https://ams.software/api/v1. Field names are Dutch, as in the system; error messages are English.
Authentication
Every request carries the Authorization header with your key. A key belongs to one organisation and only sees that organisation’s data.
Authorization: Bearer ams_live_...- A key is read-only, or read and write. You choose when creating it.
- You see the key once. We only store a hash.
- Use one key per system, so you can revoke it separately.
Reading data
GET https://ams.software/api/v1/<resource>
GET https://ams.software/api/v1/<resource>/<id>| Resource | Contents | Filters |
|---|---|---|
/locaties | Buildings and sites | plaats, soort |
/assets | Installations and building elements | locatie_id, categorie, status, bedrijfsstatus, nummer, extern_id, ruimte_nummer, kritikaliteit |
/meldingen | Reports and breakdowns | locatie_id, asset_id, status, soort, urgentie |
/werkorders | Work orders | locatie_id, asset_id, melding_id, project_id, status, leverancier_id |
/taken | Tasks, decisions and checks | locatie_id, status, soort, bron_entiteit, bron_id |
/keuringen | Inspections and statutory obligations | locatie_id, asset_id, soort |
/documenten | Documents with their link | asset_id, project_id, melding_id, werkorder_id, soort |
/projecten | Projects (Capex and Opex) | locatie_id, fase, kostensoort |
/budgetten | Budget lines per financial year | boekjaar, locatie_id, kostensoort, status |
/kosten | Invoices and variations | werkorder_id, project_id, soort |
limit(default 100, maximum 500) andoffsetfor paging; the response containspaging.next_offset.updated_since(ISO 8601 date) returns only what changed since; not for budgetten and kosten.- Filters are exact values, for example
?locatie_id=…&status=open.
{
"data": [ { "id": "…", "nummer": "A-0059", "naam": "…", "locatie_id": "…" } ],
"paging": { "limit": 100, "offset": 0, "total": 79, "next_offset": null }
}Writing data
Writing requires a key with write access. Every change is recorded in the audit log, with the name of the key.
Create a report or breakdown
POST https://ams.software/api/v1/meldingen
{
"titel": "Lekkage plafond gang",
"omschrijving": "Water bij de lift",
"soort": "melding", // or "storing"
"urgentie": "normaal", // laag | normaal | hoog | spoed
"asset_nummer": "A-0059", // or asset_id / asset_extern_id / locatie_id
"gemeld_door": "Jan Jansen",
"fotos": ["https://…"]
}Required: titel, and an asset or locatie_id. The responsible person from the process agreements automatically gets a task to assess the report. A breakdown sets the asset to breakdown status.
Update a report
PATCH https://ams.software/api/v1/meldingen/<id>
{ "status": "in_behandeling", "bericht": "Monteur komt morgen" }
// status: in_behandeling | hersteld_gemeld also: oplossingUpdate a work order
PATCH https://ams.software/api/v1/werkorders/<id>
{ "status": "geaccepteerd", "verwachte_datum": "2026-12-03" }
// status: geaccepteerd | in_uitvoering | gereed_gemeld also: gereed_tekst, extern_referentieA work order still waiting for manager approval cannot be updated (409). Closing and accepting completion is done by the client in the system.
Webhooks
Add an https address under Settings > Integrations and API and choose the events. We send a POST with JSON as soon as something happens.
POST https://uw-systeem.example/hook
X-AMS-Event: werkorder.goedgekeurd
X-AMS-Delivery: <id>
X-AMS-Signature: t=1794480000,v1=<hex>
{
"id": "<id>",
"type": "werkorder.goedgekeurd",
"created": "2026-11-12T11:30:00Z",
"data": { "werkorder": { "id": "…", "nummer": 12, "titel": "…", "status": "gepland" } }
}| Event | When |
|---|---|
melding.aangemaakt | New report or breakdown |
melding.status_gewijzigd | Report status changed |
melding.gesloten | Report closed |
werkorder.aangemaakt | New work order |
werkorder.goedgekeurd | Work order approved by the manager |
werkorder.status_gewijzigd | Work order status changed |
werkorder.gereed_gemeld | Work order reported complete |
werkorder.opgeleverd | Completion accepted |
asset.aangemaakt | New asset |
asset.gewijzigd | Asset changed |
keuring.verloopt | Inspection due soon (coming) |
keuring.verlopen | Inspection overdue (coming) |
taak.aangemaakt | New task |
taak.klaar | Task completed |
Managing webhooks through the API
A platform can subscribe and unsubscribe itself with a key with write access. The secret is only returned in the response to the create call.
POST https://ams.software/api/v1/webhooks { "url": "https://…", "events": ["melding.aangemaakt"] }
GET https://ams.software/api/v1/webhooks
DELETE https://ams.software/api/v1/webhooks/<id>Verifying the signature
Compute HMAC-SHA256 over "<t>.<body>" with the webhook secret (whsec_…) and compare with v1. Reject messages whose t is older than five minutes.
import { createHmac, timingSafeEqual } from 'crypto';
function geldig(header, body, geheim) {
const { t, v1 } = Object.fromEntries(header.split(',').map((x) => x.split('=')));
const verwacht = createHmac('sha256', geheim).update(t + '.' + body).digest('hex');
return Math.abs(Date.now() / 1000 - Number(t)) < 300
&& timingSafeEqual(Buffer.from(v1), Buffer.from(verwacht));
}Respond within five seconds with a 2xx status. Otherwise we retry after 1, 5, 30, 120 and 720 minutes. Use X-AMS-Delivery to recognise duplicates.
Errors and limits
{ "error": { "code": "validation_error", "message": "Field \"titel\" is required." } }| 401 | unauthorized | Key missing, invalid or revoked |
| 403 | forbidden | Key is read-only, or the system is not active |
| 404 | not_found | Resource or record does not exist |
| 409 | conflict | Not possible in this status |
| 422 | validation_error | Field missing or invalid |
| 429 | rate_limited | More than 120 requests per minute per key |
Every request is kept for 90 days in the log under Settings > Integrations and API.
Zapier, Make and Power Automate
You can already connect without code using the webhook and HTTP building blocks in these platforms:
- Receiving events: create a "Catch hook" or "Custom webhook" in the platform and paste that address under Webhooks.
- Fetching data or creating a report: use an HTTP step with your key in the Authorization header.
Ready-made apps for Zapier and Make, and standard integrations with Exact Online, AFAS and TOPdesk, are in preparation.
Integrations
Besides the open API we build standard integrations with widely used packages. This is the current status; customers register their interest in the system, which sets our order.
Foundation
| Open API | Read and write assets, reports, work orders and more | Available |
| Webhooks | Instant notification of every event | Available |
| Zapier, Make, Power Automate | Today through webhooks and HTTP steps; dedicated apps to follow | Available |
Finance and ERP
| Exact Online | Invoices and payment status per work order | In preparation |
| AFAS Profit | Invoices, cost centres and projects | In preparation |
| Twinfield | Invoices and payment status | On request |
| Unit4 | Invoices, projects and budgets | On request |
| SAP S/4HANA | Equipment, notifications, purchase orders and invoices | On request |
| Microsoft Dynamics 365 | Invoices, projects and assets | On request |
Service desk and facility
| TOPdesk | Incidents in, status back | In preparation |
| ServiceNow | Incidents and assets | On request |
| Planon, Ultimo, IBM Maximo | Import the asset register and work orders | On request |
Building management
| Priva | A building alarm automatically becomes a breakdown | Planned |
| Johnson Controls Metasys | Alarms and points | Planned |
| Siemens Desigo CC | Alarms and points | On request |
BIM, documents and calendar
| IFC import | Assets, rooms and floor plans from the building model | Planned |
| Autodesk Construction Cloud | Handover from construction to operations | On request |
| SharePoint, Google Drive | Link documents without storing them twice | Planned |
| Outlook, Google Calendar | Planning in the calendar of those involved | In preparation |
Procurement and sign-in
| Sign in with Google | Sign in with your organisation’s Google account | Available |
| Sign in with Microsoft | Sign in with your work account (Entra ID) | In preparation |
| Coupa | Work order becomes purchase order, invoice comes back | On request |