Everything you need to understand, integrate, and verify decentralized identities and credentials on Cardano.
NMKR Identity helps Cardano NFT projects and real-world asset (RWA) issuers establish cryptographically verifiable identity. Projects prove who they are using Atala PRISM DIDs and W3C Verifiable Credentials instead of screenshots or social media posts.
The platform produces signed CIP-725 metadata for on-chain submission, linking your token policy to a verified identity. Any third party can independently verify the entire chain of trust without contacting us.
Four building blocks make up the identity and verification system.
A globally unique identifier (did:prism:...) tied to a cryptographic keypair you control. Contains your public key, company info, and social accounts.
A W3C-standard JSON document asserting facts about your project (policy ID, asset name, RWA details). Signed by your DID key, verifiable by anyone.
CIP-725 on-chain identity metadata referencing your DID and credential URLs, signed by your DID key. Readable by wallets and marketplaces.
After KYC review, the platform issues a signed VC attesting to your DID. A second trust layer: your DID is self-signed, and we independently vouch for you.
From registration to on-chain metadata in six steps.
Enter your company name, website, and social accounts. The platform generates a DID Document with a fresh secp256k1 keypair.
Your private key is encrypted (PBKDF2 + Fernet). Download it immediately — shown only once. You need this to sign credentials and metadata.
Upload company registration, proof of identity, or supporting files. Reviewed by an admin, never shared publicly.
An admin reviews your documents. On approval, the platform issues a signed VC (attestation) referencing your DID.
For each Cardano policy or asset, create a VC signed by your DID key. Each credential gets a unique public URL and QR code.
Generate signed CIP-725 metadata for any credential. Submit on-chain alongside your token transaction.
Anyone can verify a project's identity by checking independent signatures. No account or API key needed.
issuer to get the DID.verificationMethod[0].publicKeyJwk.proof.signatureValue is a secp256k1 signature over the canonicalized payload.proof, canonicalize, verify proof.jws against the DID's public key.verifierJwk). Verify its signature.credentialStatus.id to confirm active (not revoked).Tip: On any credential page, the "Verify" button performs all steps automatically and shows a pass/fail report.
| Document | Signed By | Message | Signature Field |
|---|---|---|---|
| DID Document | Project DID key | JSON.stringify(payload, sorted) | proof.signatureValue |
| Credential (VC) | Project DID key | JSON.stringify(vc_without_proof, sorted) | proof.jws |
| Attestation | Platform verifier | JSON.stringify(att_without_proof, sorted) | proof.signatureValue |
| 725 Metadata | Project DID key | Metadata payload (policy scoped) | proof.signatureValue |
All public endpoints require no authentication. Responses are JSON.
Returns the full W3C Verifiable Credential JSON.
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
"type": ["VerifiableCredential", "TokenProjectVerification"],
"issuer": { "id": "did:prism:abc123..." },
"credentialSubject": { "policyID": "a1b2c3...", "label": "Main Collection" },
"proof": { "type": "EcdsaSecp256k1Signature2019", "jws": "..." }
}
Returns active or revoked.
{ "status": "active" }
Returns the DID Document, platform attestations, and KYC status.
{
"did": "did:prism:abc123...",
"didDocument": { ... },
"attestations": [ ... ],
"kycStatus": "approved"
}
Returns a PNG QR code encoding the public credential URL.
{ "status": "ok" }Requires a Bearer token (generated in Settings) or an active session.
Same as the public endpoint but requires authentication.
Authorization: Bearer your_api_token_here
725).files array.{
"725": {
"1.0": {
"{policy_id}": {
"{collection}": {
"type": "JsonWebKey2020",
"files": [
{ "src": "did:prism:abc...", "name": "Token-Identity" },
{ "src": "https://identity.nmkr.io/api/credentials/1", "name": "Verification-Credential" }
],
"proof": { "type": "EcdsaSecp256k1Signature2019", "signatureValue": "..." }
}
}
}
}
}
# 1. Fetch the credential
vc = GET /api/credentials/{id}
# 2. Fetch the DID
did_info = GET /api/dids/{did_id}/public
pubkey = did_info.didDocument.verificationMethod[0].publicKeyJwk
# 3. Verify DID Document signature
verify_secp256k1(pubkey, canonicalize(payload), proof.signatureValue)
# 4. Verify VC signature
verify_secp256k1(pubkey, canonicalize(vc_without_proof), proof.jws)
# 5. Check status
status = GET /api/credentials/{id}/status
assert status.status == "active"
Important: Always canonicalize JSON before verification (sorted keys, no extra whitespace). The platform uses json.dumps(obj, sort_keys=True).
| Standard | Usage | Reference |
|---|---|---|
| W3C DID Core | DID Document structure and resolution | w3.org/TR/did-core |
| W3C Verifiable Credentials | Credential format and verification | w3.org/TR/vc-data-model |
| Atala PRISM | DID method (did:prism) | atalaprism.io |
| CIP-725 | On-chain token identity metadata | Cardano Improvement Proposal |
| secp256k1 / ECDSA | Elliptic curve signatures (RFC 6979) | Bitcoin / Cardano curve |
| JsonWebKey2020 | Public key representation in DIDs | w3.org/TR/did-spec-registries |
| PBKDF2 + Fernet | Private key encryption (200k iterations) | NIST SP 800-132 |
A Decentralized Identifier — a globally unique identifier you control, tied to a cryptographic keypair. No central authority can revoke or modify it.
Your private key is downloadable only once. If lost, you cannot sign credentials for that DID and would need to create a new one. Back up your key file securely.
Yes. Each DID represents a company or project with its own keypair and KYC process.
Yes. Each credential is scoped to a Cardano policy ID and optionally an asset name.
CIP-725 metadata is submitted on-chain alongside Cardano transactions. It references your DID and credential, signed by your key. CIP-725-aware wallets can display verified identity.
Yes. All data is accessible via public API. No account needed. The platform also provides a built-in "Verify" button on each credential page.
Typically: company registration certificates, proof of address, and ID of authorized representatives. Accepted formats: PDF, PNG, JPG, WEBP (max 25 MB).
secp256k1 with deterministic ECDSA (RFC 6979) — the same curve used by Bitcoin and Cardano.
Use the "Revoke" button on the credential page. The status endpoint immediately reflects the revocation.
Real-World Asset credentials include asset type, jurisdiction, and registration number in the credentialSubject.