Upwork scout
Finds jobs worth Connects, drops the ones that waste them, and drafts proposals that only use proof the freelancer can back up.
Before you start
- Read
me.md(copyme.example.mdthe first time and fill it in). It holds the niche, rate, search terms, and the only proof you may use. - Call
list_accountsand pick the TALENT account named inme.md. The connector can switch accounts between sessions. If the named account isn't there, stop and say so. Never draft for the wrong person. - Read the Connects balance with
get_profile action=connects_balance.
1. Search
Run every search, then de-duplicate by job id:
find_jobs smart_searchmode=most_recent, days_posted=2, verified_payment_only=truefind_jobs searchwithtitle= each title term inme.md, verified_payment_only=true, proposals_max=10find_jobs searchwithquery= the "problem words" inme.md(e.g. "hacked OR slow OR broken"), same filters
Gotchas: title can't be combined with query or with sort=relevance. search has no date filter, so use smart_search mode=most_recent for "posted today".
Skip any job id already listed in an earlier file in the output folder.
2. Check, then drop
Call find_jobs get on the best ~10. Drop a job if:
appliedis true, oractivityStat.jobActivity.totalHired≥ 1, ortotalOffered≥ 1preferred_locations.location_requiredis true and excludes the freelancer's country- the client's
feedback_scoreis under 4.0, or recent reviews are 1–2★ (flag it if the job is otherwise great) - it's outside the niche in
me.md
3. Score (0–10), keep the top 3–5
| Signal | Points |
|---|---|
| A fix job (broken, hacked, slow, failing checkout, migration) | +3 |
| Core build in the niche | +2 |
| Ongoing or retainer work mentioned | +2 |
| Client spent $1K+ with a 4.5★+ rating | +2 |
| 0 interviewed and fewer than 5 proposals | +1 |
| Costs more than 20 Connects | −1 |
4. Draft
For every pick:
- First line is about their job. If the post names a public URL, fetch it (20s timeout) and open with one real thing you saw. Clients only see the first two lines in their list, so a generic opener never gets opened.
- Then a numbered plan, a price, and one question at the end.
- Answer every screening question, and obey any "start your proposal with X" instruction exactly.
- Proof comes only from
me.md: live links, measured numbers, confirmed stories. Anything only the freelancer can know (role on a project, a past fix, turnaround, a price they haven't set) goes in as[CONFIRM: ...]. Never invent results, clients, numbers or experience. - While the account has fewer than 10 reviews, price to win and plan to upsell a care plan after delivery.
5. Write the file
Write <output folder>/YYYY-MM-DD.md containing:
- A header line with today's Connects balance.
- A ranked table: job link, client (country, spend, rating), Connects cost, and why it was picked.
- A "Skipped" line explaining why the others were dropped.
- The total Connects for all picks.
- One draft per pick.
If nothing passes the filters, still write the file with an empty table and the reason.
6. Sending (only when the user says so)
Do this one proposal at a time. Upwork keeps a single open preview, and creating a second one invalidates the first.
list_freelancer_proposals action=invitationsandaction=list. If there's an invitation for the job, useaccept_invitationinstead ofcreate.manage_proposals createbuilds a preview. Show the user the full text,connects_cost,connects_balance, anyunmet_preferred_qualifications, and the boost block (current_top_bidsandrecommended_connects, or "boost unavailable").- Fixed-price jobs need a
payment_mode(by_projectorby_milestone), and the user must acknowledge Upwork's Dispute Assistance text before you submit. - Ask about file attachments, and suggest attaching relevant portfolio projects via
portfolio_project_ids(fromget_profile action=list_highlights). - Call
confirm_previewonly after an explicit yes. Then read the proposal back withlist_freelancer_proposals action=getand check thatconnectsBidmatches the approved boost.
Never
- Submit, edit, withdraw, message, or accept anything without the user's explicit OK for that specific action.
- Put one person's facts on another person's account.
- Fill a
[CONFIRM]gap with a guess.