Get Job
Fetch a single archived Upwork job by its ciphertext slug.
/api/jobs/by-ciphertextReturns the full archived RawUpworkJob document for one Upwork job, identified by its ciphertext slug (the ~02xxx... portion of an Upwork job URL).
The legacy /api/v1/jobs/:ciphertext and /api/v2/jobs/:ciphertext paths still work — they forward to this endpoint and behave identically (same x-api-key auth).
Authentication
This endpoint uses the same x-api-key header as the auto-apply endpoints — the key scoped to your UpHunt account. Generate it from Dashboard → Settings → API.
Query parameters
| Parameter | Type | Description |
|---|---|---|
cipher | stringrequired | Upwork job ciphertext, e.g. |
Example
Response
The full RawUpworkJob document is returned: top-level fields like title, description, ontologySkills[], jobTile.job.*, plus optional nested jobDetailsResponse (public details: budget, qualifications, buyer location/stats) and authJobDetailsResponse (auth-only enrichment: screening questions, attachments, buyer work history, applicant bid stats). When the auth-enriched scrape captured screening questions, they're also surfaced at the top level as screeningQuestions so you can pass position values directly to the apply endpoint's questionAnswers.
Three more fields carry what the UpHunt job view shows:
proposalActivity- live competition data.proposals,interviewing,hired,invitesSent,unansweredInvites,positionsToHire,lastClientActivity, acompetitionlevel (low/medium/high), andbidStats(avg, min, max bid).sourceistrackerwhen our proposal tracker is watching the job (thentrackingand ahistoryof change points are included) andscrapewhen the counts come from our first scrape. Anullcount means Upwork has not published it yet, not zero. The whole field isnullwhen we have no data.clientScore- our client quality score:score(0 to 100,nullfor a new client),label, fourcomponents(hires, money, reputation, engagement) with plain facts, plusflagsandperks.matches- every time this job matched one of your feeds:processedJobId,feedId,matchingScore,matchedAt, andapplication(status, applied time, and whether the client viewed your proposal).
Errors
Our archive goes back several years, but very old or never-scraped jobs may not be present.
| Status | When |
|---|---|
| 400 | Missing cipher query parameter |
| 401 | x-api-key missing or invalid |
| 404 | Ciphertext doesn't match any archived job |
Related
- Get Client Jobs — lists every job from the same buyer.
- Authentication — generating your
x-api-key.