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 csrPem plus 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-requests permission 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.

CURL

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 is https://test.enterprise-sandbox.waltid.dev.
  • target: resourceIdentifier (required) - {organizationID}.{tenantID}.{x509ServiceID}, for example test.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 validFrom and validTo are 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-requests and 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.

CURL

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. validFrom and validTo are 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 (needs view-default-requests).
  • Read one: GET …/default-requests/create-certificate. Returns 404 if none is stored.
  • Remove one: DELETE …/default-requests/create-certificate. Returns 204, also when nothing was stored.

Full details, permissions and the other services that support default requests: Default Requests.

Last updated on September 29, 2026