Submit a Proposal
Queue a proposal for any Upwork job.
/api/auto-apply-v2/applyQueue a proposal submission for an Upwork job. One credit is deducted on success — failed applications are free.
You can apply using a full Upwork URL, a job ciphertext (starts with ~), or a processed job UUID. Pass the same ciphertext you receive from a webhook payload directly.
Request body
| Parameter | Type | Description |
|---|---|---|
jobId | stringrequired | Upwork job identifier. Accepts: ciphertext ( |
coverLetter | stringrequired | The proposal text to submit with the application. Use the generate-proposal endpoint to create one with AI. |
profileId | string | Upwork profile to apply with. Get available profiles from the freelancers endpoint. Uses the primary profile if omitted. |
autoFillOtherQuestions | boolean | Use AI to answer additional screening questions on the application form. Defaults to |
proposal | object | Optional object to configure bid amount, timeline, and boost. Defaults are inferred from the job posting. See below. |
proposal object
| Parameter | Type | Description |
|---|---|---|
proposal.hourlyRate | number | Your hourly rate bid in USD. Only applies to hourly jobs. Example: |
proposal.fixedBid | number | Your fixed-price bid in USD. Only applies to fixed-price jobs. Example: |
proposal.timeline | string | Estimated project duration. Must be one of the enum values below. |
proposal.boostBids | number | Number of additional Connects to boost your proposal's visibility. Example: |
proposal.timeline values
"Less than 1 month""1 to 3 months""3 to 6 months""More than 6 months"Examples
Response
Default bids
Fixed-price jobs: If proposal.fixedBid is omitted, the bid defaults to the client's posted budget. If no budget is posted, it falls back to $100.
Hourly jobs: If proposal.hourlyRate is omitted, the rate defaults to the low end of the job's hourly range. If no range is posted, it falls back to $30/hr.
Next
- Poll the application state via Check Status.
- Automate this call from a matched job via Webhooks.
- Generate the
coverLetterwith AI via Generate Proposal.