Govly Inbox API
Read and triage the authenticated user's matched inbox items.
Read and triage the authenticated user's matched inbox items.
openapi: 3.1.0
info:
title: Govly Tools API (Alpha) Awards Inbox 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: Inbox
description: Read and triage the authenticated user's matched inbox items.
paths:
/api/tools/v1/inbox_items:
get:
tags:
- Inbox
operationId: list_inbox_items
summary: List inbox items
description: 'List the authenticated user''s active inbox items (Govly AI matches and saved-search matches), newest first.
'
parameters:
- $ref: '#/components/parameters/cursor'
- $ref: '#/components/parameters/perPage'
responses:
'200':
description: Inbox items
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/InboxItem'
meta:
$ref: '#/components/schemas/CursorMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/search:
post:
tags:
- Inbox
operationId: search_inbox_items
summary: Search inbox items
description: 'Full-text search and filter the authenticated user''s inbox items. Returns matchable-type aggregation counts.
'
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
sort:
type: string
enum:
- ranked_score
- created_at
- deadline_at
sortDirection:
type: string
enum:
- asc
- desc
state:
type: array
items:
type: string
enum:
- unread
- seen
- actioned
- dismissed
matchableType:
type: array
items:
type: string
enum:
- Opp
- Award
- ProcurementSignal::Cluster
recordType:
type: array
items:
type: string
sourceType:
type: string
enum:
- govly_ai
- saved_search
naicsCodes:
type: array
items:
type: string
createdAfter:
type: string
createdBefore:
type: string
deadlineAtFrom:
type: string
deadlineAtTo:
type: string
responses:
'200':
description: Matching inbox items
content:
application/json:
schema:
type: object
required:
- data
- meta
- aggregations
properties:
data:
type: array
items:
$ref: '#/components/schemas/InboxItem'
meta:
$ref: '#/components/schemas/InboxSearchMeta'
aggregations:
$ref: '#/components/schemas/InboxAggregations'
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/{id}:
get:
tags:
- Inbox
operationId: show_inbox_item
summary: Show an inbox item
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Inbox item
content:
application/json:
schema:
$ref: '#/components/schemas/InboxItemEnvelope'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/{id}/accept:
post:
tags:
- Inbox
operationId: accept_inbox_item
summary: Accept (follow) an inbox item
description: 'Follow the underlying opportunity, award, or signal and create or reuse its default workspace. Accept is FINAL and cannot be reversed with restore. The response meta includes the resulting workspaceId.
'
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Accepted inbox item
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
$ref: '#/components/schemas/InboxItem'
meta:
$ref: '#/components/schemas/InboxAcceptMeta'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/{id}/dismiss:
post:
tags:
- Inbox
operationId: dismiss_inbox_item
summary: Dismiss an inbox item
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Dismissed inbox item
content:
application/json:
schema:
$ref: '#/components/schemas/InboxItemEnvelope'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/{id}/decline:
post:
tags:
- Inbox
operationId: decline_inbox_item
summary: Decline (reject) an inbox item as a bad fit
description: 'Mark the item a bad fit, optionally with a reason that feeds the organization''s matching-exclusions memory. Reversible with restore.
'
parameters:
- $ref: '#/components/parameters/id'
requestBody:
required: false
content:
application/json:
schema:
type: object
additionalProperties: false
properties:
reason:
type: string
enum:
- bad_fit
- irrelevant
- cannot_bid
- bad_timing
- other
responses:
'200':
description: Declined inbox item
content:
application/json:
schema:
$ref: '#/components/schemas/InboxItemEnvelope'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
/api/tools/v1/inbox_items/{id}/restore:
post:
tags:
- Inbox
operationId: restore_inbox_item
summary: Restore a dismissed or declined inbox item
description: 'Return a dismissed or bad-fit item to the active inbox. Only dismissed or bad-fit items can be restored — an accepted item cannot.
'
parameters:
- $ref: '#/components/parameters/id'
responses:
'200':
description: Restored inbox item
content:
application/json:
schema:
$ref: '#/components/schemas/InboxItemEnvelope'
'401':
$ref: '#/components/responses/Error'
'403':
$ref: '#/components/responses/Error'
'404':
$ref: '#/components/responses/Error'
'422':
$ref: '#/components/responses/Error'
components:
parameters:
cursor:
name: cursor
in: query
required: false
schema:
type: string
id:
name: id
in: path
required: true
schema:
type: string
perPage:
name: perPage
in: query
required: false
schema:
type: integer
default: 25
maximum: 100
schemas:
InboxItemOrigin:
type: object
required:
- sourceType
properties:
sourceType:
type: string
enum:
- govly_ai
- saved_search
savedSearchId:
type: string
savedSearchName:
type: string
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'
InboxAggregations:
type: object
required:
- matchableType
properties:
matchableType:
type: object
description: Count of matching items per matchable type.
additionalProperties:
type: integer
InboxAcceptMeta:
type: object
required:
- state
- feedback
- matchableType
- matchableId
- final
properties:
state:
type: string
feedback:
type: string
matchableType:
type: string
matchableId:
type: string
workspaceId:
type:
- string
- 'null'
description: Default workspace the accept followed, when one exists.
final:
type: boolean
description: Always true — accept is irreversible.
InboxSearchMeta:
type: object
required:
- total
- nextCursor
properties:
total:
type: integer
description: Total matching items (capped at 10000 by the search index).
nextCursor:
type:
- string
- 'null'
InboxItem:
type: object
required:
- id
- matchableId
- matchableType
- state
- origins
properties:
id:
type: string
matchableId:
type: string
matchableType:
type: string
enum:
- Opp
- Award
- ProcurementSignal::Cluster
state:
type: string
enum:
- unread
- seen
- actioned
- dismissed
feedback:
type: string
enum:
- followed
- dismissed
- bad_fit
feedbackReason:
type: string
enum:
- bad_fit
- irrelevant
- cannot_bid
- bad_timing
- other
title:
type: string
description:
type: string
fitReason:
type: string
fitScore:
type: number
sourceType:
type: string
enum:
- govly_ai
- saved_search
description: How the item first reached the inbox.
identifier:
type: string
recordType:
type: string
deadlineAt:
type: string
format: date-time
postedOrAwardedDate:
type: string
format: date
publicEntityNames:
type: array
items:
type: string
isoCode:
type: string
naicsCodes:
type: array
items:
type: string
createdAt:
type: string
format: date-time
highlight:
type: object
description: Per-field search highlights. Only present on search results.
additionalProperties:
type: string
origins:
type: array
description: Every source that surfaced this (deduped) item.
items:
$ref: '#/components/schemas/InboxItemOrigin'
InboxItemEnvelope:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/InboxItem'
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
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