Job Matching Infrastructure

MATCH
TALENT TO
OPPORTUNITY

A developer-first API for building job boards, career platforms, and scholarship portals across Africa and beyond. Skill-based matching, CV parsing, and real-time scoring — in one lightweight REST API.

6
Job Types
15
Endpoints
120
Max Match Score
1K
Free / Month
Job Listings
Full-time, part-time, contract, internship, fellowship, and scholarship — with filtering by region, skill, remote, and experience level.
Smart Matching
Skill-weighted scoring engine returns ranked candidates or jobs. Upload a CV as PDF/DOCX for automatic skill extraction.
API Keys & Tiers
Free tier to start, upgrade to Pro or Enterprise via Stripe. Per-key usage tracking, revocation, and billing events.
$
Billing Built-in
Stripe Checkout integration out of the box. Webhooks auto-upgrade your key tier. Revenue and MRR tracked in the admin dashboard.
Built with
FastAPI
PostgreSQL
Stripe
Railway
Docker
Python 3.11
Pydantic
SQLAlchemy
Active Key
No key yet
free
Endpoints
15
5 resources
Job Types
6
Full-time to scholarships
Max Score
120
Match points
Free Limit
1K
Requests/month
Core Endpoints
GET/v1/jobs/List + filter
POST/v1/profilesCreate profile
POST/v1/matchScore & rank
GET/v1/billing/statusUsage & tier
Scoring Weights
Skill match
10pts ea
Region match
+20pts
Level match
+15pts
Remote bonus
+5pts
Rate Limits & 429 Response
// When you hit your monthly limit: HTTP 429 Too Many Requests { "error": "rate_limit_exceeded", "message": "You've hit your free tier limit of 1,000 requests/month.", "upgrade_url": "https://your-portal.com/upgrade", "current_tier": "free", "next_tier": "pro", "next_tier_limit": "50,000 requests/month", "next_tier_price": "$29/month" }
First match result in under 5 minutes.
cURL
Python
Node.js

1 — Get a free key

curl -X POST https://jobs-api-sqbt.onrender.com/v1/keys/ \ -H "Content-Type: application/json" \ -d '{"name": "My App"}'

2 — Create a profile and match

# Create profile PROFILE=$(curl -s -X POST https://jobs-api-sqbt.onrender.com/v1/profiles/ \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"skills":["Python","Docker"],"region":"Africa","experience_level":"mid"}') ID=$(echo $PROFILE | python3 -c "import sys,json;print(json.load(sys.stdin)['profile_id'])") curl -X POST https://jobs-api-sqbt.onrender.com/v1/match/ \ -H "Authorization: Bearer YOUR_KEY" \ -d "{\"profile_id\": \"$ID\"}"
Authentication
All routes require  Authorization: Bearer YOUR_KEY
Jobs
GET/v1/jobs/List + filter (type, region, skill, remote, level)
GET/v1/jobs/{id}Get single job
POST/v1/jobsCreate a job
PATCH/v1/jobs/{id}Update a job
DELETE/v1/jobs/{id}Soft-delete
Profiles & Matching
POST/v1/profilesCreate profile manually
POST/v1/profiles/upload-cvUpload PDF/DOCX → extract skills
POST/v1/matchMatch profile → ranked jobs with scores
POST/v1/match/jobs/{id}/candidatesReverse: top candidates for a job
Keys & Billing
POST/v1/keysGenerate free key
GET/v1/keys/usage?key=...Check usage + limits
DELETE/v1/keys/revoke?key=...Revoke a key
POST/v1/billing/checkoutStart Stripe Checkout to upgrade tier
GET/v1/billing/status?api_key=...Subscription + usage status
Endpoints
Generate keys first at API keys and Select endpoint →
URL
Body (JSON)
Response appears here...
Generate Free Key
Check Existing Key
Your Listings
TitleCompanyTypeRegionRemoteDeadline
Enter your key above to load your jobs
Enterprise
Custom
Volume pricing · Dedicated support
Unlimited requests
Unlimited listings
AI embeddings
Custom SLA
Dedicated Slack
Compare All Plans
FeatureFreeProEnterprise
Requests/month1,00050,000Unlimited
Job listings505,000Unlimited
CV upload & parsing✓ + Agentic guide
Matching engine✓ + AI embeddings
SupportDocs onlyEmailDedicated Slack
Price$0$29/moCustom
Verifying your subscription…
No Charge Made
You cancelled before completing checkout. Nothing was billed — your key is unchanged.
Was my card charged?
No. You exited before completing the Stripe checkout flow.
Is my API key still active?
Yes, your current key is unchanged and on the free tier.
Can I upgrade later?
Absolutely. Head back to the Upgrade page whenever you're ready.
Admin Access
Enter your admin secret to continue
Invalid secret. Check ADMIN_SECRET in .env
Set via ADMIN_SECRET in your .env