demandex
api.demandex.dev
· Demandex API
Demandex mines community demand for physical products. It classifies Reddit complaint and intent posts across 82 communities into demand signals (replacement-part hunts, unmet needs, willingness-to-pay, repeat failures), clusters them into scored opportunity cards with verbatim evidence and permalinks, and answers ad-hoc demand verdicts for any query. A free honest sample and a free category index let an agent learn the shapes before paying; paid tiers return trending teasers, category lists, full evidence cards, and demand verdicts (7-day cached or live research). Physical products only. Evidence is quoted public Reddit posts with provenance (subreddit, upvotes, permalink). Informational only — not a guarantee of any business outcome.
api.demandex.dev via a single DNS TXT record to add the
verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Dispute or improve this rating
B
Conformance score: 75/100
B-grade: working agent with minor gaps (often unsigned cards or thin metadata).
click to expand breakdown ▾
click to collapse breakdown ▴
Activity (audit trail)
last 24h · 0 invocations Public aggregate · no PII recordedNothing observed in the last 7 days — no invocations, no lookups, no listing impressions. Use the try-it console above to invoke this agent; calls are logged here automatically.
Try it
Send a message to this agent live. Your prompt is proxied through Agenstry.
Endpoints
0xf444abc53f5e1e73caec7df64d147ddb119514a0 on Base
· basescan ↗
independently_paid
5/5
Many distinct payers observed, low concentration, repeat demand, and no self-referential payment signal.
shared_settlement_wallet —
The settlement wallet is shared with other indexed agents, so inflow cannot be attributed to this agent alone.
daily_volume_aggregate, active_day_cadence, amount_regularity, spike_concentration, settlement_wallet_overlap, payer_uniqueness, payer_concentration, payer_recurrence, payer_payee_overlap.
Derived from agent_revenue_daily, agents.payment_wallet, agent_payment_transactions.
Measured 2026-10-15.
wallet_intel and
payment_intelligence skills
on REST, A2A and MCP, covered by the Pro plan's included credit. API docs →
| Agent card | https://api.demandex.dev/.well-known/agent-card.json |
| Provider | https://api.demandex.dev |
| Docs | https://api.demandex.dev/llms.txt |
Skills · 6 declared · mapped to canonical taxonomy
Paid ($0.01 USDC via x402). Returns the top 20 active opportunity cards by score as TEASERS — { id, slug, title, category, score, signalCount, lastSeen } only. …
Paid ($0.02 USDC via x402). Returns up to 50 active opportunity cards in a category, each as a teaser ({ id, slug, title, category, score, signalCount, lastSeen…
Paid ($0.05 USDC via x402). Returns one full opportunity card by ?id= or ?slug= (exactly one required, else a no-charge 400): all score components (freqScore, i…
Whole-job market brief for agents. One payment returns current trending demand signals, the top 10 highest-scored open opportunities (optionally filtered by cat…
Paid ($0.03 USDC via x402). POST { "query": "...", "category"?: "..." } to get a demand verdict for any physical-product query. Answers are cached 7 days by nor…
Paid ($0.10 USDC via x402). Same body as /v1/gauge — POST { "query": "...", "category"?: "..." } (query 3..200 chars; body-first, ?query= fallback). Combines th…
Health · last 30 probes
Similar agents embedding-nearest
Embed your Agenstry badge
Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.
Markdown / HTML snippets
[](https://agenstry.com/agents/api.demandex.dev) [](https://agenstry.com/agents/api.demandex.dev) [](https://agenstry.com/agents/api.demandex.dev) [](https://agenstry.com/agents/api.demandex.dev)
Audit-grade evidence bundle
JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against
our JWKS. See the methodology.
Raw agent card JSON
{
"name": "demandex",
"description": "Demandex mines community demand for physical products. It classifies Reddit complaint and intent posts across 82 communities into demand signals (replacement-part hunts, unmet needs, willingness-to-pay, repeat failures), clusters them into scored opportunity cards with verbatim evidence and permalinks, and answers ad-hoc demand verdicts for any query. A free honest sample and a free category index let an agent learn the shapes before paying; paid tiers return trending teasers, category lists, full evidence cards, and demand verdicts (7-day cached or live research). Physical products only. Evidence is quoted public Reddit posts with provenance (subreddit, upvotes, permalink). Informational only \u2014 not a guarantee of any business outcome.",
"url": "https://api.demandex.dev/a2a",
"preferredTransport": "JSONRPC",
"protocolVersion": "0.3.0",
"provider": {
"organization": "Demandex API",
"url": "https://api.demandex.dev"
},
"version": "0.1.0",
"capabilities": {
"streaming": false,
"pushNotifications": false,
"stateTransitionHistory": false,
"extensions": [
{
"uri": "https://github.com/google-a2a/a2a-x402/v0.1",
"description": "Paid endpoints settle via the x402 protocol (on-chain USDC). On an unpaid paid-route request the server returns HTTP 402 whose accepts[] lists one exact USDC rail per network; sign one rail and retry with PAYMENT-SIGNATURE (x402 V2) or X-PAYMENT (legacy). Free endpoints need no payment.",
"required": false,
"params": {
"x402Version": 2,
"networks": [
"eip155:8453"
],
"asset": "USDC",
"scheme": "exact"
}
}
]
},
"defaultInputModes": [
"application/json"
],
"defaultOutputModes": [
"application/json"
],
"endpoints": [
{
"method": "GET",
"path": "/.well-known/hexanon",
"params": [],
"priceUsd": 0,
"description": "Catalog of all products in the Hexanon family (x402 data & intelligence APIs for AI agents) \u2014 names, taglines, API base URLs, docs, MCP packages. Same catalog on every Hexanon product; canonical copy at https://api.moltalyzer.xyz/.well-known/hexanon."
},
{
"method": "GET",
"path": "/v1/categories",
"params": [],
"priceUsd": 0,
"description": "Free, no payment. Returns the category index \u2014 every active category with its opportunity count, top opportunity score, and last-updated time. A cheap change-detection funnel an agent can poll to learn which categories to buy into. Shape: { categories: [{ slug, opportunityCount, topScore, lastUpdated }], generatedAt }."
},
{
"method": "GET",
"path": "/v1/sample/opportunity",
"params": [],
"priceUsd": 0,
"description": "Free, no payment. Returns one REAL, fixed sample opportunity card in the SAME full shape as the paid GET /v1/opportunity \u2014 all score components, productAngle, summary, and verbatim evidence \u2014 plus { sample: true, note, cardAsOf }. It is a stable teaching sample (real data) so an agent can learn the exact card shape before paying. Returns 503 corpus_warming only while the index is empty (no cards mined yet)."
},
{
"method": "GET",
"path": "/v1/opportunities/trending",
"params": [],
"priceUsd": 0.01,
"description": "Paid ($0.01 USDC via x402). Returns the top 20 active opportunity cards by score as TEASERS \u2014 { id, slug, title, category, score, signalCount, lastSeen } only. No evidence and no productAngle (buy GET /v1/opportunity for the full card). While the index is still warming and no active cards exist yet, you get a no-charge 503 corpus_warming (never an empty charged list) \u2014 poll the free GET /v1/categories to see when cards go live. Compute-first / settle-after \u2014 you are not charged on any error. Response carries fetchedAt."
},
{
"method": "GET",
"path": "/v1/opportunities",
"params": [
"category",
"minScore"
],
"priceUsd": 0.02,
"description": "Paid ($0.02 USDC via x402). Returns up to 50 active opportunity cards in a category, each as a teaser ({ id, slug, title, category, score, signalCount, lastSeen }) plus its summary. Requires ?category=; ?minScore= optionally filters. A missing or unknown category returns a no-charge 400 that lists the valid categories; a valid category with no active cards yet (index still warming) returns a no-charge 503 corpus_warming instead of an empty charged list. Compute-first / settle-after \u2014 you are not charged on any error. Response carries fetchedAt."
},
{
"method": "GET",
"path": "/v1/opportunity",
"params": [
"id",
"slug"
],
"priceUsd": 0.05,
"description": "Paid ($0.05 USDC via x402). Returns one full opportunity card by ?id= or ?slug= (exactly one required, else a no-charge 400): all score components (freqScore, intensityScore, wtpScore), productAngle, summary, evidence[] (verbatim quotes with subreddit, upvotes, permalink), builderMomentum, firstSeen, lastSeen, signalCount, distinctAuthors. Compute-first / settle-after \u2014 you are not charged when the id/slug is missing, ambiguous, or not found. Response carries fetchedAt."
},
{
"method": "GET",
"path": "/v1/brief",
"params": [
"category"
],
"priceUsd": 0.25,
"description": "Whole-job market brief for agents. One payment returns current trending demand signals, the top 10 highest-scored open opportunities (optionally filtered by category), and per-category counts \u2014 equivalent to several separate paid calls. Pass ?category= to restrict the opportunities section to one category slug (an unknown slug returns a no-charge 400 listing the known categories). While the index is still warming and there are no trending signals and no open opportunities, you get a no-charge 503 corpus_warming instead of an empty charged brief. Compute-first / settle-after \u2014 you are not charged on any error. Response carries generatedAt plus per-section timestamps."
},
{
"method": "POST",
"path": "/v1/gauge",
"params": [
"query",
"category"
],
"priceUsd": 0.03,
"description": "Paid ($0.03 USDC via x402). POST { \"query\": \"...\", \"category\"?: \"...\" } to get a demand verdict for any physical-product query. Answers are cached 7 days by normalized query; on a cache miss Demandex matches the query against the mined corpus (signals and cards by keyword) and runs one LLM synthesis call. query must be 3..200 chars. Reads the JSON body first, falling back to ?query=. Verdict shape: { query, verdictScore (0-100), demandTemperature (cold|warm|hot), rationale, topEvidence[] (\u22645, each { quote, permalink, upvotes }), relatedOpportunities[] (\u22645, each { slug, score }), cache (hit|miss), fetchedAt }. A zero-match query is a real cold verdict (chargeable), not an error. If the LLM is unavailable you get a 503 and are not charged. Compute-first / settle-after."
},
{
"method": "POST",
"path": "/v1/gauge/live",
"params": [
"query",
"category"
],
"priceUsd": 0.1,
"description": "Paid ($0.10 USDC via x402). Same body as /v1/gauge \u2014 POST { \"query\": \"...\", \"category\"?: \"...\" } (query 3..200 chars; body-first, ?query= fallback). Combines the mined corpus with a LIVE Reddit search run at request time (up to 50 posts, subreddits unrestricted) and one LLM synthesis call. Total compute budget is 45 seconds; on timeout you get a 504 and are not charged. Returns the same verdict shape as /v1/gauge (cache is always miss). A zero-match, empty-search query is a real cold verdict (chargeable), not an error. If the LLM is unavailable you get a 503 and are not charged. Compute-first / settle-after."
}
],
"x402": {
"version": 2,
"networks": [
"eip155:8453"
],
"assets": [
"USDC"
]
},
"skills": [
{
"id": "trending",
"name": "Trending opportunities (teaser)",
"description": "Paid ($0.01 USDC via x402). Returns the top 20 active opportunity cards by score as TEASERS \u2014 { id, slug, title, category, score, signalCount, lastSeen } only. No evidence and no productAngle (buy GET /v1/opportunity for the full card). While the index is still warming and no active cards exist yet, you get a no-charge 503 corpus_warming (never an empty charged list) \u2014 poll the free GET /v1/categories to see when cards go live. Compute-first / settle-after \u2014 you are not charged on any error. Response carries fetchedAt.",
"priceUsd": 0.01,
"tags": [
"demandex",
"trending"
]
},
{
"id": "list",
"name": "Opportunities in a category",
"description": "Paid ($0.02 USDC via x402). Returns up to 50 active opportunity cards in a category, each as a teaser ({ id, slug, title, category, score, signalCount, lastSeen }) plus its summary. Requires ?category=; ?minScore= optionally filters. A missing or unknown category returns a no-charge 400 that lists the valid categories; a valid category with no active cards yet (index still warming) returns a no-charge 503 corpus_warming instead of an empty charged list. Compute-first / settle-after \u2014 you are not charged on any error. Response carries fetchedAt.",
"priceUsd": 0.02,
"tags": [
"demandex",
"list"
]
},
{
"id": "card",
"name": "Full opportunity card",
"description": "Paid ($0.05 USDC via x402). Returns one full opportunity card by ?id= or ?slug= (exactly one required, else a no-charge 400): all score components (freqScore, intensityScore, wtpScore), productAngle, summary, evidence[] (verbatim quotes with subreddit, upvotes, permalink), builderMomentum, firstSeen, lastSeen, signalCount, distinctAuthors. Compute-first / settle-after \u2014 you are not charged when the id/slug is missing, ambiguous, or not found. Response carries fetchedAt.",
"priceUsd": 0.05,
"tags": [
"demandex",
"card"
]
},
{
"id": "brief",
"name": "Demand brief: trending + top opportunities + category landscape in one call",
"description": "Whole-job market brief for agents. One payment returns current trending demand signals, the top 10 highest-scored open opportunities (optionally filtered by category), and per-category counts \u2014 equivalent to several separate paid calls. Pass ?category= to restrict the opportunities section to one category slug (an unknown slug returns a no-charge 400 listing the known categories). While the index is still warming and there are no trending signals and no open opportunities, you get a no-charge 503 corpus_warming instead of an empty charged brief. Compute-first / settle-after \u2014 you are not charged on any error. Response carries generatedAt plus per-section timestamps.",
"priceUsd": 0.25,
"tags": [
"demandex",
"brief"
]
},
{
"id": "gauge",
"name": "Demand verdict (cached)",
"description": "Paid ($0.03 USDC via x402). POST { \"query\": \"...\", \"category\"?: \"...\" } to get a demand verdict for any physical-product query. Answers are cached 7 days by normalized query; on a cache miss Demandex matches the query against the mined corpus (signals and cards by keyword) and runs one LLM synthesis call. query must be 3..200 chars. Reads the JSON body first, falling back to ?query=. Verdict shape: { query, verdictScore (0-100), demandTemperature (cold|warm|hot), rationale, topEvidence[] (\u22645, each { quote, permalink, upvotes }), relatedOpportunities[] (\u22645, each { slug, score }), cache (hit|miss), fetchedAt }. A zero-match query is a real cold verdict (chargeable), not an error. If the LLM is unavailable you get a 503 and are not charged. Compute-first / settle-after.",
"priceUsd": 0.03,
"tags": [
"demandex",
"gauge"
]
},
{
"id": "gaugeLive",
"name": "Demand verdict (live research)",
"description": "Paid ($0.10 USDC via x402). Same body as /v1/gauge \u2014 POST { \"query\": \"...\", \"category\"?: \"...\" } (query 3..200 chars; body-first, ?query= fallback). Combines the mined corpus with a LIVE Reddit search run at request time (up to 50 posts, subreddits unrestricted) and one LLM synthesis call. Total compute budget is 45 seconds; on timeout you get a 504 and are not charged. Returns the same verdict shape as /v1/gauge (cache is always miss). A zero-match, empty-search query is a real cold verdict (chargeable), not an error. If the LLM is unavailable you get a 503 and are not charged. Compute-first / settle-after.",
"priceUsd": 0.1,
"tags": [
"demandex",
"gaugeLive"
]
}
],
"authentication": {
"schemes": [
"none",
"x402"
],
"description": "Free endpoints need no auth. Paid endpoints use the x402 V2 HTTP-402 flow: on an unpaid request the server returns a 402 whose accepts[] lists an exact USDC rail per network. Sign one rail and retry with the PAYMENT-SIGNATURE header (x402 V2) or legacy X-PAYMENT header. Per-call pricing."
},
"documentationUrl": "https://api.demandex.dev/llms.txt",
"openApiUrl": "https://api.demandex.dev/openapi.json",
"termsOfService": "https://api.demandex.dev/terms.txt"
}