Skip to content

Admin API

POST /v1/admin/keys
Authorization: Bearer <token>

Permission required: api_keys:create

FieldTypeRequiredDescription
namestringYesKey name (e.g., production-backend)
scopesstring[]NoPermission subset (default: all user permissions)

The response includes the full key — shown only once:

{
"id": "550e8400-...",
"name": "production-backend",
"key": "bsk_live_a1b2c3d4e5f6...",
"key_prefix": "bsk_live_a1b2c3d4",
"scopes": ["credentials:issue", "credentials:verify"]
}
GET /v1/admin/keys
Authorization: Bearer <token>
DELETE /v1/admin/keys/:id
Authorization: Bearer <token>

Permission required: api_keys:revoke


POST /v1/admin/webhooks
Authorization: Bearer <token>

Permission required: webhooks:manage

FieldTypeRequiredDescription
urlstringYesWebhook endpoint URL
eventsstring[]YesEvents to subscribe to
secretstringNoHMAC signing secret (auto-generated if omitted)
EventDescription
credential.issuedCredential was issued
credential.revokedCredential was revoked
credential.verifiedCredential was verified
consent.grantedConsent recorded
consent.revokedConsent revoked
member.invitedTeam invitation sent
member.joinedMember accepted invitation
member.removedMember removed
member.role_changedMember’s role changed
GET /v1/admin/webhooks
Authorization: Bearer <token>
DELETE /v1/admin/webhooks/:id
Authorization: Bearer <token>

GET /v1/admin/usage?months=6
Authorization: Bearer <token>

Permission required: usage:view

{
"current": {
"month": "2026-03-01",
"credentials_issued": 42,
"credentials_verified": 15,
"api_calls": 300
},
"limit": {
"tier": "startup",
"max_credentials_per_month": 1000,
"max_dids": 5,
"max_members": 5,
"credentials_remaining": 958,
"dids_used": 2,
"members_count": 3
},
"history": [
{ "month": "2026-02-01", "credentials_issued": 100, "credentials_verified": 50, "api_calls": 800 }
]
}

GET /v1/admin/billing
Authorization: Bearer <token>

Permission required: tenant:manage

POST /v1/admin/billing/upgrade
Authorization: Bearer <token>
FieldTypeRequiredDescription
tierstringYesdeveloper, startup, business, enterprise
billing_emailstringNoBilling contact email
TierMonthlyCredentials/moDIDsMembers
DeveloperFree10011
Startup$49 CAD1,00055
Business$199 CAD10,0002525
EnterpriseCustomUnlimitedUnlimitedUnlimited

POST /v1/admin/domains
Authorization: Bearer <token>

Permission required: tenant:manage

FieldTypeRequiredDescription
domainstringYesCustom domain (e.g., credentials.yourcompany.com)

Returns a verification_token — add it as a DNS TXT record to verify.

POST /v1/admin/domains/:id/verify
Authorization: Bearer <token>
GET /v1/admin/domains
Authorization: Bearer <token>
DELETE /v1/admin/domains/:id
Authorization: Bearer <token>

GET /v1/templates
Authorization: Bearer <token>

Returns your tenant’s custom templates plus gallery templates.

GET /v1/templates/gallery
Authorization: Bearer <token>

Pre-built templates: Canadian Digital ID, Driver License, Health Card, University Degree, Employment Credential, Age Verification (SD-JWT), EU PID (SD-JWT).

POST /v1/templates
Authorization: Bearer <token>
FieldTypeRequiredDescription
namestringYesTemplate name
descriptionstringYesDescription
formatstringYesjwt_vc_json or vc+sd-jwt
typesstring[]YesCredential types
schemaobjectYesJSON Schema for claims
sample_claimsobjectNoExample claims

POST /v1/sandbox/provision
Authorization: Bearer <token>

Creates sample data for quick evaluation: a DID, two sample credentials (JWT-VC + SD-JWT VC), and a consent record.

{
"status": "provisioned",
"provisioned": [
{ "resource": "did", "id": "did:key:z6Mk...", "details": "Ed25519 did:key" },
{ "resource": "credential", "id": "...", "details": "Sample CanadianDigitalID (JWT-VC)" },
{ "resource": "credential", "id": "...", "details": "Sample CanadianDigitalID (SD-JWT VC)" },
{ "resource": "consent", "id": "sample", "details": "Sample consent for identity verification" }
]
}