# Get your Upwork proposals and contracts through an API

> Read the proposals on each job posting, with bids and screening answers, or the newest job posts in your skills, with one API call each. A workflow can check your job postings each weekday morning and email you the new proposals grouped by your criteria.

Page: https://fous.com/automate/upwork
Updated: 2026-11-12

Works with your own Upwork account. Fous is an independent product.

## What you can build on Upwork

### Get proposals for a job posting

Reads the proposals on one of your job postings, with each applicant's bid, cover letter, screening answers and whether the proposal was boosted.

- Takes: Job posting, status (optional)
- Returns: Freelancer, profile link, bid, cover letter, screening answers, boosted, shortlisted, status

### Find new job posts

Searches Upwork jobs with your search terms, sorted by Most Recent, and reads each job's title, budget, required skills and client rating.

- Takes: Search terms, posted in the last N days (optional)
- Returns: Job title, link, posted date, budget, required skills, client rating, already applied

### List contracts and milestones

Reads your active contracts and, for fixed-price contracts, each milestone with its amount and status.

- Takes: Nothing
- Returns: Contract title, other party, contract type, milestone, amount, milestone status

### Shortlist a proposal

Opens a proposal on one of your job postings and adds it to the shortlist, or removes it.

- Takes: Job posting, freelancer, shortlist or remove
- Returns: Freelancer, job posting, shortlisted

## Automate Upwork with a workflow

A [workflow](/product/workflows) runs your methods as one process, with nobody at the screen. A schedule or a call from your own system starts it, the steps run in order, and the result arrives in your inbox or in the systems you already use.

### New proposals on your job postings, grouped

Starts: Every weekday at 8:00

1. For each job posting you name, get its proposals.
2. Keep the proposals that were not there on the last run.
3. An AI step groups them by how well they meet your criteria, such as must-have skills, timezone or budget.
4. Email you the grouped list with bids and screening answers.

### New job posts in your skills, posted to your team

Starts: Every hour on weekdays

1. Find new job posts for each of your search terms, sorted by Most Recent.
2. Keep the jobs not seen on the last run that you have not applied to.
3. Post title, budget, required skills, client rating and link to your Slack webhook.

### Milestone changes across your contracts

Starts: Every Monday at 9:00

1. List your active contracts and their milestones.
2. Keep the milestones whose status changed since the last run.
3. Post contract, milestone, amount and new status to your accounting webhook.

You can run a workflow by hand on every plan, Free included. Schedules and webhook triggers come with the paid plans, from $29 a month.

## Once built, one call from your code

Once you have built a [method](/product/methods), it is one POST to /v1/runs from your backend, or a tool an AI agent calls over MCP. This is what “Get proposals for a job posting” would look like.

Example request:

```
curl https://api.fous.com/v1/runs \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "www.upwork.com/get_job_proposals",
    "input": {
      "job_posting": "Senior data engineer for warehouse migration",
      "status": "active"
    }
  }'
```

Example response:

```
{
  "status": "completed",
  "data": {
    "job_posting": "Senior data engineer for warehouse migration",
    "proposals": [
      {
        "freelancer": "Northwind Data Partners",
        "profile_url": "https://www.upwork.com/freelancers/~01aaaa0000example",
        "bid": "85.00 USD/hr",
        "cover_letter": "I moved a 4 TB warehouse to a new platform last quarter and can start with a schema audit.",
        "screening_answers": [
          "How many warehouse migrations have you led? Five, the largest 4 TB."
        ],
        "boosted": false,
        "shortlisted": true,
        "status": "Active"
      }
    ],
    "count": 1
  }
}
```

An example with invented data, not a ready-made endpoint. The method exists in your organization once you build it, and its name, inputs and fields follow your request.

## Upwork’s own options

Upwork publishes a GraphQL API, reached with OAuth 2.0 credentials from its API Center, and client libraries for it in seven languages. For AI agents it runs an MCP server with an agent plugin covering job posts, proposals, hiring, contracts and messages. Through it, offers and other steps that move money are finished on Upwork itself.

