Rightshold™ Sign up

RS-KYA / interop

RS-KYA interop profile

Agents: markdown · machine form /v1/interop · profile check POST /v1/interop/check · trust decision POST /v1/kya/verify.

This profile describes the exact shape of the credentials Rightshold issues today, so any implementer can read, check and verify one without asking. A field-correspondence note states only that a member carries a named value or uses a named member name — correspondence is not a statement that a document conforms to the specification the name comes from. What is not asserted is listed in full, in this same document, under not_asserted. Nothing here confers a level, a status or a link: those come only from the live RS-KYA record.

The credential, field by field

MemberWhat it carriesCorrespondence note
@contextan array whose entry is "https://www.w3.org/ns/credentials/v2"The context URL the W3C Verifiable Credentials Data Model 2.0 defines for its documents. Carrying the URL names the vocabulary the member names come from; it is not a conformance statement.
type"VerifiableCredential" followed by "RightsholdKYACredential""VerifiableCredential" is the data model's base type name; the second entry is the Rightshold type.
specthe RS-KYA spec id, rs-kya/0.1A Rightshold member with no counterpart in the data model; it names the issuing standard version.
issueran object whose id is the issuer's HTTPS URL, with the issuer name and idThe data model permits a URL as an issuer identifier. This platform's issuer identifier is a URL, not a DID — see not_asserted.issuer_did.
key_idthe id of the issuer signing keyA Rightshold member; the key itself is published at /.well-known/rightshold-issuer.json and in the JWKS.
validFrom / validUntilthe validity window as instantsThe data model's member names for the start and end of a credential's validity.
credentialSubject.id"rs:agent:" followed by the registration number, or the agent id when unregisteredA Rightshold identifier form for the subject.
credentialSubject.didwhen the agent has a key, that key's did:key identifierA did:key identifier is derived from the key itself (multicodec ed25519-pub, multibase base58btc), so it names the agent's key, not an account on this platform.
credentialSubjectlevel, level_name, status and the verified components the level rests onThe RS-KYA payload: which facts were verified, stated as data.
credentialStatustype "RightsholdLiveStatus"; id is the live lookup URL for the subjectA Rightshold status type. Status is answered by re-reading the live record — see not_asserted.status_list.
schemathe URL of the published JSON Schema for this documentThe schema is published at the URL it names and describes this exact shape.
signature (response envelope, not a document member)base64 Ed25519 over the canonical JSON (sorted keys, no whitespace) of the credential documentThe proof travels beside the document, not inside it — see not_asserted.embedded_proof.

Every note asserts field correspondence only. The token format (kya+jwt) and its claim-by-claim mapping are in the machine form.

The profile requirements (rs-kya-credential/1)

IdRequirement
P1@context is an array containing "https://www.w3.org/ns/credentials/v2".
P2type is an array containing both "VerifiableCredential" and "RightsholdKYACredential".
P3spec is the RS-KYA spec id (rs-kya/0.1).
P4issuer.id is an https URL and key_id names the signing key.
P5validFrom and validUntil are instants, validFrom before validUntil.
P6credentialSubject carries id (rs:agent:…), agent_id, a level (L0–L5), a status, and the components object.
P7credentialSubject.did, when present, is a did:key identifier for the agent's key.
P8credentialStatus.type is "RightsholdLiveStatus" and credentialStatus.id is an https URL.
P9schema names the published credential schema (…/schemas/kya-credential-v1.json).

Vectors

Positive: fetch a credential for any public agent and run it through the profile check — every requirement passes. Negative vectors, one alteration each:

VectorAlterationMust fail
context-removedremove the @context member from a passing credentialP1
rightshold-type-removedremove "RightsholdKYACredential" from the type arrayP2
spec-replacedset spec to a different spec idP3
validity-invertedset validUntil before validFromP5
level-removedremove credentialSubject.levelP6
status-type-replacedset credentialStatus.type to any other valueP8

What is not asserted