Govly Opportunities API
Search, fetch, and inspect Govly opportunity records.
Search, fetch, and inspect Govly opportunity records.
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-opportunities-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 Opportunities 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: Opportunities
description: Search, fetch, and inspect Govly opportunity records.
paths:
/api/tools/v1/opportunities:
get:
tags:
- Opportunities
operationId: fetch_opportunities
summary: Fetch opportunities by ID
parameters:
- name: ids
in: query
required: true
style: form
explode: true
schema:
type: array
items:
type: string
responses:
'200':
description: Opportunities
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/Opportunity'
meta:
$ref: '#/components/schemas/CountMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/opportunities/{id}:
get:
tags:
- Opportunities
operationId: show_opportunity
summary: Show an opportunity
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Opportunity
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/Opportunity'
meta:
$ref: '#/components/schemas/ActionMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
/api/tools/v1/opportunities/search:
post:
tags:
- Opportunities
operationId: search_opportunities
summary: Search opportunities
description: 'Search opportunities with the constrained public parameter set shared by MCP search_opportunities. Defaults to open opportunities and excludes prediction records from search results.
'
requestBody:
required: false
content:
application/json:
schema:
type: object
additionalProperties: false
properties:
query:
type: string
cursor:
type: string
description: Opaque cursor from the previous response's meta.nextCursor. Omit for the first page.
perPage:
type: integer
default: 25
maximum: 100
status:
type: string
default: open
enum:
- open
- all
- expired
- cancelled
- awarded
- not_cancelled
description: 'Defaults to open for actionable opportunities. Use all, expired, cancelled, awarded, or not_cancelled for historical or specific lookup requests. Prediction records are always excluded.
'
naics:
type: array
items:
type: string
description: NAICS codes to filter by, such as 541519.
postedAfter:
type: string
description: Only include opportunities posted at or after this date/time. ISO 8601 dates work best.
postedBefore:
type: string
description: Only include opportunities posted at or before this date/time. ISO 8601 dates work best.
modifiedAfter:
type: string
description: Only include opportunities modified at or after this date/time. ISO 8601 dates work best.
modifiedBefore:
type: string
description: Only include opportunities modified at or before this date/time. ISO 8601 dates work best.
respondByAfter:
type: string
description: Only include opportunities with a response deadline at or after this date/time. ISO 8601 dates work best.
respondByBefore:
type: string
description: Only include opportunities with a response deadline at or before this date/time. ISO 8601 dates work best.
awardedAfter:
type: string
description: Only include awarded opportunities awarded at or after this date/time. ISO 8601 dates work best.
awardedBefore:
type: string
description: Only include awarded opportunities awarded at or before this date/time. ISO 8601 dates work best.
sort:
type: string
enum:
- modified_at
- posted_at
- respond_by
- relevance
sortDirection:
type: string
enum:
- asc
- desc
responses:
'200':
description: Matching opportunities
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/Opportunity'
meta:
$ref: '#/components/schemas/CursorMeta'
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/opportunities/{opportunityId}/not_interested:
post:
tags:
- Opportunities
operationId: mark_opportunity_not_interested
summary: Mark an opportunity not interested
description: 'Marks the opportunity not interested / dismissed for the authenticated user. Sets a team-visible disinterested status on the user''s workspace follow, unfollows the user, and dismisses the user''s matching inbox items.
'
parameters:
- name: opportunityId
in: path
required: true
schema:
type: string
description: Govly opportunity ID.
responses:
'201':
description: Opportunity marked not interested
content:
application/json:
schema:
$ref: '#/components/schemas/NotInterestedResult'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
delete:
tags:
- Opportunities
operationId: undo_opportunity_not_interested
summary: Undo a not-interested mark
description: 'Removes a previous not-interested mark for the authenticated user and restores matching dismissed inbox items. The user returns to a neutral (not following) state.
'
parameters:
- name: opportunityId
in: path
required: true
schema:
type: string
description: Govly opportunity ID.
responses:
'200':
description: Not-interested mark removed
content:
application/json:
schema:
$ref: '#/components/schemas/NotInterestedResult'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
components:
schemas:
AvailableAction:
type: object
required:
- name
- description
- arguments
- idPaths
properties:
name:
type: string
description: MCP/tool operation name.
description:
type: string
arguments:
type: object
description: Static arguments to pass to the action.
idPaths:
type: array
description: JSON paths where IDs for this action can be found in the current response.
items:
type: string
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
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
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'
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'
ActionMeta:
type: object
properties:
availableActions:
type: array
description: Structured hints for useful follow-up actions. These are advisory; clients should still rely on tool schemas and authorization.
items:
$ref: '#/components/schemas/AvailableAction'
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
NotInterestedResult:
type: object
required:
- data
properties:
data:
type: object
required:
- id
- type
- notInterested
properties:
id:
type: string
description: Govly opportunity ID.
type:
type: string
enum:
- opportunity
notInterested:
type: boolean
description: Whether the opportunity is now marked not interested for the authenticated user.
meta:
type: object
properties:
oppId:
type: string
undo:
type: boolean
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'
CountMeta:
type: object
required:
- count
properties:
count:
type: integer
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'
parameters:
id:
name: id
in: path
required: true
schema:
type: string
securitySchemes:
bearerApiKey:
type: http
scheme: bearer
bearerFormat: API key
headerApiKey:
type: apiKey
in: header
name: X-API-KEY