GET /api/v1/jobs returns every live public listing as JSON. No key, no auth, no signup. Filter with query parameters:
curl "https://picked.ai/api/v1/jobs?country=GB&remote=true"
The response envelope is { version, count, jobs }. Within v1 the shape only ever gains fields; nothing is renamed or removed. Fetch a single job with GET /api/v1/jobs/{slug}, using the slug from the list response or from the job page URL.
Errors are { version, error } with an enum code: not_found, rate_limited or temporarily_unavailable. Responses are CDN cached for up to an hour, so a repeated query is close to free.
POST /api/mcp is a Model Context Protocol server over the same live listings: Streamable HTTP, stateless, no auth. Three tools:
search_jobs: search live listings with the same filters as the JSON API.
get_job: fetch one job by slug, with the full description and the apply URL.
get_company: fetch a company profile and its open roles.
Add it to an MCP client config as a remote server:
{ "mcpServers": { "picked-jobs": { "url": "https://picked.ai/api/mcp" } } }Apply URLs point at the canonical job page. The form is one screen with no account: name, email, location, CV upload. Disclosed agent applies are welcome. Every candidate is assessed on merit, human or agent assisted alike.
The verification email must be clicked by the human candidate; an application only enters the process after that click.
Agents can submit an application for a candidate directly, without a browser: use POST /api/v1/jobs/{slug}/apply or the apply_to_job MCP tool.
Identify yourself. Disclosed automation is welcome here; undisclosed automation is not. Pass an agent object naming your agent and a contact URL, so an employer can see who and what applied.
Consent is two phase. First, the agent confirms the candidate agreed to apply, by setting consent.confirmed_by_candidate to true. Second, the human candidate receives a verification email and clicks it themselves; that click is where consent is actually recorded. Nothing is screened, assessed or shown to the employer until the human has clicked.
curl -X POST https://picked.ai/api/v1/jobs/senior-engineer/apply \
-H 'content-type: application/json' \
-d '{
"candidate": { "email": "candidate@example.com", "name": "Ada Byron", "location": "London, UK" },
"cv_text": "Full plain-text CV or a structured summary...",
"consent": { "confirmed_by_candidate": true },
"agent": { "name": "ExampleApplyBot", "contact_url": "https://example.com" }
}'About 60 requests per minute per IP. Over the limit you get a 429 with a Retry-After header. Responses are cached; heavy consumers should prefer the list endpoint over per-job fetches. Identify your agent with a descriptive User-Agent.
Applications that arrive through these surfaces carry their source (agent_api, agent_mcp), and employers see them as a first class channel with the same quality scoring as every other source.
Looking for the human version? Browse the same listings at picked.ai/jobs.