Govly Saved Searches API
List saved opportunity searches and cached matches.
List saved opportunity searches and cached matches.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/govly-saved-searches-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Govly Tools API (Alpha) Awards Saved Searches API
version: 1.0.0-alpha
description: 'ALPHA / UNSTABLE: This API is still in active development. Endpoint behavior, request fields, response fields, error codes, and operation names may change before the Tools API is declared stable.
REST-callable tool surface for agent and automation workflows. Agents are the primary consumer, but integrations can be built on this API. Responses are JSON for typed clients; MCP tools may render action results into text-oriented formats separately.
'
servers:
- url: https://app.govly.com
security:
- bearerApiKey: []
- headerApiKey: []
tags:
- name: Saved Searches
description: List saved opportunity searches and cached matches.
paths:
/api/tools/v1/opportunities/saved_searches:
get:
tags:
- Saved Searches
operationId: list_opportunity_saved_searches
summary: List opportunity saved searches
description: Latest match previews exclude prediction records.
parameters:
- $ref: '#/components/parameters/cursor'
- $ref: '#/components/parameters/perPage'
responses:
'200':
description: Opportunity saved searches
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/OppSearch'
meta:
$ref: '#/components/schemas/CursorMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/opportunities/saved_searches/{id}:
get:
tags:
- Saved Searches
operationId: show_opportunity_saved_search
summary: Show an opportunity saved search
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Opportunity saved search
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/OppSearch'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
/api/tools/v1/opportunities/saved_searches/{savedSearchId}/results:
get:
tags:
- Saved Searches
operationId: list_opportunity_saved_search_results
summary: List cached opportunity results for a saved search
description: Returns cached saved-search matches, excluding prediction records.
parameters:
- $ref: '#/components/parameters/savedSearchId'
- $ref: '#/components/parameters/cursor'
- $ref: '#/components/parameters/perPage'
responses:
'200':
description: Cached saved-search matches
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/OppSearchMatch'
meta:
$ref: '#/components/schemas/CursorMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
components:
parameters:
perPage:
name: perPage
in: query
required: false
schema:
type: integer
default: 25
maximum: 100
cursor:
name: cursor
in: query
required: false
schema:
type: string
id:
name: id
in: path
required: true
schema:
type: string
savedSearchId:
name: savedSearchId
in: path
required: true
schema:
type: string
schemas:
ErrorEnvelope:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
required:
- status
- code
- title
- detail
properties:
status:
type: string
code:
type: string
title:
type: string
detail:
type: string
source:
type: object
properties:
pointer:
type: string
OppSearchMatch:
type: object
required:
- id
- matchedAt
- savedSearchId
- opportunity
properties:
id:
type: string
matchedAt:
type: string
format: date-time
savedSearchId:
type: string
opportunity:
$ref: '#/components/schemas/Opportunity'
CursorMeta:
type: object
required:
- count
properties:
count:
type: integer
description: Number of records in this page.
totalCount:
type: integer
description: 'Total matching records (award search only), capped at 10,000 by the search engine. Pagination via nextCursor is not limited by this cap.
'
perPage:
type: integer
nextCursor:
type:
- string
- 'null'
OpportunitySource:
type: object
required:
- id
- attachments
properties:
id:
type: string
postedAt:
type: string
format: date-time
externalUrl:
type: string
format: uri
noticeType:
type: string
recordType:
type: string
attachments:
type: array
items:
$ref: '#/components/schemas/OpportunityAttachment'
Opportunity:
type: object
required:
- id
properties:
id:
type: string
description: Govly opportunity ID. Use this ID for show requests, workspace associations, and links.
title:
type: string
displayName:
type: string
description: Human-readable opportunity reference, usually source name plus identifier.
identifier:
type: string
description: Public opportunity identifier, such as a solicitation or request number. This may differ from raw source-system IDs when Govly merges related notices.
externalUrl:
type: string
format: uri
recordType:
type: string
status:
type: string
enum:
- open
- expired
- cancelled
- awarded
- forecasted
- unknown
postedAt:
type: string
format: date-time
modifiedAt:
type: string
format: date-time
respondBy:
type: string
format: date-time
cancelledAt:
type: string
format: date-time
awardedAt:
type: string
format: date-time
aiTitle:
type: string
aiSummary:
type: string
jurisdiction:
type: object
properties:
id:
type: string
name:
type: string
isoCode:
type: string
contractVehicle:
type: object
properties:
id:
type: string
name:
type: string
followerCount:
type: integer
description: Count of active follow rows across visible workspaces for this opportunity.
followedByCurrentUser:
type: boolean
description: Whether the authenticated user actively follows any visible workspace for this opportunity.
followedByCurrentOrganization:
type: boolean
description: Whether the authenticated user's organization actively follows any visible workspace for this opportunity.
workspaces:
type: array
description: Visible workspaces associated with this opportunity, including active follow context.
items:
$ref: '#/components/schemas/OpportunityWorkspace'
aggregateAttachments:
type: array
items:
$ref: '#/components/schemas/OpportunityAttachment'
opportunitySources:
type: array
items:
$ref: '#/components/schemas/OpportunitySource'
AttachmentFile:
type: object
description: Presigned download metadata. Omitted when the attachment is redacted or URLs are excluded.
required:
- url
- expiresAt
properties:
url:
type: string
format: uri
expiresAt:
type: string
format: date-time
OpportunityAttachment:
type: object
required:
- id
- documentType
- filename
- redacted
properties:
id:
type: string
description: Canonical OppAttachment.id. Pass this value to document_read and document_download.
documentType:
type: string
const: opportunity_attachment
filename:
type: string
contentType:
type: string
byteSize:
type: integer
redacted:
type: boolean
tags:
type: array
items:
type: string
file:
$ref: '#/components/schemas/AttachmentFile'
OppSearch:
type: object
required:
- id
- name
- active
- criteria
properties:
id:
type: string
name:
type: string
active:
type: boolean
criteria:
type: object
description: Stored search criteria for this saved search.
matchCount:
type: integer
lastMatchedAt:
type: string
format: date-time
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
WorkspaceMember:
type: object
required:
- id
- member
properties:
id:
type: string
state:
type: string
notifications:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
member:
type: object
required:
- type
- id
properties:
type:
type: string
enum:
- user
- team
id:
type: string
name:
type: string
email:
type: string
format: email
organization:
type: object
properties:
id:
type: string
name:
type: string
OpportunityWorkspace:
type: object
required:
- id
- name
- status
- followerCount
- follows
properties:
id:
type: string
name:
type: string
organizationDefault:
type: boolean
organization:
type: object
properties:
id:
type: string
name:
type: string
status:
type: object
required:
- category
- label
properties:
category:
type: string
label:
type: string
followerCount:
type: integer
description: Count of active follow rows on this workspace.
followedByCurrentUser:
type: boolean
followedByCurrentOrganization:
type: boolean
follows:
type: array
description: Active workspace follows. Inactive/unfollowed/disinterested rows are omitted.
items:
$ref: '#/components/schemas/WorkspaceMember'
responses:
Error:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
securitySchemes:
bearerApiKey:
type: http
scheme: bearer
bearerFormat: API key
headerApiKey:
type: apiKey
in: header
name: X-API-KEY