Working with NIP-19 Identifiers
NDK provides comprehensive support for NIP-19 identifiers (npub, nprofile, nevent, etc.), both for encoding/decoding data and for working with NDK entities.
Direct NIP-19 Utilities
NDK re-exports all NIP-19 utilities from nostr-tools for lightweight data conversion without needing to instantiate NDK objects:
typescript
import { nip19 } from '@nostr-dev-kit/ndk';
// Encoding
const npub = nip19.npubEncode(pubkey);
const nsec = nip19.nsecEncode(privateKey);
const note = nip19.noteEncode(eventId);
// Encoding with metadata
const nprofile = nip19.nprofileEncode({
pubkey: "hexPubkey",
relays: ["wss://relay1.example.com", "wss://relay2.example.com"]
});
const nevent = nip19.neventEncode({
id: eventId,
relays: ["wss://relay.example.com"],
author: authorPubkey
});
const naddr = nip19.naddrEncode({
kind: 30023,
pubkey: authorPubkey,
identifier: "article-slug",
relays: ["wss://relay.example.com"]
});
// Decoding
const decoded = nip19.decode("npub1...");
console.log(decoded.type); // "npub"
console.log(decoded.data); // hex pubkey
// Type-specific decoding
if (decoded.type === 'nprofile') {
console.log(decoded.data.pubkey);
console.log(decoded.data.relays);
}Creating NDK Users from NIP-19
The ndk.fetchUser() method accepts NIP-19 encoded strings directly, automatically detecting and decoding the format:
typescript
import NDK from '@nostr-dev-kit/ndk';
const ndk = new NDK({ /* ... */ });
// From npub
const user1 = await ndk.fetchUser("npub1n0sturny6w9zn2wwexju3m6asu7zh7jnv2jt2kx6tlmfhs7thq0qnflahe");
// From nprofile (includes relay hints)
const user2 = await ndk.fetchUser("nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p");
// From hex pubkey
const user3 = await ndk.fetchUser("3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d");
// From NIP-05 identifier
const user4 = await ndk.fetchUser("pablo@test.com");
const user5 = await ndk.fetchUser("test.com"); // Uses _@test.com
// Note: fetchUser is async and returns a Promise<NDKUser | undefined>
// For NIP-05 lookups, it may return undefined if the address cannot be resolvedEncoding NDK Events
NDK events have a built-in encode() method that automatically determines the appropriate NIP-19 format:
typescript
const event = new NDKEvent(ndk);
event.kind = 1;
event.content = "Hello Nostr!";
await event.sign();
// Automatically chooses the right format:
// - naddr for parameterized replaceable events
// - nevent for events with relay information
// - note for simple note references
const encoded = event.encode();
// Control relay hints
const encodedWith5Relays = event.encode(5); // Include up to 5 relay hintsWorking with Private Keys
The NDKPrivateKeySigner can be instantiated with an nsec:
typescript
import { NDKPrivateKeySigner } from '@nostr-dev-kit/ndk';
// From nsec
const signer = new NDKPrivateKeySigner("nsec1...");
// From hex private key
const signer2 = new NDKPrivateKeySigner("hexPrivateKey");Common Use Cases
Converting between formats
typescript
import { nip19 } from '@nostr-dev-kit/ndk';
// Convert hex pubkey to npub
function hexToNpub(hexPubkey: string): string {
return nip19.npubEncode(hexPubkey);
}
// Extract pubkey from any NIP-19 identifier
function extractPubkey(nip19String: string): string | undefined {
const decoded = nip19.decode(nip19String);
switch (decoded.type) {
case 'npub':
return decoded.data;
case 'nprofile':
return decoded.data.pubkey;
case 'naddr':
return decoded.data.pubkey;
case 'nevent':
return decoded.data.author;
default:
return undefined;
}
}Sharing content with relay hints
typescript
// Create shareable event reference with relay hints
const event = await ndk.fetchEvent({ id: eventId });
const shareableLink = event.encode(3); // Include up to 3 relay hints
// Create user profile reference with relays
const user = ndk.getUser({ pubkey: userPubkey });
const nprofile = nip19.nprofileEncode({
pubkey: user.pubkey,
relays: ["wss://relay.damus.io", "wss://nos.lol"]
});Validating NIP-19 strings
typescript
import { nip19 } from '@nostr-dev-kit/ndk';
function isValidNip19(str: string): boolean {
try {
nip19.decode(str);
return true;
} catch {
return false;
}
}
function isNpub(str: string): boolean {
try {
const decoded = nip19.decode(str);
return decoded.type === 'npub';
} catch {
return false;
}
}Best Practices
- Use NIP-19 for user-facing displays: Always show npub/nprofile to users instead of hex pubkeys
- Include relay hints for better discovery: When sharing events or profiles, include 2-3 relay hints
- Handle decoding errors: Always wrap
nip19.decode()in try-catch blocks - Use the right tool:
- Use
nip19utilities for pure data conversion - Use
ndk.getUser()when you need an NDK User object - Use
event.encode()for encoding existing NDK events
- Use