List saved search matches
curl --request GET \
--url https://app.govly.com/api/enterprise/opportunities/saved_search_matches \
--header 'X-API-KEY: <api-key>'import requests
url = "https://app.govly.com/api/enterprise/opportunities/saved_search_matches"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://app.govly.com/api/enterprise/opportunities/saved_search_matches', 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/enterprise/opportunities/saved_search_matches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$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://app.govly.com/api/enterprise/opportunities/saved_search_matches"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.govly.com/api/enterprise/opportunities/saved_search_matches")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/enterprise/opportunities/saved_search_matches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "<string>",
"title": "<string>",
"uniqueKey": "<string>",
"externalIdentifier": "<string>",
"url": "<string>",
"apiUrl": "<string>",
"externalUrl": "<string>",
"postedAt": "<string>",
"modifiedAt": "<string>",
"respondBy": "<string>",
"questionDeadline": "<string>",
"lastSummarizedAt": "<string>",
"recordType": "<string>",
"jurisdiction": "<string>",
"isoCode": "<string>",
"contractVehicle": "<string>",
"naics": [
"<string>"
],
"aiTitle": "<string>",
"aiSummary": "<string>",
"aiShortSummary": "<string>",
"aiEstimatedValueMin": 123,
"aiEstimatedValueMax": 123,
"aiPeriodOfPerformance": "<string>",
"aiLineItems": {
"products": [
{
"vendor": "<string>",
"product": "<string>",
"quantity": 123,
"description": "<string>",
"partNumber": "<string>"
}
],
"services": [
{
"vendor": "<string>",
"service": "<string>",
"quantity": 123,
"description": "<string>",
"partNumber": "<string>"
}
]
},
"aiRawProducts": [
"<string>"
],
"aiRawVendors": [
{
"name": "<string>",
"website": "<string>"
}
],
"aiRawCompetingProducts": [
"<string>"
],
"aiRawCompetingVendors": [
{
"name": "<string>",
"website": "<string>"
}
],
"description": "<string>",
"latestModificationReason": "<string>",
"productCategoryTags": [
"<string>"
],
"majorEndItem": "<string>",
"warningTags": [
"<string>"
],
"contactName": "<string>",
"contactEmail": "<string>",
"contactPhoneNumber": "<string>",
"address": "<string>",
"buyer": {
"id": "<string>",
"name": "<string>",
"hierarchy": [
"<string>"
],
"hierarchyIds": [
"<string>"
]
},
"attachments": [
{
"checksum": "<string>",
"filename": "<string>",
"url": {}
}
],
"sources": [
{
"id": "<string>",
"noticeType": "<string>",
"recordType": "<string>",
"digest": "<string>",
"externalUrl": "<string>",
"createdAt": "<string>",
"postedAt": "<string>",
"noBidAt": "<string>",
"hasJustification": true,
"hasEvent": true,
"modificationReason": "<string>",
"attachmentChecksums": [
"<string>"
],
"rawEmail": "<string>",
"providerContext": {},
"dataSourceContext": {
"emailMessageChecksum": "<string>",
"rawNoticeType": "<string>",
"rawSetAside": "<string>"
}
}
],
"savedSearchMatches": [
{
"id": "<string>",
"followerEmails": [
"<string>"
],
"savedSearchName": "<string>",
"savedSearchId": "<string>",
"highlights": "<string>",
"matchedAt": "<string>"
}
]
}
],
"meta": {
"nextCursor": "<string>"
}
}Saved Searches
List saved search matches
Retrieve opportunities that match your saved searches
GET
/
api
/
enterprise
/
opportunities
/
saved_search_matches
List saved search matches
curl --request GET \
--url https://app.govly.com/api/enterprise/opportunities/saved_search_matches \
--header 'X-API-KEY: <api-key>'import requests
url = "https://app.govly.com/api/enterprise/opportunities/saved_search_matches"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://app.govly.com/api/enterprise/opportunities/saved_search_matches', 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/enterprise/opportunities/saved_search_matches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$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://app.govly.com/api/enterprise/opportunities/saved_search_matches"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.govly.com/api/enterprise/opportunities/saved_search_matches")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.govly.com/api/enterprise/opportunities/saved_search_matches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "<string>",
"title": "<string>",
"uniqueKey": "<string>",
"externalIdentifier": "<string>",
"url": "<string>",
"apiUrl": "<string>",
"externalUrl": "<string>",
"postedAt": "<string>",
"modifiedAt": "<string>",
"respondBy": "<string>",
"questionDeadline": "<string>",
"lastSummarizedAt": "<string>",
"recordType": "<string>",
"jurisdiction": "<string>",
"isoCode": "<string>",
"contractVehicle": "<string>",
"naics": [
"<string>"
],
"aiTitle": "<string>",
"aiSummary": "<string>",
"aiShortSummary": "<string>",
"aiEstimatedValueMin": 123,
"aiEstimatedValueMax": 123,
"aiPeriodOfPerformance": "<string>",
"aiLineItems": {
"products": [
{
"vendor": "<string>",
"product": "<string>",
"quantity": 123,
"description": "<string>",
"partNumber": "<string>"
}
],
"services": [
{
"vendor": "<string>",
"service": "<string>",
"quantity": 123,
"description": "<string>",
"partNumber": "<string>"
}
]
},
"aiRawProducts": [
"<string>"
],
"aiRawVendors": [
{
"name": "<string>",
"website": "<string>"
}
],
"aiRawCompetingProducts": [
"<string>"
],
"aiRawCompetingVendors": [
{
"name": "<string>",
"website": "<string>"
}
],
"description": "<string>",
"latestModificationReason": "<string>",
"productCategoryTags": [
"<string>"
],
"majorEndItem": "<string>",
"warningTags": [
"<string>"
],
"contactName": "<string>",
"contactEmail": "<string>",
"contactPhoneNumber": "<string>",
"address": "<string>",
"buyer": {
"id": "<string>",
"name": "<string>",
"hierarchy": [
"<string>"
],
"hierarchyIds": [
"<string>"
]
},
"attachments": [
{
"checksum": "<string>",
"filename": "<string>",
"url": {}
}
],
"sources": [
{
"id": "<string>",
"noticeType": "<string>",
"recordType": "<string>",
"digest": "<string>",
"externalUrl": "<string>",
"createdAt": "<string>",
"postedAt": "<string>",
"noBidAt": "<string>",
"hasJustification": true,
"hasEvent": true,
"modificationReason": "<string>",
"attachmentChecksums": [
"<string>"
],
"rawEmail": "<string>",
"providerContext": {},
"dataSourceContext": {
"emailMessageChecksum": "<string>",
"rawNoticeType": "<string>",
"rawSetAside": "<string>"
}
}
],
"savedSearchMatches": [
{
"id": "<string>",
"followerEmails": [
"<string>"
],
"savedSearchName": "<string>",
"savedSearchId": "<string>",
"highlights": "<string>",
"matchedAt": "<string>"
}
]
}
],
"meta": {
"nextCursor": "<string>"
}
}Retrieve opportunities that match your saved searches. Results are paginated and can be filtered by date range, follower email, and saved search IDs.
Query Parameters
string
ISO 8601 timestamp to start searching from. Only returns matches created after this date.
string
ISO 8601 timestamp to search until. Only returns matches created before this date.
string[]
Filter results to specific saved searches. Multiple IDs can be provided to get matches from multiple saved searches.
string[]
Filter matches to only show opportunities from saved searches followed by this email address.
string
Cursor for pagination. Use the
next_cursor value from the meta object in the response to get the next page.integer
default:"50"
Number of results per page (max 100)
Response
array
Array of opportunities with their saved search matches
Show Opportunity properties
Show Opportunity properties
string
Unique identifier for the opportunity
string
Original title from the solicitation
string
Unique identifier key for the opportunity
string
External reference number (e.g., solicitation number)
string
Govly web URL for viewing the opportunity
string
Direct API URL for retrieving this opportunity
string
URL to the original government source
string
ISO 8601 timestamp of when the opportunity was posted
string
ISO 8601 timestamp of the last modification
string
ISO 8601 timestamp of the response deadline
string
ISO 8601 timestamp of the deadline for submitting questions about the opportunity. Returns null when not available from the source data.
string
ISO 8601 timestamp of when the opportunity was last processed by AI
string
Type of record (e.g., “solicitation”, “forecast”, “award”)
string
Jurisdiction name (e.g., “United States”, “California”)
string
Jurisdiction ISO code (e.g., “US”, “US-CA”)
string
Contract vehicle being used for the opportunity
string[]
NAICS (North American Industry Classification System) codes for the opportunity. Only the most specific codes are returned (e.g., 6-digit codes are preferred over sector-level codes). Empty array if none.
string
AI-generated descriptive title
string
AI-generated summary of the opportunity
string
AI-generated short summary (3-6 sentences) that is concise and to the point while preserving key details like OEMs, products, quantities, and part numbers
float
Minimum estimated value of the opportunity in USD
float
Maximum estimated value of the opportunity in USD
string
Description of the performance period for the opportunity
object
Structured breakdown of products and services mentioned in the opportunity
Show Properties
Show Properties
array
string[]
Array of primary product names mentioned in the opportunity
object[]
string[]
Array of competing product names identified in the opportunity
object[]
string
Full opportunity description from the latest source
string
Reason for the most recent modification
string[]
Product category tags associated with the opportunity
string
Major end item from the data source context
string[]
Warning labels for the opportunity. Possible values:
"Brand Name or Equal", "Clearance Likely Required", "Clearance Possibly Required". Empty array if none.string
Primary contact name
string
Primary contact email address
string
Primary contact phone number
string
Primary location address
object
object[]
object[]
Array of source records for this opportunity
Show Properties
Show Properties
string
Unique identifier for the source
string
Type of notice (e.g., “presolicitation”, “solicitation”, “award”)
string
Type of record
string
Unique digest for the source content
string
URL to the original source
string
ISO 8601 timestamp when the source was created in Govly
string
ISO 8601 timestamp when the source was posted
string
ISO 8601 timestamp if a no-bid decision was recorded
boolean
Whether the source includes a justification document
boolean
Whether the source is associated with an event
string
Reason for the modification if this is an amendment
string[]
Array of checksums for attachments associated with this source
string
URL to the raw email if this source came from email (only visible to source owner)
object
Provider-specific context data (only visible to source owner)
array
Array of matches between this opportunity and saved searches
Show Match properties
Show Match properties
string
Unique identifier for the match
string[]
List of email addresses for users following this saved search
string
Name of the saved search that generated this match
string
ID of the saved search that generated this match
string
Highlighted text from the opportunity that matched the saved search criteria
string
ISO 8601 timestamp when the match was created
object
Pagination metadata
Show Meta properties
Show Meta properties
string
Cursor to get the next page of results. Will be null if there are no more results. NOTE: We use cursor pagination instead of page numbers for this endpoint to specifically support large datasets and guarantee consistent pagination over time since matches are immutable.
Was this page helpful?
⌘I