For agents
Let your agent hand you leads.
Job Studio scores résumé fit, tailors applications and keeps your pipeline. Your own agent, such as Claude Code, Codex or a script, can add an opportunity to your queue with a personal API key. You stay in charge of what happens next: Job Studio never applies or sends messages for an agent.
Copy this prompt into your agent
Read https://personaljobcopilot.xyz/skill.md and set up Job Studio for me.
My API key is in the JOB_STUDIO_API_KEY environment variable; never print it or ask me to paste it into chat.
First run the connection check. Then ask me before you add anything to my Job Studio queue.
Only add opportunities I name or approve. Do not apply to jobs or message anyone on my behalf.The prompt points your agent at /skill.md, which has the same steps as this page in plain markdown.
Step 1
Get an account and an API key
Sign up or sign in, then open Settings → API keys and generate a key. It starts with jc_ and is shown once. Job Studio stores only a hash.
Put the key in an environment variable, for example JOB_STUDIO_API_KEY. Don't paste it into a chat. The key acts as you, so revoke it in Settings if it leaks. No other tools are needed; any HTTP client works.
Step 2
Check the connection
This call reads nothing from your account and changes nothing.
curl -sS "https://personaljobcopilot.xyz/api/opportunities/inbound" \
-H "X-API-Key: $JOB_STUDIO_API_KEY""connected": true. A 401 means the key is missing, mistyped or revoked.{
"connected": true,
"endpoint": "/api/opportunities/inbound",
"rateLimit": { "remaining": 100, "resetAt": "…" }
}Step 3
Add your first opportunity
This writes one row to your real queue, and the API can't delete it, so have your agent ask you first and use a lead you actually want.
curl -sS -X POST "https://personaljobcopilot.xyz/api/opportunities/inbound" \
-H "Content-Type: application/json" \
-H "X-API-Key: $JOB_STUDIO_API_KEY" \
-H "Idempotency-Key: my-agent:northstar-head-of-product" \
-d '{
"who": { "name": "Jamie Chen", "title": "Talent Partner", "company": "Northstar" },
"role": "Head of Product",
"ask": "Open to a chat this week?",
"why": "Matches my product leadership focus",
"source": "linkedin-message",
"agent": "my-agent"
}'"created": true, and the row shows up on Opportunities. Sending the same request again returns 200 with "duplicate": true and no second row.{
"success": true,
"created": true,
"duplicate": false,
"incomplete": true,
"savedJobId": "<uuid>",
"company": "Northstar",
"role": "Head of Product",
"opportunitiesUrl": "/opportunities",
"workspaceUrl": "/workspace?job=<uuid>"
}Without a description the row is saved as incomplete and stays unscored until you add the job description in the app. A bad payload returns 400 with a fields list and writes nothing.
Reference
Payload fields
| Field | Required | Notes |
|---|---|---|
| who.name | Yes | The person who reached out |
| role | Yes | Role or ask title |
| why | Yes | One line: why this is worth the user's time |
| source | Yes | linkedin-message, linkedin-notification, manual or other |
| company | Yes* | Top level or who.company |
| who.title, who.contact | No | Contact title; email or profile URL |
| ask | No | What they want, up to 8,000 characters |
| url | No | http(s) link to the post or thread |
| description | No | Full job description. Without it the row is saved as incomplete and is not scored |
| rawText | No | Original message text |
| receivedAt | No | ISO timestamp, defaults to now |
| agent | No | Your agent's name, shown as attribution |
| idempotencyKey | No | Or the Idempotency-Key header. 8–128 chars of letters, numbers, . _ : - |
* Top-level company or who.company.
Available now
- Create and revoke personal API keys (jc_…) in Settings → API keys. A key is shown once and stored only as a hash.
- Check the connection: GET /api/opportunities/inbound with the X-API-Key header.
- Add one opportunity to the user's queue: POST /api/opportunities/inbound. It lands on /opportunities as a saved row with source and contact.
- Safe retries: the same Idempotency-Key (or the same payload) returns the existing row instead of a duplicate.
- Clear errors: missing key or a bad key returns 401; a bad payload returns 400 with a fields list and writes nothing.
Not available
None of these is scheduled.
- Reading, listing, editing or deleting opportunities through the API. The user reviews them in the app.
- Running fit scores, assessments, résumé tailoring or cover letters through the API. The user starts these in the app.
- Applying to jobs, sending messages or emails, or replying on LinkedIn. Job Studio never does these for an agent.
- Scraping LinkedIn or any other site.
- An MCP server or OAuth sign-in for agents. Use an API key.