UpHunt API
API Endpoints

Get Job

Fetch a single archived Upwork job by its ciphertext slug.

GET
/api/v1/jobs/:ciphertext

Returns the full archived RawUpworkJob document for one Upwork job, identified by its ciphertext slug (the ~02xxx... portion of an Upwork job URL).

Authentication

This endpoint uses the public Data API key system — a Bearer token, not the x-api-key header used by the auto-apply endpoints. Generate a key from your dashboard or by POSTing to /api/internal/api-keys while signed in.

Authorization: Bearer up_<your-key>

Path parameters

ParameterTypeDescription
ciphertextstringrequired

Upwork job ciphertext, e.g. ~022053140178050136031. URL-encode the leading tilde.

Example

cURL
curl "https://uphunt.io/api/v1/jobs/~022053140178050136031" -H "Authorization: Bearer up_abc123def456..."

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.

{
  "id": "2053140178050136031",
  "title": "LONG-TERM! Only Experienced Video Editor for YTA Channel",
  "description": "Are YOU an experienced video editor for YouTube automation channels?...",
  "ontologySkills": [
    { "uid": "1031626793223176192", "prefLabel": "Video Editing" }
  ],
  "jobTile": {
    "job": {
      "id": "2053140178050136031",
      "ciphertext": "~022053140178050136031",
      "jobType": "HOURLY",
      "publishTime": "2026-05-09T15:53:59.413Z"
    }
  },
  "exploredAt": 1778344861000,
  "screeningQuestions": [
    { "position": 0, "question": "How many years of React experience do you have?" },
    { "position": 1, "question": "Have you worked on a similar project before?" }
  ],
  "jobDetailsResponse": { "data": { "jobPubDetails": { /* ... */ } } },
  "authJobDetailsResponse": { "data": { "jobAuthDetails": { /* ... */ } } }
}

Errors

Our archive goes back several years, but very old or never-scraped jobs may not be present.

StatusCodeWhen
401unauthorizedAPI key missing, invalid, or revoked
404not_foundCiphertext doesn't match any archived job
429rate_limit_exceededMonthly quota consumed

On this page