Build on StaffPick.

Search tested remote staff from your code or your AI app. A read-only REST API for scripts and no-code tools, and an MCP server for Claude, ChatGPT and other AI apps. Same anonymised profiles, no key to search.

RESThttps://staffpick.ai/api/v1
MCPhttps://staffpick.ai/mcp

OpenAPI 3.1 spec at /api/v1/openapi.json

GET /api/v1/talentNo key needed
curl -G https://staffpick.ai/api/v1/talent \
  -d role=bookkeeper -d zone=au \
  -d hours_per_week=20 -d limit=3
One of the results
{"name": "Maria B.","country": "Philippines","role": "Bookkeeper","scores": {"english": 88,"english_band": "C2","typing_wpm": 64,"role_quiz": 94},"monthly_usd": {"min": 610,"max": 870,"hours_per_week": 20},"fit": "strong","example_profile": true}
Example from a sample profile, trimmed.

For AI apps

Any app that speaks MCP can search, shortlist and request intros. Signed in, it acts as the person who allowed it. Setup for each app is on the AI apps page.
Server, signed in
https://staffpick.ai/mcpStreamable HTTP, stateless. OAuth 2.1 with PKCE. Tools act as the person who allowed the app: hiring tools for a business, profile tools for talent.
Server, no sign-in
https://staffpick.ai/api/mcpSearch, profiles, pay benchmarks and links to request an intro on StaffPick. No account needed.
OAuth discovery
https://staffpick.ai/.well-known/oauth-protected-resource/mcpProtected resource metadata (RFC 9728). The authorization server is Supabase Auth, with dynamic client registration.
MCP Registry
ai.staffpick/staffpickStaffPick's entry in the official MCP Registry.
Cards in chat
search_talent, get_talent and create_role_brief also return an MCP Apps view that shows people as cards, under the io.modelcontextprotocol/ui extension. Apps without MCP Apps read the same data as text.
Limits
120 requests a minute per signed-in account, 60 a minute per IP without sign-in. 10 intros and 40 AI briefs a day per account.

The StaffPick plugin

One public repo adds the server and a hiring skill to Claude Code, claude.ai and Cowork, Codex and Gemini CLI. You still log in with your email code and choose Allow.

github.com/anyrxo/staffpick-plugin
Claude Code
/plugin marketplace add anyrxo/staffpick-plugin
/plugin install staffpick@staffpick
Codex
codex plugin marketplace add anyrxo/staffpick-plugin
codex plugin add staffpick@staffpick
codex mcp login staffpick
Gemini CLI
gemini extensions install https://github.com/anyrxo/staffpick-plugin
claude.ai and Cowork
Customize, then Plugins, then Add marketplace, with anyrxo/staffpick-plugin.

The REST API

Three read-only GET endpoints for code and no-code tools that can't use MCP. Query parameters in, JSON out.
Base URL
https://staffpick.ai/api/v1
OpenAPI 3.1
https://staffpick.ai/api/v1/openapi.jsonGenerated from the API's own validation. Import it into any OpenAPI tool.
Auth
None. Every endpoint is public and read-only.
Rate limit
60 requests a minute per IP. Past that you get a 429 with Retry-After in seconds.
Caching
Successful responses are cached at the edge for 60 seconds and can be served a few minutes stale while they refresh. Errors are never cached.
CORS
Any origin can call it, from a browser too. Responses carry Access-Control-Allow-Origin: * and need no cookies or credentials.

GET/talent

Search tested remote staff by role, skills, business hours and budget. Results come ranked, with test scores, hourly and monthly rates in USD, and a fit label.

fit is strong when every requirement is met and tests average 70 or more, good when none is missed, stretch when one is. Fit and criteria come from fixed matching rules, not AI.

queryoptional
Plain words, e.g. 'bookkeeper who knows Xero'. Matched against skills, tools and headlines. Text, up to 300 characters.
roleoptional
Role slug. Inferred from query when left out. virtual-assistantcustomer-supportappointment-settersocial-mediabookkeepervideo-editordesignerdevelopermarketingecommerce
zoneoptional
The business's working hours the worker must cover. us_eastus_westukeuau
budget_month_maxoptional
Most the business wants to pay per month in USD. Number, 50 to 20,000.
hours_per_weekoptional
Hours per week, used to turn hourly rates into monthly cost. Default 40. Whole number, 5 to 60.
limitoptional
How many people to return, 1 to 10. Default 5. Whole number, 1 to 10.
curl -G https://staffpick.ai/api/v1/talent \
  -d role=bookkeeper -d zone=au \
  -d hours_per_week=20 -d limit=3
