https://api.makini.io/mgmt. Call them with a client_credentials token, as described in Management API authentication:| Scope | Allows |
|---|---|
connections:read | Listing and reading connections |
connections:write | Creating, updating, activating, deactivating and deleting them |
$TOKEN. A connection is always your application's own: an id that belongs to another application answers 404, exactly like one that doesn't exist.| Field | Meaning |
|---|---|
id | The connection id. |
name, email | The name and contact email of the person or company the connection belongs to. |
platform | The platform key, for example upkeep. null until one is chosen. |
userMetadata | Your own key-value data, such as your customer id. Makini stores it and hands it back. |
connectedAt | When the credentials first arrived, or null while the connection waits for them. |
deactivatedAt | When the connection was deactivated, or null while it's active. |
credentialsExpiredAt | When the connected system last refused the stored credentials, or null. New credentials clear it. |
createdAt, updatedAt | When the connection was created and last changed. |
POST /connections creates a connection in one of two ways.{
"connection": {
"id": "5b0c6f0e-2a4e-4a51-9d6c-1f3e8a7b2c90",
"name": "Acme Manufacturing",
"email": "maintenance@acme.example",
"platform": "upkeep",
"userMetadata": { "customerId": "4711" },
"connectedAt": null,
"deactivatedAt": null,
"credentialsExpiredAt": null,
"createdAt": "2026-09-25T09:12:03.000Z",
"updatedAt": "2026-09-25T09:12:03.000Z"
}
}clientId and a few other fields; see the API reference for the full schema.connection_id. Link fills in the credentials of this connection instead of creating a new one, and skips every question the connection already answers. A connection without credentials uses no connection credits.credentials, together with platform. The fields are the ones the platform's Makini Link form asks for.401 MAKINI_SYNC_CREDENTIALS_REJECTED and no connection exists. See Errors for every refusal. Once saved, the connection starts syncing and uses its connection credits. If your workspace is out of credits and Allow overspend is off, the connection is still created, but deactivated. See Connection credits.adapterSlug. Without it, the answer is a 400 that lists the choices.Idempotency-Key header (1 to 200 printable characters, no spaces) to make a create safe to retry. A repeat with the same key returns the connection the first request created, with the header Idempotent-Replayed: true, and creates nothing new: no second connection, no second charge. The same key with a different platform is a 409. Without a key, every request creates a new connection.{"data": [...]} with every live connection of your application, oldest first. Deleted connections aren't included.filter[...] query parameters, which combine with AND:| Filter | Matches |
|---|---|
filter[userMetadata.<key>]=<value> | Connections whose userMetadata has that key with exactly that value. Use it to find the connection for one of your customers, for example filter[userMetadata.customerId]=4711. |
filter[name]=<text> | Name contains the text, case-insensitive. |
filter[email]=<text> | Email contains the text, case-insensitive. |
filter[platform]=<key> | Exact platform key. |
filter[status]=<status> | active, pending (no credentials yet), expired (the connected system refused the credentials) or deactivated. |
page or perPage to page the list (perPage is at most 500, 100 by default). A paged answer carries meta:{ "data": [...], "meta": { "page": 2, "perPage": 100, "total": 240 } }{"connection": {...}}. A deleted connection is a 404.PUT /connections/{id} changes name, email, platform, userMetadata or credentials. Send only the fields you want to change; userMetadata is replaced as a whole.connection_id./v4 and MCP answer 403, and it doesn't sync. Activating it resumes everything at once.{"changed": true, "connection": {...}}. Asking for the state the connection is already in is safe: it answers changed: false and does nothing. Both directions are always allowed.204 with no body. Deleting a connection that is already gone is a 404.| Event | Sent when |
|---|---|
connection.created | A connection is created. |
connection.updated | A connection's details or credentials change. |
connection.deleted | A connection is deleted. data.deleted is soft or force. A force delete after a delete sends a second event. |
data.connection, in the same shape the API returns:{
"id": "0f7a3c52-9d1e-4b8a-a6f0-3e2d1c4b5a69",
"type": "connection.updated",
"occurredAt": "2026-09-25T10:30:00.000Z",
"source": "management-api",
"data": {
"connection": { "id": "5b0c6f0e-2a4e-4a51-9d6c-1f3e8a7b2c90", "name": "Acme plant 2" }
}
}