UpHunt API

Changelog

API versions, breaking changes, and new features.

We version the UpHunt API under /api/auto-apply-v2/ and document every user-visible change here. Breaking changes are announced 60 days in advance via email to every account with an active API key.

2026-10 - Proposal counts and client score on job reads

  • GET /api/jobs/by-ciphertext now returns proposalActivity (proposals, interviewing, hired, invites, client last active, competition level, bid range, and the tracker's history), clientScore, and matches (your feeds' scores and application state for the job). See Get Job.
  • GET /api/v1/jobs (the search behind the MCP search_jobs tool) adds proposalActivity (no history), clientScore, and application to every result.
  • Backward compatible: only new fields. Nothing existing changed.

2026-08 - Five new feed pre-filters

  • POST /api/v1/feeds and PATCH /api/v1/feeds/:feedId accept five new filters: jobTypes, usOnlyMode, paymentVerifiedOnly, clientMinRating, and clientMinReviews. See Feeds for the field reference.
  • All five are Upwork-only and all default to off, so existing feeds match exactly what they matched before. LinkedIn and web jobs are never rejected by them.
  • usOnlyMode filters on the job's required talent location, which is a different thing from the client's country in countryFilterMode. Its "include" mode also drops jobs whose restriction Upwork does not publish.
  • clientMinRating treats a client with no reviews as unrated and excludes them, which makes it aggressive: a 4.8 floor passes roughly 46% of Upwork jobs. Use clientMinReviews when you want to require a track record rather than just a high score.
  • Backward compatible: no existing field changed meaning and no response shape changed.

2026-06 — Freelancers list moves into the v2 family

  • The "list freelancers" endpoint is now GET /api/auto-apply-v2/freelancers, alongside the other auto-apply-v2 endpoints. It accepts x-api-key or an in-app session.
  • Backward compatible: the old GET /api/auto-apply/external/freelancers path still works — it forwards to the same handler.

2026-06 — Data reads use x-api-key, no version prefix

  • GET /api/jobs/by-ciphertext?cipher=~02... and GET /api/clients/:companyId/jobs — the archived-job and client-history reads, authenticated with the standard x-api-key header (or an in-app session).
  • The old /api/v1/* "Data API" Bearer (up_) key system is retired. Use your x-api-key instead of Authorization: Bearer.
  • Backward compatible: the /api/v1/* and /api/v2/* paths still resolve — they forward to the unversioned endpoints and behave identically. No client changes required beyond the auth header.
  • The old v1 shared 10,000/billing-period quota is retired; the reads aren't separately metered.

2025-11 — Documentation rewrite

  • Full docs moved to Fumadocs with sidebar, search, and syntax highlighting.
  • Added Rate Limits, SDKs, and Recipes.
  • Machine-readable openapi.json kept in sync with the docs.

2025-09 — v2 endpoint generally available

  • New POST /api/auto-apply-v2/apply accepts job URL, ciphertext, or processed UUID as jobId. No more feed setup required.
  • New POST /api/auto-apply-v2/generate-proposal — AI-written cover letters on demand.
  • applicationOptions renamed to proposal for clarity.
  • Legacy POST /api/auto-apply/external remains supported.

2025-07 — Webhook delivery improvements

  • Added X-UpHunt-Delivery header with a unique ID per attempt (useful for idempotency).
  • Retries now use exponential backoff (30s, 2m, 10m) instead of a flat 5-minute delay.
  • Duplicate events for the same (jobId, jobListenerId) suppressed for 24 hours.

2025-05 — Status endpoint polish

  • New terminal states: not_enough_connects, logged_out.
  • errorMessage now includes a human-readable explanation for every failure.
  • appliedAt and processedAt reported as Unix milliseconds consistently.

2025-01 — Agency profiles

  • New GET /api/auto-apply/external/freelancers endpoint lists agency-linked freelancers and their specialized profiles.
  • /apply now accepts a profileId to route proposals to a specific freelancer / specialization.

Upgrading from legacy

See the Legacy Endpoint → Migrating to v2 table for field-by-field mappings.