API overview
A REST API for the bidding loop, list leads, bid, reject, and attach files.
The Lancer Public API covers the bidding loop for a campaign. It is intentionally small: four endpoints, all scoped to leads within a campaign.
Base URL: https://api.lancer.app/v1
Auth: Authorization: Bearer lk_...
Format: JSON (multipart for file uploads)| Endpoint | Purpose |
|---|---|
GET /campaigns/:campaignId/leads | List jobs matching the campaign's filters, as stable leads with action URLs. |
POST /campaigns/:campaignId/leads/:leadId/bid | Submit a proposal for a lead. Supports dry runs and per-bid config overrides. |
POST /campaigns/:campaignId/leads/:leadId/reject | Mark a lead as rejected so Lancer never bids on it. |
POST /campaigns/:campaignId/leads/:leadId/attachments | Upload files that will be attached to this lead's proposal. |
The API is designed around external mode: Lancer pushes matching jobs to your webhook, your system decides, and calls back through these endpoints. But every endpoint also works on standard (automatic) campaigns, for example to bid on a specific lead from a script.
Where things live in the web app
- API keys: Settings, then Integrations, API keys tab.
- Webhooks: Settings, then Integrations, Webhooks tab (organization scope) or the campaign's Integrations tab (campaign scope).
- Activity: every API bid, rejection, and webhook delivery is recorded in the Activity tab, so you can debug integrations without extra logging on your side.
Requirements
- An active paid subscription. Requests from organizations without one get
401. - A campaign. Its saved filters define which jobs
GET /leadsreturns and which jobs firejob.newwebhooks. - For actual submissions, a connected Upwork bidder account on the campaign.
No published rate limit
There is currently no request rate limit on the Public API. Practical ceilings: list pages are capped at 100 items, JSON bodies at 3 MB, and uploads at 5 files of 25 MB per lead. Be reasonable; sustained abusive traffic may get an explicit limit in the future.