Quickstart

Configure an issuer and issue a credential in about twenty minutes, using the canonical Management and Product APIs.

For the same ground with explanations, use the tutorial instead.

You need: a Sandbox API key. See sandbox.

Set up

export DILIGENCE_BASE_URL="https://api.example.diligence.id"
export DILIGENCE_API_KEY="YOUR_API_KEY"
export MGMT="$DILIGENCE_BASE_URL/management"
export API_VERSION="2026-08-30"

Your key should start did_test.. If it starts did_live. you are pointed at production — stop.

1. Organisation

curl -sS -X POST "$MGMT/organisations?api-version=$API_VERSION" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "externalReference": "quickstart-org", "displayName": "Quickstart", "legalName": "Quickstart Limited", "countryCode": "NZ" }'

2. Issuer

curl -sS -X POST "$MGMT/issuers?api-version=$API_VERSION" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "displayName": "Quickstart Issuer", "organisationReference": "quickstart-org", "issuerType": "Root", "signingKey": { "algorithm": "ES256", "provider": "Software" } }'

Take name from the response — that is your issuer id.

export ISSUER="the-name-from-the-response"

3. Credential type

curl -sS -X POST "$MGMT/credential-configurations?api-version=$API_VERSION" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "issuerId": "'"$ISSUER"'", "identifier": "quickstart-membership", "displayName": "Quickstart Membership", "credentialType": "QuickstartMembership", "format": "dc+sd-jwt", "claims": [ { "name": "member_number", "displayName": "Member number", "required": true } ] }'

4. Activate

curl -sS "$MGMT/issuers/$ISSUER/readiness?api-version=$API_VERSION" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY"

When readyForActivation is true:

curl -sS -X POST "$MGMT/issuers/$ISSUER/activate?api-version=$API_VERSION" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY"

5. Issue

curl -sS -X POST "$DILIGENCE_BASE_URL/v1.0/credentials/issuance" \
  -H "Authorization: ApiKey $DILIGENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: quickstart-issue-001" \
  -d '{ "issuerId": "'"$ISSUER"'", "credentialConfiguration": "quickstart-membership", "externalSubjectReference": "quickstart-subject", "claims": { "member_number": "M-000123" } }'

You get 201 and a transaction in awaiting_wallet, with an offer for the holder.

That state is correct, not stuck. The credential is not held by anyone until a wallet accepts the offer, and that step belongs to the holder.

Done

You have used both planes: Management to configure, Product to transact, one key for both.

Compatibility note

You may see older integrations calling /v1. It still works and returns exactly what it always did, but it is a compatibility surface rather than the recommended path — and Management operations reached that way carry no api-version, so they are not pinned against a future contract change.

Use /management and /v1.0 for anything new. See API versioning.

Next

Edit this page on GitHub