The API contract.
Three paid endpoints, one profile shape, one disclosure on every response. HTTP 402 → sign → retry. No human approval, no OAuth, no API keys.
Free vs. paid
| Path | Price | What you get |
|---|---|---|
GET /v1, /v1/stats, /llms.txt, /.well-known/*, /signal/pathways.json, all pages | free | Discovery: schema, live prices, aggregates, framework catalog |
POST /signal/employer-demand | free | Employers submit demand signals (unverified on arrival) |
POST /score/competence | $0.24 | Competence measure 0–4, grade, tier, six-metric breakdown, reasons, verification gate |
GET|POST /match/training-path | $0.24 | Ranked pathways: readiness, demand fit, uplift, missing prerequisites, competencies gained |
GET|POST /match/employer-demand | $0.24 | Ranked employer signals: fit, gaps, horizon, status |
GET /signal/demand.json | $0.24 (AI crawlers) · free (people, search engines) | The live demand catalog |
Priced on the portfolio ladder for a differentiated scored product. Live values are always in /v1 and /.well-known/x402.json; the numbers on this page are the defaults at publish time.
The 402 flow
1. POST /score/competence (no payment header)
← 402 Payment Required { x402Version, accepts: [{ scheme: "exact", network: "base", asset: USDC, maxAmountRequired, payTo, resource }] }
2. Sign the payment for the amount in accepts[0] (any x402 client; USDC on Base)
3. Retry with header X-PAYMENT: <base64 payment payload>
← 200 OK + X-PAYMENT-RESPONSE (settlement receipt) + JSON body below
Profile shape (all paid endpoints)
{
"competencies": [
{ "domain": "electrical", "skill": "conduit bending", "level": 3,
"evidence_type": "task", "recency_days": 30, "verification_tier": 2 },
{ "domain": "safety", "level": 3, "evidence_type": "assessment", "recency_days": 40, "verification_tier": 2 }
],
"demand_context": { "sector": "energy", "region": "US-NJ", "roles": ["solar installer"] }
}
level0–5: none · aware · assisted · independent · proficient · expertevidence_type: employer_attestation (1.00) · assessment (0.90) · task (0.85) · simulation (0.75) · portfolio (0.65) · self_report (0.35) — the number is the evidence strength applied to the levelverification_tier: 0 none · 1 partner-attested · 2 employer/assessor-attesteddemand_context.region: ISO country or country-region only (US,US-NJ) — never finer- Fields that describe a person (name, contact, age, gender, race, address, photo …) are stripped, reported in
stripped_fields, and never scored or logged
Response — POST /score/competence
{
"ok": true, "model_version": "tsc-v0.1.0",
"competence_score": 3.35, "grade": "A-", "tier": "Ready",
"confidence_score": 0.88, "verification_completeness": 1,
"breakdown": { "demonstrated_depth": { "value": 76, "weight": 0.2, "weighted_contribution": 0.608 }, "verification": {...}, "demand_alignment": {...}, "breadth": {...}, "recency": {...}, "trajectory": {...} },
"verification_gate": { "tier2_evidence_count": 3, "minimum_required": 3, "employer_grade": true },
"routing_eligible": true, "explainability": "full",
"reasons": [ { "code": "BRD-NARROW", "text": "Evidence covers fewer than two competency domains at an assisted level or above." } ],
"domains": ["electrical", "safety"], "matched_demand_signals": 2, "stripped_fields": [],
"calibration_status": "hypothesis — not yet calibrated against hiring or income outcomes",
"disclosure": "Analytical competence measure, model tsc-v0.1.0 … NOT an employment decision …"
}
The six metrics
| Metric | Weight | Meaning |
|---|---|---|
| demonstrated_depth | 0.20 | How far the strongest evidence goes (level × evidence strength), top three domains |
| verification | 0.20 | Share of evidence a second party stood behind |
| demand_alignment | 0.20 | Overlap with the demand context supplied (sector / roles) against the live catalog |
| breadth | 0.15 | Distinct domains with evidence at assisted level or above |
| recency | 0.15 | Half-life decay (365 days) on the strongest evidence per domain |
| trajectory | 0.10 | Recent evidence stronger than older evidence |
GET form
Both /match/* endpoints accept GET ?profile=<base64url JSON> for clients that prefer idempotent reads. The 402 challenge and price are identical.
Headers on every scored response
X-Measure-Version: tsc-v0.1.0
X-Measure-Disclosure: analytical; not-an-employment-decision; not-a-consumer-report
What every paid call tells us
Each settled query is logged as a shape — which domains, which levels, which evidence types, which sector — never who it described. That log is the demand-validated roadmap; the public aggregates are at /v1/stats.
Contact for integration questions: login@weckett.com · Licensing: rsl.xml