UpHunt API
Endpoints

Generate Proposal

AI-written cover letters tailored to a specific job.

POST
/api/auto-apply-v2/generate-proposal

Generate an AI cover letter. Pass the result as coverLetter when calling the apply endpoint.

Pass a jobId if the job is already indexed in UpHunt, or pass jobTitle + jobDescription to skip the database lookup entirely (useful for jobs discovered outside UpHunt).

Request body

ParameterTypeDescription
jobIdstring

Upwork job identifier: ciphertext (~01abc123), full URL, or processed job UUID. The job must already be scraped in UpHunt. Required if jobDescription is not provided.

jobTitlestring

Job title. Used together with jobDescription to generate a proposal without looking up the job by ID.

jobDescriptionstring

Full job description text. When provided with jobTitle, skips the database lookup entirely.

feedIdstring

Job feed ID whose custom proposal prompt should be used. Falls back to a generic prompt if omitted.

reasoningEffortstring

AI quality level. Higher effort produces better proposals but takes longer.

reasoningEffort values

"low""medium""high"

Examples

curl -X POST https://uphunt.io/api/auto-apply-v2/generate-proposal -H "Content-Type: application/json" -H "x-api-key: YOUR_API_KEY" -d '{"jobId":"~01abc123def456","reasoningEffort":"medium"}'

Response

{
  "success": true,
  "proposal": "Dear hiring manager, I noticed your project requires..."
}

Cost & latency

Proposal generation does not consume auto-apply credits. Latency depends on reasoningEffort: low ≈ 3–5s, medium ≈ 8–12s, high ≈ 20–30s.

Piping into apply

Generate + apply in one flow
const gen = await fetch('https://uphunt.io/api/auto-apply-v2/generate-proposal', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'x-api-key': API_KEY },
  body: JSON.stringify({ jobId: '~01abc123', reasoningEffort: 'medium' }),
}).then(r => r.json())
 
await fetch('https://uphunt.io/api/auto-apply-v2/apply', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'x-api-key': API_KEY },
  body: JSON.stringify({
    jobId: '~01abc123',
    coverLetter: gen.proposal,
    proposal: { hourlyRate: 65, timeline: '1 to 3 months' },
  }),
})

On this page