Official UpHunt SDK for Node.js & TypeScript — auto-apply to Upwork jobs, fetch archived job & client data, and generate AI proposals, all from your own stack.
- 📚 Full API docs: https://uphunt.io/docs
- 🔑 Get an API key: Dashboard → Auto-Apply → API & Webhooks
npm install uphunt
# or: pnpm add uphunt / yarn add uphunt / bun add uphuntRequires Node 18+ (uses the built-in fetch). Fully typed; works in ESM, CommonJS, and edge runtimes.
import { UpHunt } from 'uphunt'
const uphunt = new UpHunt({ apiKey: process.env.UPHUNT_API_KEY })
// Apply to a job
const { queueId, creditsRemaining } = await uphunt.apply({
jobId: '~022053140178050136031',
coverLetter: "Hi — I'd love to help with this project…",
proposal: { hourlyRate: 65, timeline: '1 to 3 months' },
})
// Poll status
const status = await uphunt.status({ queueId })
console.log(status.applicationStatus) // 'processing' | 'applied' | …If you omit apiKey, the client reads UPHUNT_API_KEY from the environment.
| Method | REST endpoint |
|---|---|
apply(input) |
POST /api/auto-apply-v2/apply |
status({ queueId, jobId }) |
GET /api/auto-apply-v2/status |
appliedJobs({ limit, offset, status }) |
GET /api/auto-apply-v2/applied-jobs |
generateProposal(input) |
POST /api/auto-apply-v2/generate-proposal |
freelancers() |
GET /api/auto-apply-v2/freelancers |
getJob(ciphertext) |
GET /api/jobs/by-ciphertext |
getClientJobs(companyId) |
GET /api/clients/:companyId/jobs |
Any non-2xx response throws an UpHuntError with .status and .body:
import { UpHunt, UpHuntError } from 'uphunt'
try {
await uphunt.apply({ jobId: '~01abc', coverLetter: '…' })
} catch (err) {
if (err instanceof UpHuntError) {
console.error(err.status, err.message, err.body)
}
}const { proposal } = await uphunt.generateProposal({ jobId: '~01abc', reasoningEffort: 'medium' })
await uphunt.apply({ jobId: '~01abc', coverLetter: proposal })MIT © UpHunt