Default Requests
Issuing a certificate takes a long request: profile, issuing certificate, alternative names, CRL URI, key usage, and then the parts that are actually specific to this certificate. Default requests let you save the repeated part once on your X.509 Certificate Service, so an issuance only carries what is unique to it.
Default requests are optional. Nothing on this page is required to issue certificates. Use it once you notice you are repeating the same issuer settings.
When This Is Worth It
Default requests pay off when many certificates share the same issuer and profile and differ only in subject and validity. In the X.509 service that is for example:
- Document Signer issuance under one IACA. Every Document Signer is
iso-document-signer, signed by the same IACA, with the same issuer alternative name and CRL URI. Only the signer's key or CSR, its name and its validity change. This is the case this page walks through. - CSR-based issuance for partners. Requesters submit a CSR and you sign it under a fixed issuer. With the issuer settings stored, the call is just
csrPemplus validity.
They are a poor fit for one-off certificates. An IACA root, for example, is issued once in the life of a program, so there is nothing to repeat.
What Changes
Without a default, every Document Signer issuance carries the full body:
{
"certificateProfile": "iso-document-signer",
"issuerCertificateRef": "test.tenant1.x509-store-1.iaca-prod-2026",
"issuerAlternativeNames": [
{ "type": "uri", "name": "https://iaca.example.com" }
],
"crlDistributionPointUri": "https://crl.example.com/ds.crl",
"subjectKeyRef": "test.tenant1.kms1.ds-key",
"subjectDn": "CN=Example Document Signer,O=Example Org,C=US",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z"
}
With the first four fields stored as a default, the call becomes:
{
"subjectKeyRef": "test.tenant1.kms1.ds-key",
"subjectDn": "CN=Example Document Signer,O=Example Org,C=US",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z"
}
The service fills in everything you left out. Anything you do send in the call wins over the stored value.
Send the request to the service, not to a certificate ID. A default is applied only when the request target is the service itself ({organizationID}.{tenantID}.{x509ServiceID}). If the target ends in a certificate ID (…{x509ServiceID}.{certificateID}), the stored default is silently ignored. The service then generates a random certificate ID, which the response returns in certificate._id. Because PUT /certificates always requires a certificate ID in the target, a default stored for upsert-certificate currently has no effect.
Prerequisites
- An X.509 Certificate Service with a KMS and an X.509 Store attached. See Setup.
- A stored IACA to issue under. See Issue Certificates.
- A bearer token with the
update-default-requestspermission and the permission to create certificates. Both are needed to store a default.
Step 1: Store a Default
Store the issuer settings with a PUT. The last part of the URL, create-certificate, names the API call the default applies to: the one behind POST /v1/{target}/x509-service-api/certificates. The body is an ordinary certificate issuance request. Leave out every field that changes per certificate.
Endpoint: PUT /v1/{target}/x509-service-api/default-requests/create-certificate | API Reference
Example Request
curl -X 'PUT' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/x509-service-api/default-requests/create-certificate' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"certificateProfile": "iso-document-signer",
"issuerCertificateRef": "test.tenant1.x509-store-1.iaca-prod-2026",
"issuerAlternativeNames": [
{ "type": "uri", "name": "https://iaca.example.com" }
],
"crlDistributionPointUri": "https://crl.example.com/ds.crl"
}'
Path Parameters
- orgID: String (required) - Organization host alias. For the sandbox organization
test, the base URL ishttps://test.enterprise-sandbox.waltid.dev. - target: resourceIdentifier (required) -
{organizationID}.{tenantID}.{x509ServiceID}, for exampletest.tenant1.x509-service-1.
Header Parameters
- Authorization: String (required) - Bearer token. Format:
Bearer {yourToken}.
Body Parameters
- The body is a partial issuance request. It accepts the same fields as issuing a certificate, and you can send any subset of them. Unknown or misspelled keys, and values that break the request rules, are rejected now, not later when a certificate is issued. Missing required fields such as
validFromandvalidToare not checked until you issue a certificate.
Example Response 200 OK
The stored document is echoed back.
{
"certificateProfile": "iso-document-signer",
"issuerCertificateRef": "test.tenant1.x509-store-1.iaca-prod-2026",
"issuerAlternativeNames": [
{ "type": "uri", "name": "https://iaca.example.com" }
],
"crlDistributionPointUri": "https://crl.example.com/ds.crl"
}
Response Codes
200- Default request stored.400- The document is not a valid partial body for this operation.401/403- Authentication or authorization failure.update-default-requestsand the operation's own permission are both required.404- Service not found, or the operation name is unknown.
Step 2: Issue a Certificate
Send only what is specific to this certificate: its key and name, and its validity.
Endpoint: POST /v1/{target}/x509-service-api/certificates | API Reference
Example Request
curl -X 'POST' \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/x509-service-api/certificates' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"subjectKeyRef": "test.tenant1.kms1.ds-key",
"subjectDn": "CN=Example Document Signer,O=Example Org,C=US",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z"
}'
Path Parameters
- orgID: String (required) - Organization host alias.
- target: resourceIdentifier (required) -
{organizationID}.{tenantID}.{x509ServiceID}. Do not append a certificate ID, or the default is not applied.
Header Parameters
- Authorization: String (required) - Bearer token. Format:
Bearer {yourToken}.
Body Parameters
- Any field you send overrides the stored value.
validFromandvalidToare always required, and so is one subject key source and, unless a CSR is used,subjectDn.
Example Response 201 Created
The response is the same as for any issuance. The stored iso-document-signer profile and issuer are applied, so the certificate is signed by the IACA and carries the stored CRL distribution point. See Response model for the fields.
{
"certificate": {
"_id": "test.tenant1.x509-store-1.c23b32a3-f7d2-4388-9e43-2d69f71de017",
"issuerDn": "CN=Example IACA,O=Example Org,C=US",
"subjectDn": "CN=Example Document Signer,O=Example Org,C=US",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z",
"certificatePem": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
},
"persistResult": {
"test.tenant1.x509-store-1.c23b32a3-f7d2-4388-9e43-2d69f71de017": "CREATED"
}
}
Response Codes
200- Certificate generated, no store attached (not persisted).201- Certificate issued and persisted.400- The merged request is not a valid issuance request, for example when neither the default nor the call provides an issuing certificate.401/403- Authentication or authorization failure.
Issue from a CSR
The same default works for CSR-based issuance. Send the CSR and the validity, and the stored issuer settings do the rest. See CSR Workflows.
{
"csrPem": "-----BEGIN CERTIFICATE REQUEST-----\nMIIB...\n-----END CERTIFICATE REQUEST-----",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z"
}
Override Part of the Default
To change one thing, send only that. This request uses a different CRL distribution point and keeps everything else from the default:
{
"subjectKeyRef": "test.tenant1.kms1.ds-key",
"subjectDn": "CN=Example Document Signer,O=Example Org,C=US",
"validFrom": "2026-09-01T00:00:00Z",
"validTo": "2027-11-01T00:00:00Z",
"crlDistributionPointUri": "https://crl.other.example.com/ds.crl"
}
Read or Remove a Default
- List all stored defaults:
GET /v1/{target}/x509-service-api/default-requests(needsview-default-requests). - Read one:
GET …/default-requests/create-certificate. Returns404if none is stored. - Remove one:
DELETE …/default-requests/create-certificate. Returns204, also when nothing was stored.
Full details, permissions and the other services that support default requests: Default Requests.
