curl --request POST \
--url https://app.govly.com/api/tools/v1/opportunities/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"cursor": "<string>",
"perPage": 25,
"status": "open",
"naics": [
"<string>"
],
"placeIds": [
"<string>"
],
"placeIdsNone": [
"<string>"
],
"buyerDescription": "<string>",
"includeSubBuyers": true,
"recordType": [],
"noticeType": [],
"postedAfter": "<string>",
"postedBefore": "<string>",
"modifiedAfter": "<string>",
"modifiedBefore": "<string>",
"respondByAfter": "<string>",
"respondByBefore": "<string>",
"awardedAfter": "<string>",
"awardedBefore": "<string>"
}
'import requests
url = "https://app.govly.com/api/tools/v1/opportunities/search"
payload = {
"query": "<string>",
"cursor": "<string>",
"perPage": 25,
"status": "open",
"naics": ["<string>"],
"placeIds": ["<string>"],
"placeIdsNone": ["<string>"],
"buyerDescription": "<string>",
"includeSubBuyers": True,
"recordType": [],
"noticeType": [],
"postedAfter": "<string>",
"postedBefore": "<string>",
"modifiedAfter": "<string>",
"modifiedBefore": "<string>",
"respondByAfter": "<string>",
"respondByBefore": "<string>",
"awardedAfter": "<string>",
"awardedBefore": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
cursor: '<string>',
perPage: 25,
status: 'open',
naics: ['<string>'],
placeIds: ['<string>'],
placeIdsNone: ['<string>'],
buyerDescription: '<string>',
includeSubBuyers: true,
recordType: [],
noticeType: [],
postedAfter: '<string>',
postedBefore: '<string>',
modifiedAfter: '<string>',
modifiedBefore: '<string>',
respondByAfter: '<string>',
respondByBefore: '<string>',
awardedAfter: '<string>',
awardedBefore: '<string>'
})
};
fetch('https://app.govly.com/api/tools/v1/opportunities/search', 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://app.govly.com/api/tools/v1/opportunities/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'cursor' => '<string>',
'perPage' => 25,
'status' => 'open',
'naics' => [
'<string>'
],
'placeIds' => [
'<string>'
],
'placeIdsNone' => [
'<string>'
],
'buyerDescription' => '<string>',
'includeSubBuyers' => true,
'recordType' => [
],
'noticeType' => [
],
'postedAfter' => '<string>',
'postedBefore' => '<string>',
'modifiedAfter' => '<string>',
'modifiedBefore' => '<string>',
'respondByAfter' => '<string>',
'respondByBefore' => '<string>',
'awardedAfter' => '<string>',
'awardedBefore' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.govly.com/api/tools/v1/opportunities/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.govly.com/api/tools/v1/opportunities/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/tools/v1/opportunities/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"title": "<string>",
"displayName": "<string>",
"identifier": "<string>",
"externalUrl": "<string>",
"links": {
"self": "<string>",
"external": "<string>"
},
"recordType": "<string>",
"status": "open",
"postedAt": "2023-11-07T05:31:56Z",
"modifiedAt": "2023-11-07T05:31:56Z",
"respondBy": "2023-11-07T05:31:56Z",
"cancelledAt": "2023-11-07T05:31:56Z",
"awardedAt": "2023-11-07T05:31:56Z",
"aiTitle": "<string>",
"aiSummary": "<string>",
"buyer": {
"id": "<string>",
"name": "<string>",
"domains": [
"<string>"
],
"hierarchy": [
"<string>"
]
},
"locations": [
{
"placeLocationId": "<string>",
"postalCode": "<string>",
"city": "<string>",
"region": "<string>",
"street": "<string>",
"place": "<string>",
"country": "<string>",
"countryCode": "<string>",
"label": "<string>",
"type": "<string>"
}
],
"naics": [
"<string>"
],
"psc": [
"<string>"
],
"nigp": [
"<string>"
],
"unspsc": [
"<string>"
],
"jurisdiction": {
"id": "<string>",
"name": "<string>",
"isoCode": "<string>"
},
"contractVehicle": {
"id": "<string>",
"name": "<string>"
},
"tags": {},
"followerCount": 123,
"followedByCurrentUser": true,
"followedByCurrentOrganization": true,
"workspaces": [
{
"id": "<string>",
"name": "<string>",
"status": {
"category": "<string>",
"label": "<string>"
},
"followerCount": 123,
"follows": [
{
"id": "<string>",
"member": {
"type": "user",
"id": "<string>",
"name": "<string>",
"email": "jsmith@example.com",
"organization": {
"id": "<string>",
"name": "<string>"
}
},
"state": "<string>",
"notifications": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"organizationDefault": true,
"organization": {
"id": "<string>",
"name": "<string>"
},
"followedByCurrentUser": true,
"followedByCurrentOrganization": true
}
]
}
],
"meta": {
"total": 123,
"returnedCount": 123,
"totalIsLowerBound": true,
"perPage": 123,
"searchType": "fed",
"nextCursor": "<string>"
}
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}Search opportunities
Search opportunities with the constrained public parameter set shared by MCP search_opportunities. Defaults to open opportunities and excludes prediction records from search results. Searches all dates unless a date bound is supplied, orders by newest modified date unless sort is supplied, and returns stored opportunity dates. Repeat the same filters with each cursor. Unresolved buyers or unsupported type filters fail with 400 rather than returning a broader search.
curl --request POST \
--url https://app.govly.com/api/tools/v1/opportunities/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"cursor": "<string>",
"perPage": 25,
"status": "open",
"naics": [
"<string>"
],
"placeIds": [
"<string>"
],
"placeIdsNone": [
"<string>"
],
"buyerDescription": "<string>",
"includeSubBuyers": true,
"recordType": [],
"noticeType": [],
"postedAfter": "<string>",
"postedBefore": "<string>",
"modifiedAfter": "<string>",
"modifiedBefore": "<string>",
"respondByAfter": "<string>",
"respondByBefore": "<string>",
"awardedAfter": "<string>",
"awardedBefore": "<string>"
}
'import requests
url = "https://app.govly.com/api/tools/v1/opportunities/search"
payload = {
"query": "<string>",
"cursor": "<string>",
"perPage": 25,
"status": "open",
"naics": ["<string>"],
"placeIds": ["<string>"],
"placeIdsNone": ["<string>"],
"buyerDescription": "<string>",
"includeSubBuyers": True,
"recordType": [],
"noticeType": [],
"postedAfter": "<string>",
"postedBefore": "<string>",
"modifiedAfter": "<string>",
"modifiedBefore": "<string>",
"respondByAfter": "<string>",
"respondByBefore": "<string>",
"awardedAfter": "<string>",
"awardedBefore": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
cursor: '<string>',
perPage: 25,
status: 'open',
naics: ['<string>'],
placeIds: ['<string>'],
placeIdsNone: ['<string>'],
buyerDescription: '<string>',
includeSubBuyers: true,
recordType: [],
noticeType: [],
postedAfter: '<string>',
postedBefore: '<string>',
modifiedAfter: '<string>',
modifiedBefore: '<string>',
respondByAfter: '<string>',
respondByBefore: '<string>',
awardedAfter: '<string>',
awardedBefore: '<string>'
})
};
fetch('https://app.govly.com/api/tools/v1/opportunities/search', 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://app.govly.com/api/tools/v1/opportunities/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'cursor' => '<string>',
'perPage' => 25,
'status' => 'open',
'naics' => [
'<string>'
],
'placeIds' => [
'<string>'
],
'placeIdsNone' => [
'<string>'
],
'buyerDescription' => '<string>',
'includeSubBuyers' => true,
'recordType' => [
],
'noticeType' => [
],
'postedAfter' => '<string>',
'postedBefore' => '<string>',
'modifiedAfter' => '<string>',
'modifiedBefore' => '<string>',
'respondByAfter' => '<string>',
'respondByBefore' => '<string>',
'awardedAfter' => '<string>',
'awardedBefore' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.govly.com/api/tools/v1/opportunities/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.govly.com/api/tools/v1/opportunities/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/tools/v1/opportunities/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"cursor\": \"<string>\",\n \"perPage\": 25,\n \"status\": \"open\",\n \"naics\": [\n \"<string>\"\n ],\n \"placeIds\": [\n \"<string>\"\n ],\n \"placeIdsNone\": [\n \"<string>\"\n ],\n \"buyerDescription\": \"<string>\",\n \"includeSubBuyers\": true,\n \"recordType\": [],\n \"noticeType\": [],\n \"postedAfter\": \"<string>\",\n \"postedBefore\": \"<string>\",\n \"modifiedAfter\": \"<string>\",\n \"modifiedBefore\": \"<string>\",\n \"respondByAfter\": \"<string>\",\n \"respondByBefore\": \"<string>\",\n \"awardedAfter\": \"<string>\",\n \"awardedBefore\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"title": "<string>",
"displayName": "<string>",
"identifier": "<string>",
"externalUrl": "<string>",
"links": {
"self": "<string>",
"external": "<string>"
},
"recordType": "<string>",
"status": "open",
"postedAt": "2023-11-07T05:31:56Z",
"modifiedAt": "2023-11-07T05:31:56Z",
"respondBy": "2023-11-07T05:31:56Z",
"cancelledAt": "2023-11-07T05:31:56Z",
"awardedAt": "2023-11-07T05:31:56Z",
"aiTitle": "<string>",
"aiSummary": "<string>",
"buyer": {
"id": "<string>",
"name": "<string>",
"domains": [
"<string>"
],
"hierarchy": [
"<string>"
]
},
"locations": [
{
"placeLocationId": "<string>",
"postalCode": "<string>",
"city": "<string>",
"region": "<string>",
"street": "<string>",
"place": "<string>",
"country": "<string>",
"countryCode": "<string>",
"label": "<string>",
"type": "<string>"
}
],
"naics": [
"<string>"
],
"psc": [
"<string>"
],
"nigp": [
"<string>"
],
"unspsc": [
"<string>"
],
"jurisdiction": {
"id": "<string>",
"name": "<string>",
"isoCode": "<string>"
},
"contractVehicle": {
"id": "<string>",
"name": "<string>"
},
"tags": {},
"followerCount": 123,
"followedByCurrentUser": true,
"followedByCurrentOrganization": true,
"workspaces": [
{
"id": "<string>",
"name": "<string>",
"status": {
"category": "<string>",
"label": "<string>"
},
"followerCount": 123,
"follows": [
{
"id": "<string>",
"member": {
"type": "user",
"id": "<string>",
"name": "<string>",
"email": "jsmith@example.com",
"organization": {
"id": "<string>",
"name": "<string>"
}
},
"state": "<string>",
"notifications": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"organizationDefault": true,
"organization": {
"id": "<string>",
"name": "<string>"
},
"followedByCurrentUser": true,
"followedByCurrentOrganization": true
}
]
}
],
"meta": {
"total": 123,
"returnedCount": 123,
"totalIsLowerBound": true,
"perPage": 123,
"searchType": "fed",
"nextCursor": "<string>"
}
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}{
"errors": [
{
"status": "<string>",
"code": "<string>",
"title": "<string>",
"detail": "<string>",
"source": {
"pointer": "<string>"
}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Opaque cursor from the previous response's meta.nextCursor. Omit for the first page.
x <= 100Defaults to open for actionable opportunities. Use all, expired, cancelled, awarded, or not_cancelled for historical or specific lookup requests. Pass an array to match several statuses at once. Prediction records are always excluded.
open, all, expired, cancelled, awarded, not_cancelled NAICS codes to filter by, such as 541519.
Canonical Govly Place ids to filter by, from the place search or list tools. Matches at any administrative level, so a state id also matches opportunities tagged only to a city inside it.
Canonical Govly Place ids to exclude. Same matching rules as placeIds.
Federal buyer in natural language. An unrecognized buyer returns 400; use a more specific name. Not supported for sled or international searches.
Include child agencies when true; use only with buyerDescription. If omitted, buyer selection determines whether children are included. Explicit false searches the selected buyer only.
Restrict published record types. Empty or omitted means all published types. Unsupported values are rejected.
Solicitation, Event, Other Restrict notice types. Empty or omitted adds no restriction. Unsupported values are rejected.
Amendment, Award, Catalog Request, Combined Synopsis, Market Research Request, Presolicitation, Q&A, Reminder, Request for Information, Request for Proposal, Request for Quote, Reverse Auction, Sources Sought, Event, Industry Day, Presolicitation Conference, Site Visit, Justification, Other Market type: fed for federal, sled for state/local/education, international for non-US. Defaults to the authenticated user's market focus (fed or sled). sled and international require the matching organization subscription.
fed, sled, international Only include opportunities posted at or after this date/time. ISO 8601 dates work best.
Only include opportunities posted at or before this date/time. ISO 8601 dates work best.
Only include opportunities modified at or after this date/time. ISO 8601 dates work best.
Only include opportunities modified at or before this date/time. ISO 8601 dates work best.
Only include opportunities with a response deadline at or after this date/time. ISO 8601 dates work best.
Only include opportunities with a response deadline at or before this date/time. ISO 8601 dates work best.
Only include awarded opportunities awarded at or after this date/time. ISO 8601 dates work best.
Only include awarded opportunities awarded at or before this date/time. ISO 8601 dates work best.
modified_at, posted_at, respond_by, relevance asc, desc Was this page helpful?