I'm a creative strategist (paid social), and this setup lets me send about 15-20 applications a day. It works for any job title and any country; just change the keywords. Here's the full guide.
What you need
- A DeepSeek API key with a few dollars of balance ($2 is plenty)
- Python 3 (no libraries needed, standard library only)
- An AI agent that can browse and send messages: I use Hermes Agent (running on DeepSeek V4.1 Flash) and ChatGPT. Claude or DeepSeek alone work too, since the job list is plain text
- Your CV and a few message templates
Step 1: Understand the tool (2 min)
DeepSeek has a standalone Search API: POST https://api.deepseek.com/v1/tools/search, billed at $0.75 per 1,000 calls. It supports Google-style operators:
| Operator |
What it does |
Example |
site: |
Limit to a site or country subdomain |
site:fr.linkedin.com/jobs |
after: / before: |
Date window |
after:2026-10-11 |
"..." |
Exact phrase |
"creative strategist" |
Each result returns a title, URL and publication date. Max 50 results per call.
Step 2: Run your first search
Put your key in an environment variable (never in the code):
export DEEPSEEK_API_KEY="your_key"
import json, os, urllib.request
def search(query, count=50):
req = urllib.request.Request(
"https://api.deepseek.com/v1/tools/search",
data=json.dumps({"query": query, "count": count, "need_content": False}).encode(),
headers={"Authorization": f"Bearer {os.environ['DEEPSEEK_API_KEY']}",
"Content-Type": "application/json"})
return json.load(urllib.request.urlopen(req, timeout=60))["results"]
for r in search('site:fr.linkedin.com/jobs "creative strategist" after:2026-10-11'):
print((r.get("date") or "?")[:10], r["title"], r["url"])
Step 3: Scale it up
50 results per call is the cap, so split your search:
- country: one subdomain each (
uk., fr., de., es., it., nl., ca. + plain linkedin.com)
- job title: add variants and translations ("creative strategy", "paid social creative", "stratège créatif")
- date windows: e.g. 2-month slices with
after: and before:
Then loop over every combination, wait 2 seconds between calls (to avoid 429 errors), dedupe by URL, and sort by date.
My real numbers: 8 countries × 5 titles × 8 date windows = 320 calls, 0 errors, about $0.17. That returned 2,394 results, 652 relevant, 139 from the last month. For a daily run you only need a short date window, so it's a handful of calls.
Step 4: Give the list to your agent
Paste the list (title, link, date) into your agent with a prompt like this:
You are applying for me. Here is a list of job postings.
Target: only postings whose title contains "<your title>" (and <related titles>
I'm happy to apply for). Never apply to <excluded roles>, volunteering or unpaid work.
For each posting: follow what the post asks (form, email or DM).
Only write what is on my CV (attached). Use my message template (attached).
If anything is unclear (no template fits, unexpected page, my status unclear):
do NOT send, add it to a "To decide" list for me.
Only say "sent" if you have proof. Log every application
(company, role, link, date, channel) in the tracking file.
Daily cap: 20 applications.
Step 5: Safety rules I use (copy these)
- Strict target list with explicit exclusions.
- Only facts from your real CV. No invented experience.
- A shared daily cap if you run several agents, so you never go over platform limits.
- Never two agents on the same account at the same time.
- "To decide" list: when in doubt, the agent doesn't send.
- Proof of sending + a tracking file.
- A nightly recap: what was sent, by which agent, how much of the quota is used.
Step 6: Put it on a schedule
Run the search script every morning with a short window (after: = yesterday) and hand the fresh list to the agent. Use a cron job (crontab -e), or your agent's own scheduled tasks. Mine runs the search, then the application session, then sends a recap in the evening.
Cost
- Search: $0.75 per 1,000 calls (about $0.17 for my full 320-call sweep).
- Agent: DeepSeek V4.1 Flash is $0.15 / 1M input tokens and $0.60 / 1M output tokens (cache miss, off-peak; double at peak hours).
Limits (read this)
- It's an index, not live scraping: the freshest results are about 2 days old, not 24h.
- DeepSeek's Fetch endpoint is blocked by LinkedIn's login wall. Use Search.
- Title keyword filtering means a few false positives, and I don't check whether a posting is still open.
- Automating actions on LinkedIn or X can go against their terms. Keep volumes reasonable, supervise, and read what goes out.
Happy to share the full script if people want it.