Certificate API
Introduction
The Certificate API allows company admins to manage landscape-wide (central) certificates via API. These certificates are used to configure custom domains on Mendix Cloud and can also be managed via Certificate Management in Control Center.
Prerequisites
To use the Certificate API, you must:
- Be a company admin
- Have a Mendix Personal Access Token (PAT) with the
mx:deployment:writescope
For information on creating a PAT, refer to Personal Access Tokens.
Capabilities
The Certificate API lets you manage the central certificates owned by your company:
| Capability | Method and Path |
|---|---|
| List certificates | GET /v1/certificates |
| Create a certificate | POST /v1/certificates |
| Update a certificate | PATCH /v1/certificates/{certificateId} |
| Replace a certificate | PUT /v1/certificates/{certificateId}/replacement |
| Delete a certificate | DELETE /v1/certificates/{certificateId} |
All endpoints operate only on central certificates. Private key material, certificate PEM data, and internal identifiers are never returned in any response.
Base URL
https://api.home.mendix.com/Authentication
All requests must include your PAT in the Authorization header:
Authorization: mxToken <PAT>The company that a request operates on is derived automatically from the authenticated token and you do not pass a company identifier. Every operation is scoped to and restricted to the certificates owned by that company.
Certificate Object
Successful responses return a certificate object with the following structure:
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"description": "Wildcard cert for example.com",
"validFrom": "2026-01-01T00:00:00Z",
"validTill": "2027-01-01T00:00:00Z",
"createdAt": "2026-01-02T09:15:00Z",
"updatedAt": "2026-01-02T09:15:00Z",
"status": "VALID",
"inUse": true,
"linkedFqdnsCount": 2
}| Field | Type | Description |
|---|---|---|
id |
String (UUID) | Unique certificate identifier |
description |
String | Free-text description (auto-generated from the certificate's subject/SAN if not supplied) |
validFrom |
String (RFC3339) | Certificate validity start |
validTill |
String (RFC3339) | Certificate validity end |
createdAt |
String (RFC3339) | When the certificate was created |
updatedAt |
String (RFC3339) | When the certificate was last modified |
status |
String enum | One of UPCOMING, VALID, EXPIRES SOON, EXPIRED. Computed from validity dates; EXPIRES SOON applies within 15 days of expiry |
inUse |
Boolean | true if the certificate is linked to one or more custom domains |
linkedFqdnsCount |
Integer | Number of custom domains currently linked to this certificate |
Errors
All errors use a standard envelope:
{
"error": {
"message": "certificate not found",
"code": 404,
"detail": "optional additional context"
}
}| Status | Meaning |
|---|---|
| 400 | Malformed request – invalid certificate or key, certificate/key mismatch, invalid chain, invalid query parameter, or the certificate has linked domains and cannot be deleted |
| 401 | Missing or invalid authentication |
| 404 | Certificate not found, or not owned by your company |
| 409 | Conflict – a certificate with the same key material already exists |
| 500 | Internal server error |
Endpoints
List Certificates
GET /v1/certificatesReturns the central certificates owned by your company, most recently updated first. Supports filtering and pagination.
Query Parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
domain |
String | – | Filter to certificates linked to this domain |
status |
String | – | Filter by status: UPCOMING, VALID, EXPIRES SOON, EXPIRED |
page |
integer | 1 | 1-based page number |
limit |
integer | 10 | Page size, 1–100 |
Response 200:
{
"certificates": [ { "...": "certificate object" } ],
"page": 1,
"limit": 10,
"totalCount": 3
}Create a Certificate
POST /v1/certificatesRequest Body
{
"certificate": "-----BEGIN CERTIFICATE-----...",
"privateKey": "-----BEGIN PRIVATE KEY-----...",
"intermediateChain": "-----BEGIN CERTIFICATE-----...",
"description": "Wildcard cert for example.com"
}| Field | Required | Notes |
|---|---|---|
certificate |
Yes | PEM-encoded leaf certificate |
privateKey |
Yes | PEM-encoded private key matching the certificate |
intermediateChain |
No | PEM-encoded intermediate chain |
description |
No | Auto-generated from the certificate if omitted |
Response: 201 with the created certificate object.
Update a Certificate
PATCH /v1/certificates/{certificateId}Partially updates a certificate's material or description. Any combination of fields may be supplied.
Request Body
{
"certificate": "-----BEGIN CERTIFICATE-----...",
"intermediateChain": "-----BEGIN CERTIFICATE-----...",
"description": "Renewed cert"
}Response: 200 with the updated certificate object.
Replace a Certificate
PUT /v1/certificates/{certificateId}/replacementRotates a certificate – transfers all custom domains linked to {certificateId} onto another certificate you own, without downtime for the linked domains. Both certificates must be central certificates owned by your company.
Request Body
{"newCertificateId": "8f14e45f-ceea-467e-8459-b17dc4536f43"}Response: 200 with the new certificate's object (now carrying the transferred domain links).
Delete a Certificate
Deletes a central certificate.
DELETE /v1/certificates/{certificateId}Response: 204 No Content