Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,9 @@ The scoring engine indexes x402 settlements on-chain using the EIP-3009 `Authori
| `/v1/score/basic?wallet=0x…` | GET | Score, tier, confidence. 10 free calls/day. |
| `/v1/score/erc8004?wallet=0x…` | GET | ERC-8004-compatible reputation document with score, identity, certification, and publication status. |
| `/v1/certification/readiness?wallet=0x…` | GET | Check if a wallet can apply for certification, see blockers, and get the next step before paying. |
| `/v1/certification/directory` | GET | Public directory of active certifications with score context and evaluator/standards links. |
| `/v1/certification/review` | GET / POST | Submit a certification review request or inspect the latest reviewer status for a wallet. |
| `/v1/certification/directory?limit=&tier=&search=&sort=` | GET | Public directory of active certifications with score context, trust links, and search/sort filters. |
| `/directory` | GET | Trusted Endpoint Directory page for browsing certified agents in the browser. |
| `/v1/agent/register` | POST | Register your wallet. +10 identity bonus. |
| `/v1/score/compute` | POST | Queue background score computation. Returns jobId immediately. |
| `/v1/score/job/:jobId` | GET | Poll async job status (pending → complete). |
Expand Down
4 changes: 2 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ <h1>Score, certify, and evaluate <em>agent wallets before money moves.</em></h1>
<p class="hero-sub">DJD is evolving from a score API into trust infrastructure for the agent economy: free wallet scoring, public certification, standards-ready documents, evaluator previews, and x402 gating in one stack. Start with the score, then layer on directory distribution and settlement policy.</p>
<div class="hero-actions">
<a href="#lookup" class="btn btn-primary" data-track="cta_try_api">Try the live lookup</a>
<a href="/v1/certification/directory" class="btn btn-ghost" data-track="cta_certified_directory">Browse certified agents</a>
<a href="/directory" class="btn btn-ghost" data-track="cta_certified_directory">Browse certified agents</a>
<a href="#x402-path" class="btn btn-ghost" data-track="path_x402">See the x402 path</a>
</div>
<div class="hero-proof">
Expand Down Expand Up @@ -504,7 +504,7 @@ <h3>Register your agent</h3>
<h3>Browse the certified directory</h3>
<p>List active DJD-certified agents with current score tier, confidence, badges, profile metadata, and direct evaluator links.</p>
<div class="step-code">GET /v1/certification/directory</div>
<a class="step-link" href="/v1/certification/directory" data-track="path_certified_directory">Open the directory</a>
<a class="step-link" href="/directory" data-track="path_certified_directory">Open the directory</a>
</div>
<div class="step">
<div class="step-num">2</div>
Expand Down
175 changes: 172 additions & 3 deletions openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1980,6 +1980,72 @@
}
}
},
"/v1/certification/review": {
"get": {
"tags": ["certification"],
"summary": "Get certification review status",
"description": "Returns the latest certification review request and reviewer status for a wallet.",
"operationId": "getCertificationReview",
"parameters": [
{
"name": "wallet",
"in": "query",
"required": true,
"description": "Ethereum wallet address",
"schema": { "type": "string", "pattern": "^0x[0-9a-fA-F]{40}$" }
}
],
"responses": {
"200": {
"description": "Certification review returned",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/CertificationReviewResponse" }
}
}
},
"400": { "$ref": "#/components/responses/BadRequest" },
"404": { "$ref": "#/components/responses/NotFound" }
}
},
"post": {
"tags": ["certification"],
"summary": "Submit certification review request",
"description": "Creates a certification review request for an eligible wallet before the final certification purchase.",
"operationId": "submitCertificationReview",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/CertificationReviewRequest" }
}
}
},
"responses": {
"200": {
"description": "Existing pending certification review returned",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/CertificationReviewResponse" }
}
}
},
"201": {
"description": "Certification review request created",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/CertificationReviewResponse" }
}
}
},
"400": { "$ref": "#/components/responses/BadRequest" },
"409": {
"description": "Wallet already has an active certification",
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
}
}
}
},
"/v1/certification/directory": {
"get": {
"tags": ["certification"],
Expand All @@ -2000,6 +2066,24 @@
"required": false,
"description": "Filter to a specific certification tier",
"schema": { "type": "string" }
},
{
"name": "search",
"in": "query",
"required": false,
"description": "Filter by wallet, profile name, description, GitHub URL, or website URL",
"schema": { "type": "string" }
},
{
"name": "sort",
"in": "query",
"required": false,
"description": "Sort the directory by score, confidence, recency, or name",
"schema": {
"type": "string",
"enum": ["score", "confidence", "recent", "name"],
"default": "score"
}
}
],
"responses": {
Expand Down Expand Up @@ -3529,7 +3613,11 @@
"not_registered",
"score_missing",
"score_expired",
"score_too_low"
"score_too_low",
"review_pending",
"review_approved",
"review_needs_info",
"review_rejected"
]
},
"requirements": {
Expand Down Expand Up @@ -3561,6 +3649,21 @@
"granted_at": { "type": "string", "format": "date-time", "nullable": true },
"expires_at": { "type": "string", "format": "date-time", "nullable": true }
}
},
"review": {
"type": "object",
"properties": {
"exists": { "type": "boolean" },
"status": {
"type": "string",
"nullable": true,
"enum": ["pending", "approved", "needs_info", "rejected"]
},
"requested_at": { "type": "string", "format": "date-time", "nullable": true },
"reviewed_at": { "type": "string", "format": "date-time", "nullable": true },
"reviewed_by": { "type": "string", "nullable": true },
"review_note": { "type": "string", "nullable": true }
}
}
}
},
Expand Down Expand Up @@ -3605,11 +3708,71 @@
"certify_readiness": { "type": "string", "format": "uri" },
"certify_overview": { "type": "string", "format": "uri" },
"certified_directory": { "type": "string", "format": "uri" },
"apply_endpoint": { "type": "string", "format": "uri" }
"apply_endpoint": { "type": "string", "format": "uri" },
"review_status": { "type": "string", "format": "uri" }
}
}
}
},
"CertificationReviewRequest": {
"type": "object",
"required": ["wallet"],
"properties": {
"wallet": { "type": "string", "pattern": "^0x[0-9a-fA-F]{40}$" },
"note": { "type": "string", "maxLength": 500 }
}
},
"CertificationReviewResponse": {
"type": "object",
"properties": {
"id": { "type": "integer" },
"wallet": { "type": "string" },
"requested_by_wallet": { "type": "string" },
"status": {
"type": "string",
"enum": ["pending", "approved", "needs_info", "rejected"]
},
"requested_at": { "type": "string", "format": "date-time" },
"updated_at": { "type": "string", "format": "date-time" },
"reviewed_at": { "type": "string", "format": "date-time", "nullable": true },
"reviewed_by": { "type": "string", "nullable": true },
"requested_score": { "type": "integer" },
"requested_tier": { "type": "string" },
"requested_confidence": { "type": "number", "nullable": true },
"score_expires_at": { "type": "string", "format": "date-time", "nullable": true },
"request_note": { "type": "string", "nullable": true },
"review_note": { "type": "string", "nullable": true },
"current_score": {
"type": "object",
"properties": {
"score": { "type": "integer", "nullable": true },
"tier": { "type": "string", "nullable": true },
"confidence": { "type": "number", "nullable": true }
}
},
"profile": {
"type": "object",
"properties": {
"name": { "type": "string", "nullable": true },
"description": { "type": "string", "nullable": true },
"github_url": { "type": "string", "format": "uri", "nullable": true },
"website_url": { "type": "string", "format": "uri", "nullable": true },
"github_verified": { "type": "boolean" }
}
},
"links": {
"type": "object",
"properties": {
"agent_profile": { "type": "string", "format": "uri" },
"readiness": { "type": "string", "format": "uri" },
"review_status": { "type": "string", "format": "uri" },
"apply_endpoint": { "type": "string", "format": "uri" },
"certified_directory": { "type": "string", "format": "uri" }
}
},
"message": { "type": "string" }
}
},
"CertificationDirectoryResponse": {
"type": "object",
"properties": {
Expand All @@ -3618,9 +3781,15 @@
"type": "object",
"properties": {
"limit": { "type": "integer" },
"tier": { "type": "string", "nullable": true }
"tier": { "type": "string", "nullable": true },
"search": { "type": "string", "nullable": true },
"sort": {
"type": "string",
"enum": ["score", "confidence", "recent", "name"]
}
}
},
"total": { "type": "integer" },
"returned": { "type": "integer" },
"certifications": {
"type": "array",
Expand Down
4 changes: 4 additions & 0 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import certificationRoute from './routes/certification.js'
import certifyRoute from './routes/certify.js'
import clusterRoute from './routes/cluster.js'
import dataRoute from './routes/data.js'
import directoryRoute from './routes/directory.js'
import docsRoute from './routes/docs.js'
import economyRoute from './routes/economy.js'
import explorerRoute from './routes/explorer.js'
Expand All @@ -50,6 +51,7 @@ import pricingRoute from './routes/pricing.js'
import ratingsRoute from './routes/ratings.js'
import registerRoute from './routes/register.js'
import reportRoute from './routes/report.js'
import reviewerRoute from './routes/reviewer.js'
import scoreRoute from './routes/score.js'
import stakeRoute from './routes/stake.js'
import stripeWebhookRoute from './routes/stripeWebhook.js'
Expand Down Expand Up @@ -117,6 +119,7 @@ app.route('/v1/analytics', analyticsRoute)
app.route('/v1/agent/register', registerRoute)
app.route('/v1/badge', badgeRoute)
app.route('/explorer', explorerRoute)
app.route('/directory', directoryRoute)
app.route('/certify', certifyRoute)
app.route('/blog', blogRoute)
app.route('/agent', agentRoute)
Expand All @@ -126,6 +129,7 @@ app.route('/docs', docsRoute)
app.route('/metrics', metricsRoute)
app.route('/billing', billingRoute)
app.route('/portal', portalRoute)
app.route('/reviewer', reviewerRoute)
app.route('/pricing', pricingRoute)
app.route('/methodology', methodologyRoute)
app.route('/.well-known/x402', wellKnownRoute)
Expand Down
Loading