---
title: "Download a finished job's sales report."
method: GET
path: "/mcp/jobs/{jobId}/report.pdf"
tags: ["discovery"]
---

# Download a finished job's sales report.

`GET /mcp/jobs/{jobId}/report.pdf`

## Request

- Base URL: `https://api.prosp.cc`
- URL: `https://api.prosp.cc/mcp/jobs/{jobId}/report.pdf`
- Auth: OAuth 2 (client credentials, token URL `https://prosp-mcp-641053169627.auth.eu-central-1.amazoncognito.com/oauth2/token`, scopes: `mcp/execute`)

Renders the job's sales report on request: the same document the Telegram bot sends when a
job completes (executive summary, immediate actions, one outreach draft per delivered
prospect, and the prospect table), without going through the bot. Read-only: it starts no
job, sends nothing to Telegram and changes nothing about the job.

**Credits.** Free. Fetching the report is a read of a document the job's own charge already
covers, so it neither debits credits nor takes an `Idempotency-Key`. It is subject to the
standard per-customer rate limit (100 requests / 60 s). The first request for a language the
job has not been rendered in yet may take longer (up to a few minutes for a large cohort),
because the report text is written then and cached for later requests.

**Formats.** `format=pdf` (default) returns `application/pdf`; `format=html` returns the
self-contained HTML page the PDF is rendered from (`text/html`), which is convenient for
reading or asserting on the text without a PDF parser.

**Language.** `lang` is an ISO 639-1 code from the supported set below. Default: the
language the job was started in, else `en`. Company and person names are never translated.

**Availability.** Only a `completed` or `exhausted` job that delivered at least one prospect
has a report; any other state answers `409 report_not_available`. A job that belongs to another
tenant, a job id that does not exist and a job that has expired all answer the same
`403 not_owner` at the gateway, so an id's existence is never confirmed.

**Cost controls.** Only generating a report that is not cached yet costs anything. Concurrent
requests for the same report share one generation: the others wait briefly, then are served,
or answer `409 report_rendering` with `Retry-After`. A customer's newly generated reports are
capped per UTC day (`429 report_quota_exceeded`, `Retry-After`); already generated reports
stay available. A generation that fails does not use up the daily limit, and requests that
were waiting on it are told at once (`502 render_failed`, `Retry-After`). If report
generation is temporarily unavailable it answers `503 report_gate_unavailable` with
`Retry-After` instead of starting an unguarded generation.

## Query parameters

- `format` 'pdf' | 'html'
- `lang` 'en' | 'uk' | 'de' | 'es' | 'fr' | 'it' | 'nl' | 'pl' | 'cs' | 'no' | 'fi' | 'he' | 'zh' | 'ko'

## Response `200`

The report.

## Other responses

- `400`: `invalid_job_id` (malformed id), `invalid_format` (`format` is not `pdf` or `html`) or `unsupported_language` (`lang` is not in the supported set).
- `401`: Missing/invalid/expired Bearer token.
- `403`: The token's tenant does not own this job.
- `404`: `job_not_found`. Not produced through the public gateway, which answers `403 not_owner` for a foreign, missing and expired job alike; listed because the service behind it answers 404 for all three when reached directly.
- `405`: HTTP method not allowed on this endpoint (rejected before any credit debit).
- `409`: `report_not_available`: the job is not `completed`/`exhausted`, delivered no prospects, or is a counterpart run for which no grounded report can be written; or `report_rendering`: another request is generating this report right now (see `Retry-After`).
- `429`: `rate_limit_exceeded` (100 requests / 60 s per customer) or `report_quota_exceeded` (today's newly generated reports used). See `Retry-After`.
- `502`: `report_generation_failed` or `render_failed`: the report text or the PDF could not be produced right now (`render_failed` is what a request that was waiting on a failed generation receives; it carries `Retry-After`). Safe to retry; `format=html` avoids the PDF renderer.
- `503`: `report_gate_unavailable` (report generation is temporarily unavailable) or `report_capacity` (too many reports are being generated right now). See `Retry-After`.

---

[API](https://skmtc.dev/prosp/apis/prosp-discovery-api.md) · [All operations](https://skmtc.dev/prosp/apis/prosp-discovery-api/llms.txt) · [OpenAPI document](https://skmtc.dev/prosp/apis/prosp-discovery-api/revisions/1f2e0c55da22?raw)
