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
- Tutorial — the same flow, explained
- Verify a credential
- SDKs
- Production integration