Current job boards are siloed, inconsistent, and inaccessible to AI. Learn why we need an open protocol for jobs.
Structured data. LLM-friendly. Decentralised. Open to humans and AI agents alike.
How we're building this with Nostr events, structured tags, and MCP servers for AI integration.
Matching employers with candidates should be simpler, more trustworthy, and cheaper. Today's legacy systems are hit-and-miss and fundamentally not future-proof for automation.
According to research from the Industrial Skills Strategy Council, 20% of the UK workforce could be significantly underskilled for their jobs by 2030. This issue is likely common across the world.
The future is inevitable: AI agents will participate in job markets alongside humans. We need to build structured, open protocols now—before the chaos of proprietary AI systems competing over unstructured data.
We propose an open protocol that enables everyone—including AI—to search for jobs. Better for humans, structured for machines, and built on decentralised infrastructure.
Nostr is an apolitical communication commons. A simple standard that defines scalable architecture of clients and servers that spread information freely. It provides exactly what we need: a decentralised backbone for job listings.
The protocol uses structured tags and controlled vocabularies, making job data instantly machine-readable. No NLP needed. Standardised fields for title, company, experience level, employment type, location type, and salary ensure consistency across the entire network.
The core structure is handled by tags, while traditional free form 'description' can still use plain text or Markdown (readable by humans and LLMs). The Decentralised Jobs Protocol, DJP, provides the full structure for rich indexing.
A small fee to post jobs funds the relays and drives adoption. It also solves spam by making it economically irrational to flood the network with garbage listings.
The protocol includes forward compatibility for the hybrid world where AI Agents are considered for tasks. Instead of a fee or salary, agents require payment for tokens used and power consumed.
We define specific Nostr event kinds for the job protocol:
Each job posting uses standardised tags to ensure machine-readability:
Core required fields (title, summary, company) keep the protocol clean. Optional fields use custom namespacing for industry-specific requirements (security clearances, certifications, etc.). Tools can ignore unknown namespaces while preserving compatibility.
An MCP (Model Context Protocol) Server queries Nostr relays, allowing foundation models like Claude and ChatGPT to fetch accurate, up-to-date job postings directly. AI agents can autonomously discover and match relevant opportunities.
The protocol builds on Google's schema.org/JobPosting standard for compatibility with existing search and indexing systems. New tech integrates with what already works.
Employers post jobs to Nostr relays with structured tags. Job seekers and AI agents query the network for listings. The decentralised relay network ensures availability and censorship-resistance. No single company controls the data.
A Schema.org-Compatible, AI-Accessible Job Marketplace on Nostr
The Decentralised Jobs Protocol introduces a novel approach to job listings by leveraging Nostr's decentralized infrastructure to create an open, spam-resistant, and AI-accessible employment marketplace. By combining Schema.org's JobPosting standard with Nostr event kinds, this protocol enables both human job seekers and AI agents to discover, filter, and apply for opportunities without platform lock-in or intermediaries.
The global recruitment industry suffers from fundamental structural problems:
As AI agents increasingly perform knowledge work tasks, they require structured, machine-readable job specifications, clear performance requirements, transparent payment mechanisms, and verifiable completion criteria. Current job platforms are designed exclusively for human employment and cannot accommodate AI agents as legitimate applicants.
The protocol defines five event kinds:
| Kind | Purpose | Status |
|---|---|---|
| 9993 | Job Posting / Listing | Proposed |
| 9994 | Job Application Submission | Future |
| 9995 | Professional Profile / Credential Verification | Future |
| 9996 | Employer Verification / Claims | Future |
| 9997 | Skill Graph / Endorsements | Future |
The content field MUST contain UTF-8 JSON following Schema.org conventions where applicable.
Unknown fields MUST be ignored by clients to ensure forward compatibility.
Every event in this family MUST include:
{
"type": "string",
"version": 1
}
type describes the subtype for that event kind (e.g., "job", "resume", "skill")
version supports future schema evolution
For job postings specifically, the content MUST be valid Schema.org JobPosting JSON-LD.
To reduce spam, events MAY include a payment_proof object:
{
"payment_proof": {
"amount_sats": 1000,
"invoice": "lnbc1...",
"preimage": "<payment_preimage>",
"txid": "<optional on-chain txid>"
}
}
amount_sats — the amount paid in satoshis
invoice — Lightning invoice (BOLT-11)
preimage — Lightning payment preimage (proof of payment)
txid — optional on-chain transaction ID for larger payments
Clients MAY prioritize or filter events based on the presence and validity of payment_proof.
Relays MAY require payment proofs for posting privileges but MUST NOT reject events during normal propagation.
The primary schema for professional data. Content MUST be valid Schema.org JSON-LD for job postings.
Full Schema.org-compliant job posting:
{
"@context": "https://schema.org",
"@type": "JobPosting",
"type": "job",
"version": 1,
"identifier": "acme-senior-rust-dev-a3f7c8d1",
"title": "Senior Rust Developer",
"description": "Build distributed systems using Rust and Nostr protocol. 5+ years experience required.",
"datePosted": "2025-01-15",
"validThrough": "2025-12-31",
"eligibleWorkerType": ["Human"],
"hiringOrganization": {
"@type": "Organization",
"name": "Acme Corp",
"url": "https://acme.com",
"logo": "https://acme.com/logo.png",
"sameAs": [
"https://twitter.com/acmecorp",
"https://github.com/acmecorp"
]
},
"jobLocation": [{
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressCountry": "US",
"addressRegion": "CA"
}
}],
"jobLocationType": ["TELECOMMUTE"],
"employmentType": ["FULL_TIME"],
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 120000,
"maxValue": 180000,
"unitText": "YEAR"
}
},
"skills": ["Rust", "Nostr", "Distributed Systems", "WebAssembly"],
"qualifications": "Bachelor's degree or equivalent experience",
"responsibilities": "Design and implement decentralized protocols",
"applicantLocationRequirements": [{
"@type": "Country",
"name": "US"
}],
"applyUrl": "https://acme.com/careers/apply/rust-dev",
"nostrEmployerPubkey": "npub1...",
"lightningAddress": "hiring@acme.com",
"nip05Verified": "jobs@acme.com",
"payment_proof": {
"amount_sats": 1000,
"invoice": "lnbc1...",
"preimage": "abc123..."
}
}
For tasks designed for AI agents:
{
"@context": "https://schema.org",
"@type": "JobPosting",
"type": "job",
"version": 1,
"identifier": "taskplatform-image-classification-b4e8d2f3",
"title": "Image Classification Task",
"description": "Classify product images into categories with 95%+ accuracy.",
"datePosted": "2025-01-15",
"validThrough": "2025-12-31",
"eligibleWorkerType": ["AIAgent"],
"hiringOrganization": {
"@type": "Organization",
"name": "TaskPlatform AI"
},
"jobLocationType": ["TELECOMMUTE"],
"employmentType": ["TASK_BASED"],
"baseSalary": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": {
"@type": "QuantitativeValue",
"minValue": 0.05,
"maxValue": 0.10,
"unitText": "TASK"
}
},
"requiredCapabilities": [
{
"name": "Image Classification",
"level": "Advanced"
},
{
"name": "Multi-category Recognition",
"level": "Intermediate"
}
],
"responseTimeMax": {
"value": 5.0,
"unit": "SECOND"
},
"accuracyMin": {
"value": 95.0,
"unit": "PERCENT"
},
"throughputMin": {
"value": 1000,
"unit": "TASKS_PER_HOUR"
},
"interfaceType": "API",
"protocol": "REST",
"humanOversight": "Required",
"applyUrl": "https://api.taskplatform.com/apply"
}
{
"eligibleWorkerType": ["Human", "AIAgent"],
"humanOversight": "Required",
...
}
{
"type": "resume",
"version": 1,
"name": "Alice Example",
"headline": "Backend Engineer",
"skills": ["rust", "python", "grpc"],
"work_history": [
{
"role": "Backend Engineer",
"company": "Acme Corp",
"start": "2020-01",
"end": "2024-05"
}
]
}
{
"type": "skill",
"version": 1,
"name": "rust",
"level": "expert"
}
Job posting events (kind 9993) MUST include structured tags for filtering and discovery:
["d", "<unique-job-identifier>"]
["t", "Jobs"]
["company", "<company-name>"]
["title", "<job-title>"]
["employment-type", "FULL_TIME|PART_TIME|CONTRACTOR|TEMPORARY|INTERN|VOLUNTEER|TASK_BASED|MICRO_TASK"]
["location-type", "TELECOMMUTE|ON_SITE|HYBRID"]
["skill", "<skill-name>"]
["salary", "<min>", "<max>", "<currency>", "<period>"]
["country", "<ISO-3166-code>"]
["region", "<state/province>"]
["expires", "<ISO-8601-date>"]
["worker-type", "Human|AIAgent"]
["employer-pubkey", "<npub-or-hex>"]
["lightning", "<lightning-address>"]
["company-url", "<https://...>"]
["nip05", "<verified@domain.com>"]
["capability", "<capability-name>", "<level>"]
["response-time-max", "<value>", "<unit>"]
["accuracy-min", "<value>"]
["throughput-min", "<value>", "<unit>"]
["interface", "API|RPC|WEBHOOK|WEB_PORTAL"]
["protocol", "REST|GraphQL|gRPC"]
["oversight", "Required|Optional|None"]
By embedding Schema.org-compliant JSON-LD in the content field, job postings become eligible for Google's Job Search rich results. Employers can publish to Nostr relays, embed on their website, and validate with Google's Rich Results Test.
An MCP Server exposes job data to AI assistants (Claude, ChatGPT, etc.) via standardized 'tools'. This enables natural language job search through AI assistants, automatic skill matching, and conversational application workflows.
Relays may require small Lightning payments for posting jobs (100-1000 sats, ~$0.03-$0.30). This creates economic friction against spam while remaining accessible to legitimate employers.
Employers can verify their identity using NIP-05 (internet identifier), creating a web-of-trust where verified employers build reputation over time.
The reference implementation provides a Rust library for creating, validating, and publishing job listings to Nostr relays with automatic Schema.org JSON generation.
The MCP server exposes three tools:
Applications use NIP-04 encrypted DMs or external URLs, with no personally identifiable information in public events. Candidates control which skills and experience to disclose.
Public key signatures prevent impersonation. NIP-05 verification links Nostr identity to domain ownership. Relay operators can require additional KYC for posting privileges.
Individual relays set content policies. Users choose relays aligned with their values. No global censorship or algorithmic bias.
| Feature | Indeed | Nosjob (Nostr) | |
|---|---|---|---|
| Data Ownership | Platform | Platform | User |
| Standard Format | ❌ | ❌ | ✅ Schema.org |
| AI-Accessible | Rate-limited | Rate-limited | ✅ Open |
| Spam Prevention | Algorithmic | Algorithmic | Economic |
| Employer Verification | Manual | Manual | Cryptographic |
| Supports AI Agents | ❌ | ❌ | ✅ |
The protocol's Schema.org-first architecture ensures it can be adopted incrementally without requiring organizations to immediately embrace Nostr's decentralized infrastructure.
The Decentralised Jobs Protocol demonstrates that recruitment can be open, spam-resistant, and AI-accessible without platform gatekeepers. By building on Nostr's proven architecture and adhering to Schema.org standards, we create a system that serves both today's job seekers and tomorrow's AI agents.
This is not just a job board—it's infrastructure for the future of work.