This document defines the Signet application profile for NIP-VA attestations. It covers domain-specific tags for identity verification, registry cross-referencing, and institution discovery via .well-known/signet.json.
This profile is maintained by the Signet project and is not part of the NIP-VA base protocol.
The following tags extend kind 31000 attestations for identity verification and professional licensing use cases. They are OPTIONAL and carried alongside the base NIP-VA tags.
| Tag | Value | Description |
|---|---|---|
active-since |
<unix-timestamp> |
When the verifier became professionally active (e.g. date of qualification or registration). SHOULD reflect the professional start date, not the Nostr event creation date. Cross-referenceable against professional registers. |
registry |
<authority>, <id> |
Cleartext regulatory registry reference (e.g. ["registry", "sra", "123456"]). Distinct from the licence tag, which stores a hash. |
registry-url |
<URL> |
Optional direct URL to the verifier's public registry entry (e.g. ["registry-url", "https://www.sra.org.uk/consumers/register/123456/"]). Companion to registry. |
Verifiers SHOULD NOT be penalised in scoring or display for omitting the registry tag. Clients MUST NOT treat absence of a registry tag as a negative signal. This prevents coercion -- verifiers who cannot or choose not to disclose their registry ID must not suffer reduced trust.
Applications using NIP-VA for identity verification MAY publish institution metadata and staff rosters via https://<domain>/.well-known/signet.json. This enables domain-anchored trust: a credential issued by a pubkey listed in a regulated institution's signet.json inherits trust from the institution's verified domain.
{
"version": 1,
"name": "Acme Legal LLP",
"pubkeys": [
{
"id": "key-2026-01",
"pubkey": "<64-char hex secp256k1 x-only pubkey>",
"label": "Primary Verification Key",
"created": "2026-01-01T00:00:00Z"
}
],
"relay": "wss://relay.example.com",
"policy": { "rotation": "annual", "contact": "security@acmelegal.com" }
}Version 2 extends version 1 with entity type, registry cross-referencing, and staff pubkeys:
{
"version": 2,
"name": "Baker & Co Solicitors",
"entity": "juridical_person",
"registry": {
"authority": "sra",
"id": "654321",
"url": "https://www.sra.org.uk/consumers/register/organisation/?sraNumber=654321"
},
"pubkeys": [
{
"id": "firm-key-2026",
"pubkey": "<64-char hex secp256k1 x-only pubkey>",
"label": "Firm Verification Key",
"created": "2026-01-15T00:00:00Z"
}
],
"staff": [
{
"pubkey": "<64-char hex>",
"name": "Jane Smith",
"role": "solicitor",
"registry": { "authority": "sra", "id": "123456" }
}
],
"relay": "wss://relay.example.com",
"policy": { "rotation": "annual", "contact": "compliance@bakerco.co.uk" }
}| Field | Type | Description |
|---|---|---|
entity |
string | Entity type: juridical_person or juridical_persona |
registry |
object | Regulatory body and registration ID for the institution |
registry.authority |
string | Registry identifier (e.g. sra, gmc, gdc, arb, ofsted, companies-house) |
registry.id |
string | The institution's registration ID on that registry |
registry.url |
string | Optional: direct URL to the institution's public registry entry |
staff |
array | Array of verified individuals at this institution |
staff[].pubkey |
string | 64-char hex secp256k1 x-only pubkey of the staff member |
staff[].name |
string | Display name (for human cross-referencing) |
staff[].role |
string | Role at the institution (e.g. solicitor, gp, head-teacher) |
staff[].registry |
object | Optional: the individual's own registry entry |
- MUST use HTTPS -- HTTP is rejected.
versionMUST be1or2. Clients MUST accept version 1 documents.nameMUST be a non-empty string.pubkeysMUST be a non-empty array with at most 20 entries. Eachpubkeyvalue MUST be a 64-character lowercase hexadecimal string.- Version 1 documents MUST NOT exceed 10,240 bytes (10 KB).
- Version 2 documents MUST NOT exceed 102,400 bytes (100 KB) to accommodate large staff rosters.
entity, if present, MUST bejuridical_personorjuridical_persona.staff, if present, MUST be an array with at most 500 entries. Eachstaff[].pubkeyMUST be a 64-character lowercase hexadecimal string.
For jurisdictions where institutional domains carry regulatory weight, implementations SHOULD limit domain-anchor trust to domains under regulated suffixes:
.sch.uk-- schools.nhs.uk-- NHS organisations.ac.uk-- academic institutions.gov.uk-- government bodies
This is a RECOMMENDED heuristic, not a protocol requirement. Implementations targeting other jurisdictions SHOULD define their own restricted domain lists.
Clients MAY cache the response for up to 24 hours. Clients SHOULD warn the user if the set of pubkeys changes unexpectedly between fetches (potential key compromise or rotation).