List Scans
List scan jobs (source and hosted) ordered by (created_at DESC, job_id DESC) with opaque cursor pagination. Supports filtering by visibility, status, scan type, repository name, source_url, and source_version. Use latest_only=true to collapse repeated scans of the same (source_url, source_version) to the newest row per combo.
Pagination
GET /mcp-hub/scans?limit=20 # first page
GET /mcp-hub/scans?limit=20&cursor=<next_cursor> # subsequent pages
The response includes next_cursor (an opaque base64url string). Pass it back verbatim as the cursor query parameter to fetch the next page. When next_cursor is null you have reached the end of the result set. The cursor is treated as opaque; do not decode or construct it manually.
By default total is not returned. Pass ?include_total=true to opt in β it costs a separate COUNT(*) round-trip per request and is intended only for UIs that need a βShowing X of Nβ counter.
Enterprise data-license feature: requires MCP Hub API access enabled for your organization, otherwise returns 403. Contact support@enkryptai.com.
Authorizations
Query Parameters
Page size (max 200).
1 <= x <= 20050
Opaque pagination cursor returned by the previous response as next_cursor. Omit on the first page. Treat as opaque β do not decode or construct manually.
4096"eyJjcmVhdGVkX2F0IjoiMjAyNi0wNi0yNVQxMTozMjoxMS4xMjM0NTYrMDA6MDAiLCJqb2JfaWQiOiJhYmMtMTIzIn0"
When true, the response includes a total count of rows matching the filters. Costs an extra COUNT(*) round-trip per page request; omit by default for cursor pagination's constant-time-per-page property.
Filter to only official scans (true) or only non-official (false). Omit for both.
Filter to only private scans (true) or only public (false). Omit for both.
Filter by job status
initializing, downloading, discovering_tools, scanning_tools, completed, failed, connecting, discovering, analyzing Case-insensitive substring match on repo / server name
500source or hosted
source, hosted Exact job UUID match
Exact match on source_url.
2000Exact match on source_version (npm version or git commit).
200When true, applies all other filters first, then dedupes results by (source_url, source_version), keeping the newest row per group by created_at. Pagination applies to the deduped list and total reflects the deduped count. Intended for scan_type=source. Returns 400 if the filters would require dedupe over more than 5000 matching rows.
Response
Paginated list of scans
Cursor-paginated list of scans. Page by passing the previous response's next_cursor back as the cursor query parameter. When next_cursor is null you have reached the end of the result set.
The page size used for this response.
Opaque cursor for the next page, or null on the last page. Pass back verbatim as ?cursor=... β treat as opaque.
"eyJjcmVhdGVkX2F0IjoiMjAyNi0wNi0yNVQxMTozMjoxMS4xMjM0NTYrMDA6MDAiLCJqb2JfaWQiOiJhYmMtMTIzIn0"
Total rows matching the filters. Only populated when the request set ?include_total=true; omitted by default because counting arbitrary filtered subsets defeats the point of cursor pagination.