| Option | What it covers | What it takes |
| --- | --- | --- |
| Upwork GraphQL API | The GraphQL calls Upwork shares publicly, with libraries in Python, Node, Go, Java, PHP, Ruby and Perl. | A client_id and client_secret from Upwork's API Center, used with OAuth 2.0. |
| Upwork MCP server and agent plugin | Job posts, proposals, invitations, offers, contracts, milestones, messages and Connects, for client, freelancer and agency accounts. | An Upwork account authorized in the browser. Writes need confirmation; offers are funded and sent through a link on Upwork. |
| Upwork by hand | Job postings and their proposals, job search, contracts, milestones and messages, one account at a time. | An Upwork account: client, freelancer or agency. |

Read on November 12, 2026: [Upwork Agent Plugin](https://github.com/upwork/upwork-agent-plugin), [Upwork MCP workflow conventions](https://raw.githubusercontent.com/upwork/upwork-agent-plugin/master/skills/upwork-workflows/SKILL.md), [Python bindings for the Upwork API](https://github.com/upwork/python-upwork-oauth2).

## Signing in to Upwork

One Upwork login can hold several accounts, such as a client company, a freelancer profile and an agency, and every action runs under one of them. With Fous you sign in once through Upwork's own sign-in with your own account: the login is sealed with AES-256, never returned by the API or written to logs, and a method reads and does only what that account can.

## Worth knowing

- **Pick the account first**: Client, freelancer and agency accounts see different things: a client reviews proposals and makes offers, a freelancer or agency searches jobs and submits proposals. Name the account in each method.
- **Accepted does not mean hired**: On a freelancer's own proposal, the status Accepted means the proposal was submitted and validated, not that the client accepted the freelancer. Read the status that way in any report.
- **Milestones sit inside each contract**: A client reads a milestone's state through its contract, while a freelancer also has a milestone list. A method that goes through your active contracts covers every milestone.
- **Boosted is a paid placement**: A boosted proposal was promoted with Connects, and the Available Now badge is paid too. Neither says anything about fit, so keep them as a flag rather than a ranking.

## More in HR: staffing and vendor management

- [e-staffing](https://fous.com/automate/e-staffing.md)
- [ShiftWise Flex](https://fous.com/automate/shiftwise-flex.md)
- [Bullhorn](https://fous.com/automate/bullhorn.md)
- [Beeline](https://fous.com/automate/beeline.md)
- [Magnit VMS](https://fous.com/automate/magnit-vms.md)
- [SAP Fieldglass](https://fous.com/automate/sap-fieldglass.md)
- [Workday VNDLY](https://fous.com/automate/workday-vndly.md)

Other industries: [PECOS](/automate/pecos), [Aviva Broker](/automate/aviva-broker), [MyHMCTS](/automate/myhmcts), [Air France KLM Martinair Cargo myCargo](/automate/air-france-klm-martinair-cargo-mycargo), [NetX360+](/automate/netx360), [PayCargo](/automate/paycargo).

## Frequently asked questions

### Does Upwork have an API?

Yes. Upwork publishes a GraphQL API that you call with a client_id and client_secret from its API Center over OAuth 2.0, with official libraries in seven languages. It also runs an MCP server for AI agents that covers job posts, proposals, hiring, contracts and messages.

### Can an AI agent send an offer on Upwork?

It can prepare one, but the offer is sent on Upwork. Upwork's own MCP server creates a draft offer and returns a link, and the client opens it on Upwork to review, fund and send it. The same applies to other steps that move money.

### What does the Accepted status on my proposal mean?

That your proposal was submitted and validated. Upwork's own documentation says it does not mean the client accepted you.

### Can I get proposals from all my job postings at once?

Yes, by calling a method for each posting from a workflow. With Fous a workflow can loop over your job postings every morning, keep only the proposals that are new since the last run and email you the list with bids and screening answers.

### Is Fous affiliated with Upwork?

No. Fous is an independent product. You use it with your own Upwork account, and a method reads and does only what that account can.

Fous is an independent product: it is not affiliated with, endorsed by or sponsored by the operator of Upwork (Upwork). The name is used only to say which system this page is about. Something here wrong or out of date? Write to legal@fous.com.
