If your API call returns error code 128 with the message "Rate element not found," your bid payload is using the wrong budget type for the job. This is almost always caused by submitting an hourly bid on a fixed-price job.
Symptoms
API responds with
errorCode: 128Error message:
"Rate element not found"Bid submission fails
Cause
Upwork jobs are either Fixed Price or Hourly Rate. The bid.type in your payload must match the job's budget type exactly. Sending "type": "hourly" for a fixed-price job triggers this error.
Solution
Step 1: Check the job's budget type
Before submitting a bid, verify the job's budget type. You can do this:
Via webhook event
Listen to the GIGRADAR.OPPORTUNITY.CREATE event and check:
json
"event.data.job.budget.type": 1 // Fixed Price "event.data.job.budget.type": 2 // Hourly Rate
Step 2: Match your bid payload to the job type
❌ Wrong — Hourly payload on a Fixed Price job:
json
{
"coverLetter": "...",
"bid": {
"type": "hourly",
"amount": 75 },
"scheduledAt": "2026-05-21T03:13:30.000Z"
}✅ Correct — Fixed Price payload:
json
{
"coverLetter": "...",
"bid": {
"type": "fixed",
"amount": 1500
},
"scheduledAt": "{{scheduledAt}}"
}Quick Reference
| Job Type | Required |
| Fixed Price |
|
| Hourly Rate |
|
Prevention
Always read the job's budget type from the webhook payload before constructing your bid. Dynamically set bid.type based on event.data.job.budget.type rather than hardcoding it.
Still getting the error?
Double-check that the amount field is also appropriate for the bid type — fixed bids should reflect the total project price, not an hourly rate.
If the issue persists, contact GigRadar support with the opportunityId and the full payload you're sending.
