Default Requests

Default requests let you save the fields you would otherwise send on every call to a service, such as a verification query or a signing key, so each call only carries what changes. You store them once with a PUT. From then on, whenever that operation runs, the stored values fill in any field the caller leaves out. Values sent in the call always win, and if nothing is stored as a default request, the operation behaves exactly as before.

An operation is one API call, identified by the name shown in OpenAPI as Operation: '<operation>'. For example, create-verification-session is the operation behind POST …/verification-session/create. Technically, the stored document is a partial JSON request body that is deep-merged underneath the body the caller sends.

This is separate from service configuration. Configuration is the service document (keys, URLs, metadata). A default request is a reusable set of request values for one mutating operation.

Default requests are opt-in per service instance. Creating a service does not store any default requests. PUT a document to enable merge for that operation; DELETE it to turn merge off again.

Which Services Support This

The /default-requests endpoints exist on these services:

ServiceAPI prefixUseful operation
Verifier2/v2/{target}/verifier-service-apicreate-verification-session
Wallet2/v2/{target}/wallet-service-apiwallet2-present-credential, wallet2-receive-credential-authorized
X.509 Certificate/v1/{target}/x509-service-apicreate-iaca-certificate, create-document-signer-certificate
DID/v1/{target}/did-service-api/didscreate-did-key, create-did-web
VICAL/v1/{target}/vical-service-apipublish-vical
Client Attestation/v1/{target}/client-attester-apiattest-client
Trust Registry/v1/{target}/trust-registry-apiresolve-certificate

Every JSON-object POST / PUT on those services can technically store a default. Use the operations above: they are the ones with stable fields (flow setup, holder key, org identity) and per-call fields (offers, certificates, session ids) that you still send on each request.

Merge Rules

  • Nested objects merge key by key.
  • Arrays and primitives are replaced wholesale. Sending a new dcql_query.credentials array replaces the defaulted query; it is not appended.
  • Merge happens on raw JSON before deserialization, so an explicit false can override a defaulted true.
  • An empty body is valid once a complete default is stored.
  • There is no delete-by-null sentinel.

Permissions

  • view-default-requests — list or read stored defaults.
  • update-default-requests — set or clear a default.

PUT and DELETE also require the permission of the operation itself. On the X.509 service, someone who can create document signers cannot edit the IACA default unless they also have the IACA create permission.

These permissions are separate from view-service-configuration / update-service-configuration. Updating a URL or signing key does not drop stored default requests.


Set a Default Request

The examples below use Verifier2. Swap the API prefix and {operation} for the other services.

CURL

Endpoint: PUT /v2/{target}/verifier-service-api/default-requests/{operation} | API Reference

Example Request
curl -X 'PUT' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v2/{target}/verifier-service-api/default-requests/create-verification-session' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {yourToken}' \
  -H 'Content-Type: application/json' \
  -d '{
  "flow_type": "cross_device",
  "core_flow": {
    "signed_request": false,
    "encrypted_response": false,
    "expiration_duration": "PT5M",
    "dcql_query": {
      "credentials": [
        {
          "id": "pid",
          "format": "dc+sd-jwt",
          "meta": {
            "vct_values": [
              "https://credentials.example.com/identity_credential"
            ]
          },
          "claims": [
            { "path": ["family_name"] }
          ]
        }
      ]
    }
  }
}'

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) - {organization}.{tenant}.{serviceId}, for example waltid.tenant1.verifier1.
  • operation: String (required) - Operation identifier from the corresponding endpoint's OpenAPI description, for example create-verification-session.

Header Parameters

  • Authorization: String (required) - Bearer token. Format: Bearer {yourToken}.

Body Parameters

  • The body is a partial request body of {operation}. Send only the fields that should be defaulted. Unknown or misspelled keys are rejected here, not later when the operation runs.
Example Response 200 OK

The stored document is echoed back.

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 {operation} is unknown for this service.

🎉 You've stored a default. Session creation can now omit the fields above.


Invoke the Operation

With a complete default, the body may be empty. With a partial default, send only what varies.

CURL

Endpoint: POST /v2/{target}/verifier-service-api/verification-session/create | API Reference

Example Request
curl -X 'POST' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v2/{target}/verifier-service-api/verification-session/create' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {yourToken}' \
  -H 'Content-Type: application/json' \
  -d '{}'

To override part of the default, send only those keys. Nested objects merge; arrays replace:

{
  "core_flow": {
    "sessionId": "session-1",
    "dcql_query": {
      "credentials": [
        {
          "id": "mdl",
          "format": "mso_mdoc",
          "meta": { "doctype_value": "org.iso.18013.5.1.mDL" }
        }
      ]
    }
  }
}

That request keeps signed_request, encrypted_response, and expiration_duration from the default, sets sessionId, and replaces the DCQL credentials array with the mDL query.

Path Parameters

  • orgID: String (required) - Organization host alias.
  • target: resourceIdentifier (required) - {organization}.{tenant}.{verifierServiceID}.

Header Parameters

  • Authorization: String (required) - Bearer token. Format: Bearer {yourToken}.

List, Read, and Clear

CURL

List — GET /v2/{target}/verifier-service-api/default-requests

curl -X 'GET' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v2/{target}/verifier-service-api/default-requests' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {yourToken}'

Returns a JSON object keyed by operation. Operations with no default are omitted. Requires view-default-requests.

Read one — GET /v2/{target}/verifier-service-api/default-requests/{operation}

404 when that operation has no default.

Clear — DELETE /v2/{target}/verifier-service-api/default-requests/{operation}

curl -X 'DELETE' \
  'https://{orgID}.enterprise-sandbox.waltid.dev/v2/{target}/verifier-service-api/default-requests/create-verification-session' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer {yourToken}'

Response Codes

  • 204 — No default is configured for that operation any more. Idempotent: clearing an unset operation also returns 204.
  • 401 / 403 — Authentication or authorization failure.
  • 404 — Service not found, or {operation} is unknown.

Next Steps

Last updated on September 29, 2026