200 OK, trimmed to one person
{"searched": 24,"role": "Bookkeeper","results": [{"id": "66e07eaf-f494-41de-b9d8-fa3e6500f1d7","name": "Maria B.","country": "Philippines","role": "Bookkeeper","headline": "Bookkeeper for small businesses on Xero and QuickBooks","covers_business_hours": ["Australia East"],"rate_usd_per_hour": {"min": 7,"max": 10},"monthly_usd": {"min": 610,"max": 870,"hours_per_week": 20},"scores": {"english": 88,"english_band": "C2","typing_wpm": 64,"role_quiz": 94},"id_verified": true,"example_profile": true,"fit": "strong","criteria": [{"need": "Australia East hours","importance": "must","status": "met","evidence": "Works Australia East hours"}],"profile_url": "https://staffpick.ai/p/maria-b-bookkeeper-ph-8511"}],"browse_url": "https://staffpick.ai/talent/browse"}

GET/talent/{id}

One person's full anonymised profile: summary, skills, tools, languages, hours covered, rates and every test with its date.

Unknown or unlisted ids return 404. To request an intro, send the person to https://staffpick.ai/hire?talent={id}.

idin the path
The worker's id or profile slug from search_talent. Text, 3 to 120 characters.
hours_per_weekoptional
Hours per week for the monthly cost. Default 40. Whole number, 5 to 60.
curl -G https://staffpick.ai/api/v1/talent/TALENT_ID \
  -d hours_per_week=20
200 OK, trimmed
{"id": "66e07eaf-f494-41de-b9d8-fa3e6500f1d7","name": "Maria B.","country": "Philippines","role": "Bookkeeper","headline": "Bookkeeper for small businesses on Xero and QuickBooks","summary": "I keep the books for small service businesses in Australia and the US, from daily bank feeds to a clean month-end close.","languages": ["English","Filipino","Cebuano"],"availability": "Flexible","monthly_usd": {"min": 610,"max": 870,"hours_per_week": 20},"scores": {"english": 88,"english_band": "C2","typing_wpm": 64,"role_quiz": 94,"typing_accuracy_pct": 98},"example_profile": true,"profile_url": "https://staffpick.ai/p/maria-b-bookkeeper-ph-8511","tested_on": {"english": "2026-10-26","typing": "2026-10-26","role": "2026-10-26"}}

GET/salary-benchmark

Typical monthly pay in USD for a role at the hours you give, from the rates of real approved profiles (25th to 75th percentile).

With fewer than 5 people listed for the role it says not enough data yet instead of guessing. With 5 or more it returns monthly_usd.typical_low, typical_high and based_on_profiles.

rolerequired
Role slug: virtual-assistant, customer-support, appointment-setter, social-media, bookkeeper, video-editor, designer, developer, marketing, ecommerce.
hours_per_weekrequired
Hours per week, e.g. 20 for part-time, 40 for full-time. Whole number, 5 to 60.
curl -G https://staffpick.ai/api/v1/salary-benchmark \
  -d role=bookkeeper -d hours_per_week=20
200 OK
{"role": "Bookkeeper","hours_per_week": 20,"result": "not enough data yet","note": "Fewer than 5 listed people for this role, so StaffPick does not publish a range."}

Errors

Errors are problem details (RFC 9457), sent as application/problem+json.

400
A parameter is missing or out of range. errors names each one.
404
Nobody listed has that id or slug.
429
More than 60 requests a minute from your IP. Wait Retry-After seconds.
500
Something failed on StaffPick's side. The body never carries internal details.
400 Bad Request
{"type": "about:blank","title": "Invalid request","status": 400,"detail": "Check the query parameters.","errors": [{"param": "limit","message": "Too big: expected number to be <=10"}]}

Versioning and data rules

Versioning
New fields and endpoints are added to v1, so read fields by name and ignore ones you don't know. A change that would break a client ships as /api/v2.
What you get
Anonymised profiles only: first name and last initial, country, role, skills, tools, languages, test scores, rates and the business hours someone covers.
What you never get
Email, phone, surname, city, exact time zone, ID images or photos. Not through the API and not through MCP.
Intros
Intros happen on StaffPick: send people to https://staffpick.ai/hire?talent={id}. StaffPick shares contact details by email only after the worker accepts.
AI
The REST API makes no AI calls. The AI brief tool, create_role_brief, is on MCP only and capped at 40 a day per caller.
Examples
The responses on this page come from sample profiles, marked example_profile: true.
More access
Need writes or signed-in data, like your briefs and intros, over REST? Tell us what you're building.