curl --request GET \
--url https://api.getmany.io/service/v1/agency/proposals \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getmany.io/service/v1/agency/proposals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getmany.io/service/v1/agency/proposals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getmany.io/service/v1/agency/proposals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.getmany.io/service/v1/agency/proposals"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getmany.io/service/v1/agency/proposals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getmany.io/service/v1/agency/proposals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"proposal": {
"uid": "1955676881223622657",
"createdAt": "2025-08-13T17:04:38.077Z",
"updatedAt": "2025-08-14T09:12:01.442Z",
"status": "SUBMITTED",
"results": [
{
"timeStamp": "2023-11-07T05:31:56Z",
"type": "VIEWED_BY_CLIENT"
}
],
"isBoosted": false,
"isBoostOutbid": false,
"boostedConnects": 10,
"coverLetter": "<string>",
"connectsSpent": 20,
"questions": [
{
"question": "<string>",
"answer": "<string>"
}
],
"applicationTimeSeconds": 312.5,
"attachments": [],
"bidDecisionResult": {
"shouldApply": true,
"reasons": [
"<string>"
],
"prompt": "<string>"
},
"hubspot": {
"contactId": "<string>",
"dealId": "<string>",
"leadId": "<string>"
},
"pipedrive": {
"contactId": 123,
"leadId": "<string>",
"dealId": 123
},
"chatRoomId": "<string>"
},
"freelancer": {
"uid": "669484786717323264",
"name": "John Doe"
},
"manager": {
"uid": "1747622284724662272",
"name": "Jane Doe"
},
"job": {
"uid": "1955676437925687781",
"title": "AWS Lambda Function for Integration with SQS and Bubble.io",
"description": "<string>",
"url": "https://www.upwork.com/jobs/~021955676437925687781",
"cipherText": "~021955676437925687781",
"duration": "Up to 1 month",
"price": 1000,
"minHourlyRate": null,
"maxHourlyRate": null,
"hireType": "ANY",
"budgetType": "FIXED",
"prefEnglishSkills": "ANY",
"projectType": "One-time project",
"skills": [
"API",
"AWS Lambda",
"Python",
"API Integration",
"Amazon Web Services"
],
"vendorExpLevel": "EXPERT",
"vendorCountries": [
"US",
"GB"
],
"category": "Web Development",
"createdAt": "2025-08-13T17:02:52.446Z",
"publishedAt": "2025-08-13T17:02:52.446Z",
"isFeatured": false,
"jobScore": 4
},
"client": {
"uid": "1234567890",
"country": "US",
"city": "San Francisco",
"companySize": 50,
"avgHourlyRate": 15.001127904353712,
"totalSpent": 4717.25,
"industry": "Art & Design",
"timezone": "America/Sao_Paulo",
"connectedAt": "2020-10-17T00:00:00.000Z",
"totalHires": 3,
"feedbackCount": 6,
"feedbackScore": 5,
"hireRate": 60,
"isEnterprise": false,
"isPaymentMethodVerified": true,
"isPhoneNumberVerified": false
},
"jobSearch": {
"id": "689b6e81d6d44dcb40b9a9cf",
"url": "https://app.getmany.io/jse/689b6e81d6d44dcb40b9a9cf",
"name": "My Upwork Search"
},
"invitation": {
"createdAt": "2025-08-13T17:04:38.077Z"
}
}
],
"meta": {
"pageSize": 10,
"nextCursor": "Y3wyMDI1LTA4LTEzVDE3OjA0OjM4LjA3N1p8NjZiMmYxYzRlMmExYjMwMDEyYTRkOWYx",
"total": 124
}
}List Agency Proposals
Retrieves agency proposals. Supports optional status filter and cursor pagination.
Pass updatedSince to fetch only proposals that changed after a given moment, including ones whose only change was a new result event such as CLIENT_REPLIED or HIRED. Results are then ordered by updatedAt descending instead of createdAt.
Advance updatedSince to the highest updatedAt you received in the previous sweep — never to the clock time at which that sweep finished. A proposal updated while you are paginating moves above your cursor and is skipped for the rest of that sweep; the highest observed updatedAt picks it up on the next one, whereas an end-of-sweep clock value skips it permanently. Rows may repeat between sweeps; deduplicate on proposal.uid.
To bootstrap, note your own clock before you begin, make one full pass without updatedSince, then use the noted value as your first updatedSince. That is the one place a clock reading is safe, because it precedes every change you could have missed, so it over-fetches rather than under-fetches. The full pass is required because proposals predating this field carry updatedAt: null and are reachable only through plain cursor pagination; everything created or changed since carries a value.
A pageCursor belongs to the ordering it was issued for. Adding or removing updatedSince mid-pagination rejects the cursor with a 400 — restart pagination without pageCursor.
curl --request GET \
--url https://api.getmany.io/service/v1/agency/proposals \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getmany.io/service/v1/agency/proposals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getmany.io/service/v1/agency/proposals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getmany.io/service/v1/agency/proposals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.getmany.io/service/v1/agency/proposals"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getmany.io/service/v1/agency/proposals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getmany.io/service/v1/agency/proposals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"proposal": {
"uid": "1955676881223622657",
"createdAt": "2025-08-13T17:04:38.077Z",
"updatedAt": "2025-08-14T09:12:01.442Z",
"status": "SUBMITTED",
"results": [
{
"timeStamp": "2023-11-07T05:31:56Z",
"type": "VIEWED_BY_CLIENT"
}
],
"isBoosted": false,
"isBoostOutbid": false,
"boostedConnects": 10,
"coverLetter": "<string>",
"connectsSpent": 20,
"questions": [
{
"question": "<string>",
"answer": "<string>"
}
],
"applicationTimeSeconds": 312.5,
"attachments": [],
"bidDecisionResult": {
"shouldApply": true,
"reasons": [
"<string>"
],
"prompt": "<string>"
},
"hubspot": {
"contactId": "<string>",
"dealId": "<string>",
"leadId": "<string>"
},
"pipedrive": {
"contactId": 123,
"leadId": "<string>",
"dealId": 123
},
"chatRoomId": "<string>"
},
"freelancer": {
"uid": "669484786717323264",
"name": "John Doe"
},
"manager": {
"uid": "1747622284724662272",
"name": "Jane Doe"
},
"job": {
"uid": "1955676437925687781",
"title": "AWS Lambda Function for Integration with SQS and Bubble.io",
"description": "<string>",
"url": "https://www.upwork.com/jobs/~021955676437925687781",
"cipherText": "~021955676437925687781",
"duration": "Up to 1 month",
"price": 1000,
"minHourlyRate": null,
"maxHourlyRate": null,
"hireType": "ANY",
"budgetType": "FIXED",
"prefEnglishSkills": "ANY",
"projectType": "One-time project",
"skills": [
"API",
"AWS Lambda",
"Python",
"API Integration",
"Amazon Web Services"
],
"vendorExpLevel": "EXPERT",
"vendorCountries": [
"US",
"GB"
],
"category": "Web Development",
"createdAt": "2025-08-13T17:02:52.446Z",
"publishedAt": "2025-08-13T17:02:52.446Z",
"isFeatured": false,
"jobScore": 4
},
"client": {
"uid": "1234567890",
"country": "US",
"city": "San Francisco",
"companySize": 50,
"avgHourlyRate": 15.001127904353712,
"totalSpent": 4717.25,
"industry": "Art & Design",
"timezone": "America/Sao_Paulo",
"connectedAt": "2020-10-17T00:00:00.000Z",
"totalHires": 3,
"feedbackCount": 6,
"feedbackScore": 5,
"hireRate": 60,
"isEnterprise": false,
"isPaymentMethodVerified": true,
"isPhoneNumberVerified": false
},
"jobSearch": {
"id": "689b6e81d6d44dcb40b9a9cf",
"url": "https://app.getmany.io/jse/689b6e81d6d44dcb40b9a9cf",
"name": "My Upwork Search"
},
"invitation": {
"createdAt": "2025-08-13T17:04:38.077Z"
}
}
],
"meta": {
"pageSize": 10,
"nextCursor": "Y3wyMDI1LTA4LTEzVDE3OjA0OjM4LjA3N1p8NjZiMmYxYzRlMmExYjMwMDEyYTRkOWYx",
"total": 124
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
active, submitted, archived ISO-8601 timestamp. Returns only proposals whose updatedAt is at or after this moment, ordered by updatedAt descending. Boundary-inclusive. A UTC Z suffix or a numeric offset such as +03:00 are both accepted.