---
title: "Request a PDF of one case for legal teams, networks or a complaint"
method: POST
path: "/projects/{project_id}/evidence-packs"
tags: ["Case actions"]
---

# Request a PDF of one case for legal teams, networks or a complaint

`POST /projects/{project_id}/evidence-packs`

## Request

- Base URL: `https://adslighthouse.com/api/v1`
- URL: `https://adslighthouse.com/api/v1/projects/{project_id}/evidence-packs`
- Auth: HTTP bearer

Requests an evidence pack PDF for one case: case summary, each observation (search term, engine, location, device, local time with the time zone named, ad copy, display and destination URLs, affiliate parameters, redirect chain when traced), results-page screenshots and landing previews for the newest observations when available (it says when they are not), the case history and notes, and a methodology and limits note. It lists at most the 100 newest observations and says how many were left out. Generated in the background: poll get_case_evidence_pack, then use get_case_evidence_pack_download_link. Idempotent: while a pack for the case as it is now (same observations and timeline), the same time zone and the same branding is queued, running or ready, it is returned (created false). With branding agency the PDF carries the account's report branding instead of ours. Each account can create 30 new packs per UTC day; same plan requirement as PDF reports. An observation shows an ad was displayed for a search at a moment; it does not prove a purchased keyword, spend or infringement.

## Path parameters

- `project_id` string, required: The project: its id, its brand domain (for example nike.example) or its exact project or brand name. Unknown or ambiguous references return not_found; call list_projects then.

## Request body

- object
  - `case_type` 'policy' | 'affiliate', required: policy for a case from list_policy_cases; affiliate for a non-compliant affiliate case from list_affiliate_findings.
  - `case_id` string: The policy case id. Required when case_type is policy.
  - `affiliate_id` string: The affiliate ID exactly as list_affiliate_findings returns it. Required when case_type is affiliate.
  - `branding` 'default' | 'agency': default: our branding. agency: the account's report branding (get_report_branding) on the cover, headers, footers and file properties, with no mention of our name; needs a plan with white-label reports and branding set up.
  - `prepared_for` string: With branding agency: the client name on the cover, up to 120 characters. Defaults to the project name. Part of the idempotency: another name makes another file.

## Response `202`

Request a PDF of one case for legal teams, networks or a complaint

- object
  - `created` boolean, required
  - `pack` object, required
    - `id` string, required
    - `case_type` 'policy' | 'affiliate', required
    - `status` 'queued' | 'running' | 'ready' | 'failed' | 'expired', required: queued and running: still generating. ready: download it. failed: see error. expired: request it again.
    - `error` object, nullable, required
      - `code` 'too_large' | 'unavailable' | 'generation_failed', required
      - `message` string, required
    - `time_zone` string, required: Times in the PDF are shown in this time zone.
    - `requested_at` string, required
    - `completed_at` string, nullable, required
    - `expires_at` string, required: When a ready pack's file is deleted, 7 days after it was generated.
    - `page_count` integer, nullable, required
    - `size_bytes` integer, nullable, required
    - `branding` object, required: The branding the file was requested with.
      - `kind` 'default' | 'agency', required
      - `agency_name` string, nullable, required
      - `prepared_for` string, nullable, required
  - `request_id` string

## Other responses

- `400`: Invalid parameters, cursor or body.
- `401`: Missing, invalid, expired or revoked credential.
- `403`: The credential lacks the write scope, the plan does not include the API, or the allowance is used up.
- `404`: Unknown project, keyword or run in this account.
- `409`: The idempotency key was already used for a different request.
- `429`: Rate limit reached. Retry after the Retry-After seconds.
- `503`: The requested service or file is temporarily unavailable.

---

[API](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api.md) · [All operations](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api/revisions/e1a4a40b11a9?raw)
