UpHunt API
Endpoints

Check Status

Poll a submitted application using queueId or jobId.

GET
/api/auto-apply-v2/status

Check the current status of an auto-apply job. Pass either queueId or jobId.

Query parameters

ParameterTypeDescription
queueIdstring

The queue ID returned from the apply endpoint.

jobIdstring

Alternatively, the Upwork ciphertext (~01abc...) or processed job UUID.

Provide either queueId or jobId, not both.

Example

cURL
curl "https://uphunt.io/api/auto-apply-v2/status?queueId=queue_abc123" -H "x-api-key: YOUR_API_KEY"

Response

{
  "jobId": "~01abc123def456",
  "processedJobId": "uuid-here",
  "applicationStatus": "applied",
  "applicationStatusMessage": "Successfully applied via auto-apply",
  "queueId": "queue_abc123",
  "appliedAt": 1732204800000,
  "processedAt": 1732204790000,
  "errorMessage": null
}

applicationStatus values

StatusMeaning
processingCurrently being submitted to Upwork
appliedSuccessfully applied
failedApplication failed — check errorMessage
not_availableJob is no longer available on Upwork
not_eligibleYour agency profile does not meet job requirements (location, qualifications, etc.)
not_enough_connectsYour agency does not have enough Connects
logged_outBusiness developer session temporarily invalidated — UpHunt reconnects automatically, no action required

Polling strategy

Applications typically settle within 30–90 seconds. Poll every 5 seconds for the first minute, then every 15 seconds for up to 5 minutes. After that, treat the job as failed and inspect errorMessage.

Node.js — poll until terminal
const terminal = new Set([
  'applied', 'failed', 'not_available',
  'not_eligible', 'not_enough_connects', 'logged_out',
])
 
async function waitForApply(queueId: string, timeoutMs = 5 * 60_000) {
  const start = Date.now()
  while (Date.now() - start < timeoutMs) {
    const res = await fetch(
      `https://uphunt.io/api/auto-apply-v2/status?queueId=${queueId}`,
      { headers: { 'x-api-key': process.env.UPHUNT_API_KEY! } }
    )
    const data = await res.json()
    if (terminal.has(data.applicationStatus)) return data
    await new Promise(r => setTimeout(r, 5_000))
  }
  throw new Error('Auto-apply timed out')
}

On this page