# Buyer API

> For telehealth platforms, clinics and anyone who buys compounded medicine.

Read pharmacy and supplier files from your own software: every item with who checked it, when, and the receipt for the lookup. Free to read. Webhooks are on a paid plan.

[Make a free key](https://www.veritura.co/signup) · [View as Markdown](https://www.veritura.co/buyer-api.md) · [OpenAPI 3.1](https://www.veritura.co/buyer-api/openapi.json) · [llms.txt](https://www.veritura.co/buyer-api/llms.txt)

- **Free to read.** Files, your lookups, your watches and the FDA's lists.
- **300 a minute.** Per workspace, test and live apart.
- **Dated versions.** Pin 2026-10-01 with X-Veritura-Version.
- **A receipt on every item.** Who checked it, when, at which source.

## On this page

- [Start](https://www.veritura.co/buyer-api#start)
- [Keys and modes](https://www.veritura.co/buyer-api#keys)
- [Versioning](https://www.veritura.co/buyer-api#versioning)
- [Pagination](https://www.veritura.co/buyer-api#pagination)
- [Idempotency](https://www.veritura.co/buyer-api#idempotency)
- [Rate limits](https://www.veritura.co/buyer-api#limits)
- [Reading a file](https://www.veritura.co/buyer-api#reading)
- [Endpoints](https://www.veritura.co/buyer-api#endpoints)
- [Webhook](https://www.veritura.co/buyer-api#webhook)
- [Errors](https://www.veritura.co/buyer-api#errors)
- [Clients](https://www.veritura.co/buyer-api#clients)
- [What this is not](https://www.veritura.co/buyer-api#not)
- [Changelog](https://www.veritura.co/buyer-api#changelog)

## Start in two minutes

1. **Make a key.** No workspace yet? [Create a free clinic or telehealth workspace](https://www.veritura.co/signup); it takes a minute. Then in Settings, Developer, choose Make a test key. It is shown once; keep it in your server's secret settings.
2. **Ask for the pharmacy files.** A test key reads a fixed sample with invented names, so you can build before you read anything real. In the examples, replace `vk_test_...` with your key.
3. **Switch to a live key.** The same calls read every published file, your watches and your private lookups.

**curl**

```bash
curl https://www.veritura.co/v1/pharmacies \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { pharmacies } = await veritura.listPharmacies();
console.log(pharmacies.map((p) => p.name));
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

print([p["name"] for p in veritura.list_pharmacies()["pharmacies"]])
```

Call it from your server. A key in a browser or an app can be copied by anyone who opens it.

## Keys and modes

Every key carries one permission, `network:read`, and nothing else: it cannot read your documents, record a decision, issue a passport or change anything in your workspace.

- **Test key.** Starts `vk_test_`. Reads a fixed sample: three published files and two private lookups, all with invented names, the same in every environment. Watches made with it stay in the sample. Every answer says `"mode": "test"`.
- **Live key.** Starts `vk_live_`. Reads every published pharmacy and supplier file, your workspace's watches and your private lookups. Every answer says `"mode": "live"`.

- A key is shown once, when it is made. Veritura keeps only its SHA-256 fingerprint, so a lost key is revoked and a new one made.
- A key lasts 90 days unless you choose a shorter time, and stops at once when it is revoked in Settings, or when the teammate who made it leaves the workspace.
- Send it as `Authorization: Bearer vk_...`. Cookies are never accepted here.

## Versioning

Send `X-Veritura-Version: 2026-10-01` with every request. Every answer carries `X-Veritura-Version` with the version it was answered under. With no header, the latest stable version answers, and that changes when a new version ships: pin the version in production.

| Version | Status | Released |
| --- | --- | --- |
| `2026-10-01` | Latest stable | Oct 1, 2026 |

### What changes without a new version

New endpoints, new optional parameters, new fields in an answer, new error codes and new wording in sentences such as `checkedByWord` or a change's `line`. Write your code to ignore fields it does not know.

### What needs a new version

Removing or renaming a field or an endpoint, changing what a field holds or its type, a new required parameter, and a new value in a field whose values the OpenAPI file lists (such as `kind` or `checkedBy`).

### How long an old version is kept, and how a change is announced

- A breaking change ships only under a new dated version. The version it replaces keeps working for at least 12 months after the new one is released.
- Each new version, and the date the old one stops, is announced in the dated [changelog](https://www.veritura.co/buyer-api#changelog) on the day it ships.
- From that day, every answer under the old version carries `Deprecation` and `Sunset` headers (RFC 9745 and RFC 8594) and a `Link` to this section, so your logs show what still uses it.
- An unknown version is a 400 `version_unknown`, and its `versions` field lists the versions this API accepts.

**curl**

```bash
curl -i https://www.veritura.co/v1/pharmacies \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY!, version: "2026-10-01" });
await veritura.listPharmacies();
console.log(veritura.lastVersion); // "2026-10-01"
```

**Python**

```python
veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"], version="2026-10-01")
veritura.list_pharmacies()
print(veritura.last_version)  # "2026-10-01"
```

**An unknown version** (400)

```json
{
  "error": "\"2026-01-01\" is not a version of this API. Send X-Veritura-Version: 2026-10-01, or leave the header out for the latest stable version.",
  "code": "version_unknown",
  "versions": [
    "2026-10-01"
  ]
}
```

## Pagination

Every list takes `limit` and `cursor` and answers with `next_cursor`. Send `next_cursor` back as `cursor` for the next page; `null` means you have every row.

- A cursor marks a place in the list (the last row you read), not a count of rows. A file published while you page never repeats a row or skips one that was already there; a new row after your place shows up on a later page.
- Treat a cursor as opaque: its contents can change. It belongs to the list, the filters and the key's mode it came from; sent with anything else it is a 400 `cursor_invalid`.
- `offset` is deprecated. `/v1/pharmacies` and `/v1/suppliers` still take `limit` and `offset`, and will until at least Oct 1, 2027. An answer that used `offset` carries `Deprecation`, `Sunset` and `Link` headers. Send `cursor` or `offset`, never both.

| List | limit | Order |
| --- | --- | --- |
| `GET /v1/pharmacies` | 1 to 500, default 100 | Alphabetical |
| `GET /v1/suppliers` | 1 to 500, default 100 | Alphabetical |
| `GET /v1/lookups` | 1 to 500, default 100 | Alphabetical |
| `GET /v1/watches` | 1 to 500 of each, default 100 | Watches oldest first, changes newest first; one cursor pages both |
| `GET /v1/exposure` | 1 to 24, default 24 | The order you named the products; `counts` covers them all |

**curl**

```bash
curl -G https://www.veritura.co/v1/pharmacies -d limit=1 \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"

# then, with next_cursor from that answer:
curl -G https://www.veritura.co/v1/pharmacies -d limit=1 -d cursor=vc1_... \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

// Every page, following next_cursor:
for await (const page of veritura.pharmacyPages({ limit: 100 })) {
  for (const p of page.pharmacies) console.log(p.name);
}

// Or one page at a time:
const first = await veritura.listPharmacies({ limit: 100 });
if (first.next_cursor) await veritura.listPharmacies({ limit: 100, cursor: first.next_cursor });
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

# Every page, following next_cursor:
for page in veritura.pharmacy_pages(limit=100):
    for p in page["pharmacies"]:
        print(p["name"])

# Or one page at a time:
first = veritura.list_pharmacies(limit=100)
if first["next_cursor"]:
    veritura.list_pharmacies(limit=100, cursor=first["next_cursor"])
```

**A first page** (limit=1, from a test key: the cursor works with any test key)

```json
{
  "ok": true,
  "mode": "test",
  "order": "alphabetical",
  "note": "Listed in alphabetical order. Nothing is ranked or graded.",
  "total": 2,
  "limit": 1,
  "next_cursor": "vc1_eyJsIjoicGhhcm1hY2llcyIsInMiOiI2NTIyZDhjNmQzYTc1YmE3IiwiayI6WyJTYW1wbGUgQmF5dmlldyBDb21wb3VuZGluZyIsInZmbF9zYW1wbGVfYmF5dmlldyJdfQ",
  "pharmacies": [
    {
      "id": "vfl_sample_bayview",
      "name": "Sample Bayview Compounding",
      "fileUrl": "/v1/pharmacies/vfl_sample_bayview/file",
      "sample": true
    }
  ]
}
```

## Idempotency

`POST /v1/lookups` and `POST /v1/watches` take an `Idempotency-Key` header. Send a new random key with each new request (a UUID works), and the same key again when you retry that request after a timeout or a dropped connection.

| You send | Within 24 hours you get |
| --- | --- |
| The same key and the same body | The first answer again, with `Idempotent-Replayed: true`. Nothing runs twice. A replay counts toward the 300 a minute, not toward the 10 lookups a minute. |
| The same key and a different body | A 409 `idempotency_key_reused`. Use a new key for a new request. |
| The same key while the first request is still running | A 409 `idempotency_in_progress` with `Retry-After: 1`. |
| The same key after an error | A fresh run: only a successful answer is kept, so fix the request and send it again with the same key. |

- Keys are kept for 24 hours, per workspace and per mode. After that a key is free to use again.
- The body is compared field by field, so the order of the fields does not matter.
- Both clients send a key with every write and reuse it on their own retries. Pass your own key to tie a write to a record in your system.
- `DELETE /v1/watches/{id}` needs no key: a second delete answers 404 and changes nothing.

**curl**

```bash
curl -X POST https://www.veritura.co/v1/watches \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01" \
  -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \
  -H "Content-Type: application/json" \
  -d '{"kind":"pharmacy","id":"vfl_sample_northgate"}'
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const key = crypto.randomUUID(); // keep it with the record it belongs to
const watch = await veritura.watch({ kind: "pharmacy", id: "vfl_sample_northgate" }, { idempotencyKey: key });
console.log(watch.id, veritura.lastReplayed);
```

**Python**

```python
import uuid

key = str(uuid.uuid4())  # keep it with the record it belongs to
watch = veritura.watch("pharmacy", "vfl_sample_northgate", idempotency_key=key)
print(watch["id"], veritura.last_replayed)
```

**The same key with a different body** (409)

```json
{
  "error": "This Idempotency-Key was used in the last 24 hours for a different request. Use a new key for a new request.",
  "code": "idempotency_key_reused"
}
```

## Rate limits

300 requests a minute for each workspace, counted apart for test and live keys, free. A workspace on a paid plan reads 600 a minute, and one with supported API automation (Operations) 1,200 a minute. Running a lookup has its own budget of 10 a minute. Every answer says where you stand:

| Header | What it says |
| --- | --- |
| `X-RateLimit-Limit` | Requests allowed this minute: 300 free, 600 on a paid plan, 1,200 with API automation. |
| `X-RateLimit-Remaining` | Requests left this minute. |
| `X-RateLimit-Reset` | When the minute resets, in Unix seconds. |
| `Retry-After` | On a 429 only: seconds to wait. |

Need more? Higher volume is on a paid plan. [Write to us](https://www.veritura.co/contact) and say what you are building.

## Reading a file

A file lists the items that apply to the firm (a 503A pharmacy, a 503B outsourcing facility, a maker or a distributor). Each item says what it reads now, who checked it, when, and how; findings sit apart, first. What was not checked says so, in words, and is never read as clean.

### Who checked it

| checkedBy | checkedByWord, as it reads | What it means |
| --- | --- | --- |
| `public_source` | Public source lookup | Veritura ran a lookup at the source itself (the FDA, openFDA, NPPES, OIG) on the date shown. The receipt keeps the query and the answer. |
| `independent_person` | Checked at the issuer by Casey Park, Sample Lakeside Clinic | Someone independent of the firm opened the issuer's own record and recorded what it said, with their name and company. |
| `self` | Recorded by the pharmacy's own staff | The firm checked itself. Shown as its own record, never as an independent confirmation. |
| `document` | Read by Veritura | Veritura read the document line by line against the rule it answers to. |
| `claim` | Typed in; nobody checked it at the issuer | A value someone typed. Nothing checked it. |

### The receipt

Every item that was checked carries a `receipt`: which source was asked, the query, the date and what came back.

| Field | What it holds | In the sample |
| --- | --- | --- |
| `source` | The source asked. | FDA registered outsourcing facilities |
| `query` | What was asked. | `"Sample Northgate Outsourcing"` |
| `capturedAt` | The date it was asked. | 2026-10-21 |
| `result` | What the source returned. | "Sample Northgate Outsourcing" is on the FDA's list of registered outsourcing facilities. |
| `url` | A link to the source, https only. | https://www.fda.gov/drugs/human-drug-compounding/registered-outsourcing-facilities |
| `hash` | SHA-256 of the captured row. | 30b7b49e1541d91a... |

### For telehealth buyers

Every file also carries `telehealth`: LegitScript for the website it sells through, the states it is licensed in, the pharmacist in charge with the OIG screen, and its "essentially a copy" practice. And `exposure`: where each product stands on the FDA's public lists, with the source and the date of each list. Facts, never a verdict; whether a preparation may be compounded is the pharmacy's and the prescriber's call.

`completeness` counts what is on file and how it was checked, never a rating: `checked` is the items a public source, someone independent of the firm, the issuer or Veritura's own read answered, out of `applicable`; `selfRecorded` is the firm's own records, which are never counted as checked and read `"state": "self_recorded"`. Compare two files item by item, never by their counts: a firm with more items checked is not a better firm.

## Endpoints

Base URL `https://www.veritura.co`. Every success is `{ "ok": true, "mode": ..., ... }`. Lists are alphabetical unless they say otherwise; nothing is ranked.

### List published pharmacy files

`GET /v1/pharmacies`

Published pharmacy files, in alphabetical order. Each row carries the facts a buyer reads before opening the file: when the public sources were last looked up, how many findings came from them, the states it is licensed in, and how many documents were read. Paged with `limit` and `cursor`.

| Parameter | What it is |
| --- | --- |
| `q` | Part of the name. Up to 80 characters. |
| `state` | Home state, two letters: TX. |
| `npi` | The 10-digit NPI. |
| `limit` | 1 to 500. Default 100. |
| `cursor` | `next_cursor` from the page before. |
| `offset` | Deprecated: use `cursor`. Works until at least Oct 1, 2027. |

**curl**

```bash
curl -G https://www.veritura.co/v1/pharmacies \
  -d state=TX -d limit=50 \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

for await (const page of veritura.pharmacyPages({ state: "TX", limit: 50 })) {
  for (const p of page.pharmacies) console.log(p.name, p.facts?.findings ?? 0, "findings");
}
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

for page in veritura.pharmacy_pages(state="TX", limit=50):
    for p in page["pharmacies"]:
        print(p["name"], p["facts"]["findings"], "findings")
```

**Example response** (From a test key: the sample data)

```json
{
  "ok": true,
  "mode": "test",
  "order": "alphabetical",
  "note": "Listed in alphabetical order. Nothing is ranked or graded.",
  "total": 2,
  "limit": 100,
  "next_cursor": null,
  "pharmacies": [
    {
      "id": "vfl_sample_bayview",
      "slug": "sample-bayview-compounding",
      "url": "",
      "name": "Sample Bayview Compounding",
      "side": "pharmacy",
      "kind": "pharmacy",
      "profile": {
        "logoDataUrl": "",
        "headline": "",
        "location": "",
        "website": "",
        "specialties": [],
        "presentations": [],
        "authored": "The firm's own words. Veritura does not establish them."
      },
      "documents": [],
      "kindLabel": "503A compounding pharmacy",
      "homeState": "TX",
      "npi": "",
      "publishedAt": "2026-08-08",
      "lastRefreshAt": "2026-10-21",
      "facts": {
        "checked": 6,
        "applicable": 26,
        "notChecked": 18,
        "selfRecorded": 2,
        "coverage": "6 of 26 items checked",
        "lastLookedUp": "2026-10-21",
        "publicFindings": 0,
        "documentFindings": 0,
        "recordsFindings": 0,
        "findings": 0,
        "licensedStates": [],
        "selfLicensedStates": [
          "TX"
        ],
        "certificatesRead": 2,
        "testReportsRead": 2,
        "supplierCertificatesRead": 0,
        "credentials": []
      },
      "fileUrl": "/v1/pharmacies/vfl_sample_bayview/file",
      "sample": true,
      "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
    },
    {
      "id": "vfl_sample_northgate",
      "slug": "sample-northgate-outsourcing",
      "url": "",
      "name": "Sample Northgate Outsourcing",
      "side": "pharmacy",
      "kind": "outsourcing",
      "profile": {
        "logoDataUrl": "",
        "headline": "",
        "location": "",
        "website": "",
        "specialties": [],
        "presentations": [],
        "authored": "The firm's own words. Veritura does not establish them."
      },
      "documents": [],
      "kindLabel": "503B outsourcing facility",
      "homeState": "FL",
      "npi": "",
      "publishedAt": "2026-08-08",
      "lastRefreshAt": "2026-10-21",
      "facts": {
        "checked": 5,
        "applicable": 26,
        "notChecked": 20,
        "selfRecorded": 1,
        "coverage": "5 of 26 items checked",
        "lastLookedUp": "2026-10-21",
        "publicFindings": 1,
        "documentFindings": 0,
        "recordsFindings": 0,
        "findings": 1,
        "licensedStates": [],
        "selfLicensedStates": [
          "FL"
        ],
        "certificatesRead": 0,
        "testReportsRead": 0,
        "supplierCertificatesRead": 0,
        "credentials": []
      },
      "fileUrl": "/v1/pharmacies/vfl_sample_northgate/file",
      "sample": true,
      "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
    }
  ]
}
```

### Read one published pharmacy file

`GET /v1/pharmacies/{id}/file`

The same file a buyer reads on the pharmacy's public page, as data. Findings come first. Each item says who checked it (`checkedBy`, `checkedByWord`), when, and carries its receipt. An unpublished file does not exist here: the answer is 404.

| Parameter | What it is |
| --- | --- |
| `id` | The file id (vfl_...) or its public name, as in /pharmacy/harbor-compounding. |

**curl**

```bash
curl https://www.veritura.co/v1/pharmacies/vfl_sample_northgate/file \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { file } = await veritura.getPharmacyFile("vfl_sample_northgate");
console.log(file.answer.line);
for (const f of file.findings) console.log("Finding:", f.label, f.at, f.checkedByWord);
for (const item of file.items.filter((i) => i.applies && i.checkedHere)) {
  console.log(item.label, item.stateWord, item.checkedByWord, item.receipt?.source ?? "");
}
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

file = veritura.get_pharmacy_file("vfl_sample_northgate")["file"]
print(file["answer"]["line"])
for item in file["items"]:
    if item["applies"] and item["checkedHere"]:
        print(item["label"], item["stateWord"], item["checkedByWord"])
```

**Example response** (Shortened: the full file lists all 37 items of the catalogue; 26 apply to this pharmacy and are counted (completeness.applicable), and the rest carry applies: false)

```json
{
  "ok": true,
  "mode": "test",
  "file": {
    "id": "vfl_sample_northgate",
    "slug": "sample-northgate-outsourcing",
    "url": "",
    "side": "pharmacy",
    "kind": "outsourcing",
    "kindLabel": "503B outsourcing facility",
    "name": "Sample Northgate Outsourcing",
    "homeState": "FL",
    "npi": "",
    "publishedAt": "2026-08-08",
    "lastRefreshAt": "2026-10-21",
    "asOf": "2026-10-22",
    "publishedAtTime": "2026-08-08T16:00:00.000Z",
    "lastRefreshAtTime": "2026-10-21T06:00:00.000Z",
    "statement": "Veritura checks paperwork and records at their source and reads documents against the rule each must meet. This page is not an approval, a certification or a rating of the pharmacy, and it says nothing about any medicine. Veritura does not sell medicine, route orders or rank pharmacies.",
    "completeness": {
      "checked": 5,
      "confirmed": 5,
      "applicable": 26,
      "bySelf": 1,
      "selfRecorded": 1,
      "claimed": 0,
      "notChecked": 20,
      "notApplicable": 10,
      "catalogue": 37,
      "line": "5 of 26 items checked",
      "detail": "5 of 26 items checked · 1 recorded by the pharmacy itself, not checked · 20 not checked here",
      "appliesTo": "the items that apply to a 503B outsourcing facility",
      "uncounted": 1,
      "note": "The full file has 37 items: 26 counted here, 1 shown but not counted (adverse event signals, which never establish cause), and 10 that do not apply to a 503B outsourcing facility. An item is checked when a public source, someone independent of the pharmacy, the issuer or Veritura's own read answered it; a finding counts as checked information. 1 more was recorded by the pharmacy's own staff and is not counted as checked. This is a count of what is on file and how it was checked, never a rating."
    },
    "findings": [
      {
        "item": "inspections",
        "label": "FDA inspections: classification, citations, 483s",
        "from": "source",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "summary": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
        "at": "2026-10-16",
        "severity": "medium",
        "by": {
          "kind": "source",
          "name": "FDA Data Dashboard: inspections",
          "note": "Run by Veritura's weekly refresh"
        },
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "receipt": {
          "id": "src_68ce43c25525a03fa82f",
          "source": "FDA Data Dashboard: inspections",
          "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm",
          "query": "\"Sample Northgate Outsourcing\"",
          "capturedAt": "2026-10-16",
          "sourceCurrentAs": "",
          "result": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
          "by": "Veritura source worker",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "c1a58aa38cd7b892841f25d3c08d4daa8a4d2232d11153e18f48f71a8e906519"
        },
        "source": {
          "title": "FDA Data Dashboard: inspections, citations, compliance actions",
          "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm"
        },
        "checks": [],
        "details": [
          {
            "date": "2026-08-08",
            "classification": "Voluntary Action Indicated",
            "citations": "2"
          }
        ],
        "retired": null
      }
    ],
    "pic": {
      "name": "",
      "nameFrom": "",
      "board": {
        "state": "missing",
        "stateWord": "Not checked here",
        "routeWord": "Not checked here",
        "at": "",
        "summary": "Nothing on record yet."
      },
      "oig": {
        "state": "verified",
        "stateWord": "No match in the list as loaded",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "summary": "Nothing on record for \"Sample Northgate Outsourcing\" in HHS OIG List of Excluded Individuals/Entities."
      }
    },
    "groups": [
      {
        "key": "identity",
        "label": "Who they are",
        "items": [
          "permit",
          "pic",
          "nonresident",
          "npi",
          "dea",
          "fda_registration",
          "entity"
        ]
      },
      {
        "key": "accreditation",
        "label": "Accreditation",
        "items": [
          "pcab",
          "lab_17025",
          "quality_agreement"
        ]
      }
    ],
    "items": [
      {
        "id": "fda_registration",
        "group": "identity",
        "label": "FDA registration",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "\"Sample Northgate Outsourcing\" is on the FDA's list of registered outsourcing facilities.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "FDA registered outsourcing facilities",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_47784e557fcb0c4d68db",
          "source": "FDA registered outsourcing facilities",
          "url": "https://www.fda.gov/drugs/human-drug-compounding/registered-outsourcing-facilities",
          "query": "\"Sample Northgate Outsourcing\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "\"Sample Northgate Outsourcing\" is on the FDA's list of registered outsourcing facilities.",
          "by": "Veritura source worker",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "30b7b49e1541d91af30574d840c3c10712efa1d03f4c08291b0f9f721a1e5cef"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-20",
        "retired": null,
        "how": "An outsourcing facility is matched on the FDA's registered outsourcing facilities list; a maker or repackager in the FDA's establishment registration. Registration is not approval.",
        "source": {
          "title": "FDA drug establishments current registration site (DECRS)",
          "url": "https://www.fda.gov/drugs/drug-approvals-and-databases/drug-establishments-current-registration-site-decrs"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "inspections",
        "group": "fda",
        "label": "FDA inspections: classification, citations, 483s",
        "applies": true,
        "counted": true,
        "state": "finding",
        "stateWord": "Finding on record",
        "tone": "critical",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Finding on record",
        "howMark": "bad",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-16",
        "by": {
          "kind": "source",
          "name": "FDA Data Dashboard: inspections",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_68ce43c25525a03fa82f",
          "source": "FDA Data Dashboard: inspections",
          "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm",
          "query": "\"Sample Northgate Outsourcing\"",
          "capturedAt": "2026-10-16",
          "sourceCurrentAs": "",
          "result": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
          "by": "Veritura source worker",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "c1a58aa38cd7b892841f25d3c08d4daa8a4d2232d11153e18f48f71a8e906519"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-15",
        "retired": null,
        "how": "The FDA's Data Dashboard: each inspection's classification (no action, voluntary action, official action indicated), its citations and any published 483. State inspections are not in the FDA's data.",
        "source": {
          "title": "FDA Data Dashboard: inspections, citations, compliance actions",
          "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "warning_letters",
        "group": "fda",
        "label": "FDA warning letters",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Northgate Outsourcing\" in FDA warning letters.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "FDA warning letters",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_eb3a7be97be8549c43e5",
          "source": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters",
          "query": "\"Sample Northgate Outsourcing\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Northgate Outsourcing\" in FDA warning letters.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "d3adc5eecd16eab1e4fe38bcfb09e6db11ea88fdd6b714d152b7be3bea6b0d96"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-04",
        "retired": null,
        "how": "The FDA's warning letter database, searched by the firm's name.",
        "source": {
          "title": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "permit",
        "group": "identity",
        "label": "State license, home state",
        "applies": true,
        "counted": true,
        "state": "stale",
        "stateWord": "Due for a re-check",
        "tone": "attention",
        "checkedHere": false,
        "onRecord": true,
        "howWord": "Recorded by the pharmacy itself",
        "howMark": "self",
        "checkedBy": "self",
        "checkedByWord": "Recorded by the pharmacy's own staff",
        "summary": "Active, name and number match (FL).",
        "route": "source_person",
        "routeWord": "Checked at source",
        "at": "2026-09-12",
        "by": {
          "kind": "person",
          "name": "Riley Chen, Sample Northgate Outsourcing",
          "note": ""
        },
        "receipt": {
          "id": "src_6e1c315480db0ff21133",
          "source": "Checked at the issuer's source by a person",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/",
          "query": "Active, name and number match (FL).",
          "capturedAt": "2026-09-12",
          "sourceCurrentAs": "",
          "result": "Active, name and number match (FL).",
          "by": "[email withheld]",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "7a9752680f7c6d5823b6e8dc73d7b45f4ba34b177077442a7e87e3360a68bac6"
        },
        "docName": "",
        "checks": [],
        "expires": "2026-11-11",
        "daysLeft": 20,
        "nextCheck": "2026-10-12",
        "retired": null,
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "source": {
          "title": "State board of pharmacy license lookup",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/"
        },
        "history": [],
        "askable": "permit"
      },
      {
        "id": "wdd",
        "group": "identity",
        "label": "FDA wholesale distributor reporting",
        "applies": false
      }
    ],
    "licensedStates": [],
    "selfLicensedStates": [
      "FL"
    ],
    "notCheckedHere": [
      {
        "id": "pic",
        "label": "Pharmacist in charge",
        "why": "Nothing on record yet.",
        "how": "Named on the board record where the board shows it (Florida, Texas). Where it does not (California, Illinois), the board's permit record or letter is requested. The PIC's own license is checked too.",
        "askable": "pic"
      },
      {
        "id": "nonresident",
        "label": "Licensed in every state it ships to",
        "why": "Nothing on record yet.",
        "how": "Each state its units reach needs a nonresident permit, and California needs its separate sterile compounding license. A state it ships to with no permit on record is a gap.",
        "askable": "nonresident"
      }
    ],
    "notCheckedLine": "20 of 26 items not checked here: ask for all",
    "askAll": [
      "pic",
      "nonresident",
      "dea",
      "entity",
      "pcab",
      "lab_17025",
      "quality_agreement",
      "state_inspection",
      "sterility",
      "endotoxin",
      "potency",
      "bud",
      "stability",
      "cold_chain",
      "validation",
      "outsourcing_duties"
    ],
    "askAllUrl": "",
    "blocks": {
      "licences": [
        {
          "state": "FL",
          "kind": "Home state license",
          "home": true,
          "result": "ok",
          "resultWord": "Recorded as active",
          "howMark": "self",
          "current": true,
          "tone": "neutral",
          "routeWord": "",
          "at": "2026-09-12",
          "expires": "2026-11-11",
          "by": {
            "kind": "person",
            "name": "Riley Chen, Sample Northgate Outsourcing",
            "note": ""
          },
          "checkedBy": "self",
          "checkedByWord": "Recorded by the pharmacy's own staff"
        }
      ]
    },
    "options": {
      "upstream": {
        "on": false,
        "since": "",
        "withdrawnAt": "",
        "supplierNames": false
      },
      "permits": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "readiness": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "operations": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "copies": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      }
    },
    "asks": {
      "open": 0,
      "answered": 0,
      "buyers": 0,
      "medianAnswerDays": null,
      "window": "180 days",
      "line": "No buyer has asked this pharmacy for a document through Veritura yet."
    },
    "doors": null,
    "howToRead": [
      {
        "route": "Matched at source",
        "means": "A lookup ran against the issuer's own public source. The receipt records the query, the time and what the source returned."
      },
      {
        "route": "Answered by the issuer in writing",
        "means": "The issuer answered in writing. The reply is kept."
      }
    ],
    "whoChecked": [
      {
        "mark": "Public source lookup",
        "means": "Veritura ran a lookup at the source itself (the FDA, openFDA, NPPES, OIG) on the date shown. The receipt keeps the query and the answer."
      },
      {
        "mark": "Checked at the issuer by a named person",
        "means": "Someone independent of the pharmacy, such as a buyer's staff, opened the issuer's own record and recorded what it said, with their name, job title and company."
      },
      {
        "mark": "Recorded by the pharmacy's own staff",
        "means": "The pharmacy checked itself and recorded what the issuer's record said. Shown in grey with who recorded it, never as an independent confirmation."
      },
      {
        "mark": "Read by Veritura",
        "means": "Veritura read the document itself, line by line, against the rule it answers to."
      }
    ],
    "answer": {
      "facts": [
        "FDA and OIG: 1 finding (FDA inspection, 2026-10-16).",
        "Licenses: FL recorded by the pharmacy itself, not checked independently.",
        "Test reports: none read yet."
      ],
      "coverage": "5 of 26 items checked, 1 more recorded by the pharmacy itself; 20 not checked here. A count of what is on file, never a score.",
      "documentsRead": 0,
      "documentsOpen": 0,
      "documentsBad": 0,
      "supplierCertificatesRead": 0,
      "supplierCertificatesOwed": 0,
      "supplierCertificates": null,
      "line": "FDA and OIG: 1 finding (FDA inspection, 2026-10-16). Licenses: FL recorded by the pharmacy itself, not checked independently. Test reports: none read yet.",
      "boundary": "Facts from the file below, each with its source and date. Never a grade or a rank of the pharmacy."
    },
    "glance": [
      {
        "key": "license:FL",
        "label": "FL license",
        "word": "",
        "who": "recorded by the pharmacy",
        "at": "2026-09-12",
        "checkedBy": "self",
        "tone": "neutral",
        "line": "FL license · recorded by the pharmacy · 2026-09-12"
      },
      {
        "key": "fda_registration",
        "label": "FDA 503B list",
        "word": "",
        "who": "matched at the source",
        "at": "2026-10-21",
        "checkedBy": "public_source",
        "tone": "positive",
        "line": "FDA 503B list · matched at the source · 2026-10-21"
      },
      {
        "key": "fda",
        "label": "FDA and OIG records",
        "word": "1 finding",
        "who": "matched at the source",
        "at": "2026-10-21",
        "checkedBy": "public_source",
        "tone": "critical",
        "line": "FDA and OIG records · 1 finding · matched at the source · 2026-10-21"
      }
    ],
    "telehealth": {
      "website": "",
      "websiteLine": "No website on file",
      "legitscript": {
        "applies": false,
        "naWord": "No website on file",
        "line": "No website on file. LegitScript and NABP's digital pharmacy list cover the website a pharmacy sells through, and this file names none."
      },
      "nabpDigital": {
        "applies": false,
        "naWord": "No website on file"
      },
      "states": {
        "home": "FL",
        "list": [
          {
            "state": "FL",
            "kind": "home",
            "status": "home",
            "resultWord": "Recorded as active",
            "tone": "neutral",
            "current": true,
            "checkedBy": "self",
            "checkedByWord": "Recorded by the pharmacy's own staff",
            "at": "2026-09-12",
            "expires": "2026-11-11"
          }
        ],
        "licensed": [],
        "selfRecorded": [
          "FL"
        ],
        "negative": [],
        "map": [
          {
            "state": "AK",
            "x": 0,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "ME",
            "x": 10,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "VT",
            "x": 9,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "NH",
            "x": 10,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "WA",
            "x": 0,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ID",
            "x": 1,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MT",
            "x": 2,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ND",
            "x": 3,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MN",
            "x": 4,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "IL",
            "x": 5,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "WI",
            "x": 6,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MI",
            "x": 7,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "NY",
            "x": 8,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "RI",
            "x": 9,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MA",
            "x": 10,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "OR",
            "x": 0,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NV",
            "x": 1,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "WY",
            "x": 2,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "SD",
            "x": 3,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IA",
            "x": 4,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IN",
            "x": 5,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "OH",
            "x": 6,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "PA",
            "x": 7,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NJ",
            "x": 8,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CT",
            "x": 9,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CA",
            "x": 0,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "UT",
            "x": 1,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "CO",
            "x": 2,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "NE",
            "x": 3,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MO",
            "x": 4,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "KY",
            "x": 5,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "WV",
            "x": 6,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "VA",
            "x": 7,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MD",
            "x": 8,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "DE",
            "x": 9,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "AZ",
            "x": 1,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NM",
            "x": 2,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "KS",
            "x": 3,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "AR",
            "x": 4,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "TN",
            "x": 5,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NC",
            "x": 6,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "SC",
            "x": 7,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "DC",
            "x": 8,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "OK",
            "x": 3,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "LA",
            "x": 4,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "MS",
            "x": 5,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "AL",
            "x": 6,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "GA",
            "x": 7,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "HI",
            "x": 0,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "TX",
            "x": 3,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "FL",
            "x": 8,
            "y": 7,
            "status": "home",
            "word": "Recorded as active"
          }
        ],
        "source": "The licenses on file",
        "note": "The newest record of each state license and nonresident permit on this file, with who checked it."
      },
      "pic": {
        "name": "",
        "nameFrom": "",
        "board": {
          "state": "missing",
          "stateWord": "Not checked here",
          "routeWord": "Not checked here",
          "at": "",
          "summary": "Nothing on record yet."
        },
        "oig": {
          "state": "verified",
          "stateWord": "No match in the list as loaded",
          "routeWord": "Matched at source",
          "at": "2026-10-21",
          "summary": "Nothing on record for \"Sample Northgate Outsourcing\" in HHS OIG List of Excluded Individuals/Entities."
        }
      },
      "copies": {
        "item": {
          "applies": false,
          "naWord": "Does not apply"
        },
        "block": {
          "on": false,
          "withdrawnAt": ""
        }
      }
    },
    "exposure": {
      "asOf": "2026-10-22",
      "products": [],
      "pharmacy": [
        {
          "key": "warning_letters",
          "label": "The FDA's warning letters",
          "state": "nothing_on_record",
          "tone": "neutral",
          "at": "2026-10-21",
          "line": "Nothing on record for \"Sample Northgate Outsourcing\" in FDA warning letters.",
          "receipt": {
            "id": "src_eb3a7be97be8549c43e5",
            "source": "FDA warning letters",
            "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters",
            "query": "\"Sample Northgate Outsourcing\"",
            "capturedAt": "2026-10-21",
            "sourceCurrentAs": "",
            "result": "Nothing on record for \"Sample Northgate Outsourcing\" in FDA warning letters.",
            "by": "Veritura source worker",
            "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
            "hash": "d3adc5eecd16eab1e4fe38bcfb09e6db11ea88fdd6b714d152b7be3bea6b0d96"
          },
          "source": {
            "title": "FDA warning letters",
            "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters"
          }
        },
        {
          "key": "fda_actions",
          "label": "The FDA's compounding actions",
          "state": "not_run",
          "tone": "neutral",
          "at": "",
          "line": "Not checked here. Nothing on record yet.",
          "receipt": null,
          "source": {
            "title": "FDA compounding: inspections, recalls, and other actions",
            "url": "https://www.fda.gov/drugs/human-drug-compounding/compounding-inspections-recalls-and-other-actions"
          }
        },
        {
          "key": "inspections",
          "label": "FDA inspections",
          "state": "finding",
          "tone": "critical",
          "at": "2026-10-16",
          "line": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
          "receipt": {
            "id": "src_68ce43c25525a03fa82f",
            "source": "FDA Data Dashboard: inspections",
            "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm",
            "query": "\"Sample Northgate Outsourcing\"",
            "capturedAt": "2026-10-16",
            "sourceCurrentAs": "",
            "result": "FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations.",
            "by": "Veritura source worker",
            "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
            "hash": "c1a58aa38cd7b892841f25d3c08d4daa8a4d2232d11153e18f48f71a8e906519"
          },
          "source": {
            "title": "FDA Data Dashboard: inspections, citations, compliance actions",
            "url": "https://datadashboard.fda.gov/oii/cd/inspections.htm"
          }
        }
      ],
      "counts": {
        "products": 0,
        "substances": 0,
        "factsToRead": 0,
        "pharmacyFindings": 1
      },
      "note": "Where each substance stands on the FDA's public lists, with the source and the date of each list. Facts only: whether a preparation may be compounded is the pharmacy's and the prescriber's call, and no list settles it alone.",
      "sources": [
        {
          "label": "21 CFR 216.23 and the FDA's 503A categories",
          "url": "https://www.fda.gov/drugs/human-drug-compounding/bulk-drug-substances-used-compounding"
        },
        {
          "label": "21 CFR 216.23",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.23"
        },
        {
          "label": "21 CFR 216.24",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.24"
        },
        {
          "label": "The FDA's 503A category list, updated May 14, 2026",
          "url": "https://www.fda.gov/media/94155/download"
        },
        {
          "label": "The FDA's drug shortage database",
          "url": "https://dps.fda.gov/drugshortages"
        },
        {
          "label": "The FDA's NDC directory (openFDA)",
          "url": "https://open.fda.gov/apis/drug/ndc/"
        },
        {
          "label": "Section 503A(b)(1)(D) and (b)(2), and the FDA's 2018 guidance on essentially copies",
          "url": "https://www.fda.gov/media/98973/download"
        },
        {
          "label": "The FDA's establishment registry (DECRS)",
          "url": "https://www.accessdata.fda.gov/scripts/cder/drls/"
        }
      ]
    },
    "readAtTime": "2026-10-22T00:28:43.788Z",
    "profile": {
      "logoDataUrl": "",
      "headline": "",
      "location": "",
      "website": "",
      "specialties": [],
      "presentations": [],
      "authored": "The firm's own words. Veritura does not establish them."
    },
    "documents": [],
    "documentsLine": "",
    "sample": true,
    "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
  }
}
```

### List published supplier files

`GET /v1/suppliers`

The same, for the bulk suppliers and makers that publish a file through their free supplier account. Paged with `limit` and `cursor`.

| Parameter | What it is |
| --- | --- |
| `q` | Part of the name. |
| `state` | Home state, two letters. |
| `limit` | 1 to 500. Default 100. |
| `cursor` | `next_cursor` from the page before. |
| `offset` | Deprecated: use `cursor`. |

**curl**

```bash
curl -G https://www.veritura.co/v1/suppliers \
  -d q=meridian \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { suppliers, next_cursor } = await veritura.listSuppliers({ q: "meridian" });
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

suppliers = veritura.list_suppliers(q="meridian")["suppliers"]
```

**Example response** (From a test key)

```json
{
  "ok": true,
  "mode": "test",
  "order": "alphabetical",
  "note": "Listed in alphabetical order. Nothing is ranked or graded.",
  "total": 1,
  "limit": 100,
  "next_cursor": null,
  "suppliers": [
    {
      "id": "vfl_sample_meridian",
      "slug": "sample-meridian-supply",
      "url": "",
      "name": "Sample Meridian Supply",
      "side": "supplier",
      "kind": "distributor",
      "profile": {
        "logoDataUrl": "",
        "headline": "",
        "location": "",
        "website": "",
        "specialties": [],
        "presentations": [],
        "authored": "The firm's own words. Veritura does not establish them."
      },
      "documents": [],
      "kindLabel": "Bulk distributor or repackager",
      "homeState": "NJ",
      "npi": "",
      "publishedAt": "2026-08-08",
      "lastRefreshAt": "2026-10-21",
      "facts": {
        "checked": 4,
        "applicable": 11,
        "notChecked": 6,
        "selfRecorded": 1,
        "coverage": "4 of 11 items checked",
        "lastLookedUp": "2026-10-21",
        "publicFindings": 0,
        "documentFindings": 0,
        "recordsFindings": 0,
        "findings": 0,
        "licensedStates": [],
        "selfLicensedStates": [],
        "certificatesRead": 0,
        "testReportsRead": 0,
        "supplierCertificatesRead": 0,
        "credentials": []
      },
      "fileUrl": "/v1/suppliers/vfl_sample_meridian/file",
      "sample": true,
      "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
    }
  ]
}
```

### Read one published supplier file

`GET /v1/suppliers/{id}/file`

One supplier's published file, in the same shape as a pharmacy file.

| Parameter | What it is |
| --- | --- |
| `id` | The file id (vfl_...) or its public name. |

**curl**

```bash
curl https://www.veritura.co/v1/suppliers/vfl_sample_meridian/file \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { file } = await veritura.getSupplierFile("vfl_sample_meridian");
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

file = veritura.get_supplier_file("vfl_sample_meridian")["file"]
```

**Example response** (Shortened, from a test key)

```json
{
  "ok": true,
  "mode": "test",
  "file": {
    "id": "vfl_sample_meridian",
    "slug": "sample-meridian-supply",
    "url": "",
    "side": "supplier",
    "kind": "distributor",
    "kindLabel": "Bulk distributor or repackager",
    "name": "Sample Meridian Supply",
    "homeState": "NJ",
    "npi": "",
    "publishedAt": "2026-08-08",
    "lastRefreshAt": "2026-10-21",
    "asOf": "2026-10-22",
    "publishedAtTime": "2026-08-08T17:00:00.000Z",
    "lastRefreshAtTime": "2026-10-21T06:00:00.000Z",
    "statement": "Veritura checks paperwork and records at their source and reads documents against the rule each must meet. This page is not an approval, a certification or a rating of the supplier, and it says nothing about any ingredient. Veritura does not sell ingredients, route orders or rank suppliers.",
    "completeness": {
      "checked": 4,
      "confirmed": 4,
      "applicable": 11,
      "bySelf": 1,
      "selfRecorded": 1,
      "claimed": 0,
      "notChecked": 6,
      "notApplicable": 26,
      "catalogue": 37,
      "line": "4 of 11 items checked",
      "detail": "4 of 11 items checked · 1 recorded by the supplier itself, not checked · 6 not checked here",
      "appliesTo": "the items that apply to a bulk distributor or repackager",
      "uncounted": 0,
      "note": "The full file has 37 items: 11 counted here, and 26 that do not apply to a bulk distributor or repackager. An item is checked when a public source, someone independent of the supplier, the issuer or Veritura's own read answered it; a finding counts as checked information. 1 more was recorded by the supplier's own staff and is not counted as checked. This is a count of what is on file and how it was checked, never a rating."
    },
    "findings": [],
    "pic": null,
    "groups": [
      {
        "key": "identity",
        "label": "Who they are",
        "items": [
          "permit",
          "fda_registration",
          "wdd",
          "entity"
        ]
      },
      {
        "key": "accreditation",
        "label": "Accreditation",
        "items": [
          "lab_17025",
          "quality_agreement"
        ]
      }
    ],
    "items": [
      {
        "id": "fda_registration",
        "group": "identity",
        "label": "FDA registration",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "\"Sample Meridian Supply\" is listed in the FDA's establishment registration.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "FDA drug establishments current registration site (DECRS)",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_b70dc7b81f0168f03b20",
          "source": "FDA drug establishments current registration site (DECRS)",
          "url": "https://www.fda.gov/drugs/drug-approvals-and-databases/drug-establishments-current-registration-site-decrs",
          "query": "\"Sample Meridian Supply\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "\"Sample Meridian Supply\" is listed in the FDA's establishment registration.",
          "by": "Veritura source worker",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "a3aae48824a51541bc86956469acb455a3dc47eed778d6f983a652fe1e7eb573"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-20",
        "retired": null,
        "how": "An outsourcing facility is matched on the FDA's registered outsourcing facilities list; a maker or repackager in the FDA's establishment registration. Registration is not approval.",
        "source": {
          "title": "FDA drug establishments current registration site (DECRS)",
          "url": "https://www.fda.gov/drugs/drug-approvals-and-databases/drug-establishments-current-registration-site-decrs"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "warning_letters",
        "group": "fda",
        "label": "FDA warning letters",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Meridian Supply\" in FDA warning letters.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "FDA warning letters",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_521ec52835fa42844174",
          "source": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters",
          "query": "\"Sample Meridian Supply\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Meridian Supply\" in FDA warning letters.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "255510ba35fb12e8b26afa799df40bddcbfbe7fd79c40a5573811bc4fe1088ef"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-04",
        "retired": null,
        "how": "The FDA's warning letter database, searched by the firm's name.",
        "source": {
          "title": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "recalls",
        "group": "fda",
        "label": "Recalls",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Meridian Supply\" in openFDA drug enforcement reports.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "openFDA drug enforcement reports",
          "note": "Run by Veritura's weekly refresh"
        },
        "receipt": {
          "id": "src_a9df9ab4864f6415e1c4",
          "source": "openFDA drug enforcement reports",
          "url": "https://api.fda.gov/drug/enforcement.json",
          "query": "\"Sample Meridian Supply\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Meridian Supply\" in openFDA drug enforcement reports.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "b3a7ce264c0a2f127fb35534c10e8e834bfc1866759f859706effecaaff5bcec"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-10-28",
        "retired": null,
        "how": "openFDA enforcement reports, searched by recalling firm: class, reason, lots, distribution. There is no compounding flag, so the match is by name.",
        "source": {
          "title": "openFDA drug enforcement reports",
          "url": "https://open.fda.gov/apis/drug/enforcement/"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "permit",
        "group": "identity",
        "label": "State license, home state",
        "applies": true,
        "counted": true,
        "state": "self_recorded",
        "stateWord": "Recorded by the supplier",
        "tone": "neutral",
        "checkedHere": false,
        "onRecord": true,
        "howWord": "Recorded by the supplier itself",
        "howMark": "self",
        "checkedBy": "self",
        "checkedByWord": "Recorded by the supplier's own staff",
        "summary": "Recorded by the supplier's own staff, not checked independently: Active, name and number match (NJ).",
        "route": "source_person",
        "routeWord": "Recorded by the supplier's own staff",
        "at": "2026-10-10",
        "by": {
          "kind": "person",
          "name": "Morgan Diaz, Sample Meridian Supply",
          "note": ""
        },
        "receipt": {
          "id": "src_eebf54da33f4037075a4",
          "source": "Recorded by the supplier's own staff from the issuer's record",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/",
          "query": "Active, name and number match (NJ).",
          "capturedAt": "2026-10-10",
          "sourceCurrentAs": "",
          "result": "Active, name and number match (NJ).",
          "by": "The supplier's own staff",
          "limitation": "The capture establishes only the recorded public-source observation and date. It does not establish approval, compliance, authenticity, safety, or product quality.",
          "hash": "c511c014789f6c36e6ccb9b846df5e993c09a75b8de708165c67d31e56aafd03"
        },
        "docName": "",
        "checks": [],
        "expires": "2027-06-19",
        "daysLeft": 240,
        "nextCheck": "2026-11-09",
        "retired": null,
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "source": {
          "title": "State board of pharmacy license lookup",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/"
        },
        "history": [],
        "askable": "permit"
      },
      {
        "id": "pic",
        "group": "identity",
        "label": "Pharmacist in charge",
        "applies": false
      }
    ],
    "licensedStates": [],
    "selfLicensedStates": [],
    "notCheckedHere": [
      {
        "id": "wdd",
        "label": "FDA wholesale distributor reporting",
        "why": "Nothing on record yet.",
        "how": "A person searches the FDA's wholesale distributor and 3PL database for the firm's annual report. The FDA says a report there is not a license.",
        "askable": ""
      },
      {
        "id": "entity",
        "label": "Business entity in good standing",
        "why": "Nothing on record yet.",
        "how": "A person checks the state's business entity search: active, and the registered name matches.",
        "askable": "entity"
      }
    ],
    "notCheckedLine": "6 of 11 items not checked here",
    "askAll": [],
    "askAllUrl": "",
    "blocks": {},
    "options": {
      "upstream": {
        "on": false,
        "since": "",
        "withdrawnAt": "",
        "supplierNames": false
      },
      "permits": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "readiness": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "operations": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "copies": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      }
    },
    "asks": null,
    "doors": {
      "pharmacies": 0,
      "answered": 0,
      "open": 0,
      "medianAnswerDays": null,
      "line": "No pharmacy's document request link is kept in this supplier's account yet."
    },
    "howToRead": [
      {
        "route": "Matched at source",
        "means": "A lookup ran against the issuer's own public source. The receipt records the query, the time and what the source returned."
      },
      {
        "route": "Answered by the issuer in writing",
        "means": "The issuer answered in writing. The reply is kept."
      }
    ],
    "whoChecked": [
      {
        "mark": "Public source lookup",
        "means": "Veritura ran a lookup at the source itself (the FDA, openFDA, NPPES, OIG) on the date shown. The receipt keeps the query and the answer."
      },
      {
        "mark": "Checked at the issuer by a named person",
        "means": "Someone independent of the supplier, such as a buyer's staff, opened the issuer's own record and recorded what it said, with their name, job title and company."
      },
      {
        "mark": "Recorded by the supplier's own staff",
        "means": "The supplier checked itself and recorded what the issuer's record said. Shown in grey with who recorded it, never as an independent confirmation."
      },
      {
        "mark": "Read by Veritura",
        "means": "Veritura read the document itself, line by line, against the rule it answers to."
      }
    ],
    "answer": {
      "facts": [
        "FDA and OIG: no finding in the lookups that ran.",
        "Test reports: none read yet."
      ],
      "coverage": "4 of 11 items checked, 1 more recorded by the supplier itself; 6 not checked here. A count of what is on file, never a score.",
      "documentsRead": 0,
      "documentsOpen": 0,
      "documentsBad": 0,
      "supplierCertificatesRead": 0,
      "supplierCertificatesOwed": 0,
      "supplierCertificates": null,
      "line": "FDA and OIG: no finding in the lookups that ran. Test reports: none read yet.",
      "boundary": "Facts from the file below, each with its source and date. Never a grade or a rank of the supplier."
    },
    "glance": [
      {
        "key": "fda_registration",
        "label": "FDA registration",
        "word": "",
        "who": "matched at the source",
        "at": "2026-10-21",
        "checkedBy": "public_source",
        "tone": "positive",
        "line": "FDA registration · matched at the source · 2026-10-21"
      },
      {
        "key": "fda",
        "label": "FDA and OIG records",
        "word": "no finding",
        "who": "matched at the source",
        "at": "2026-10-21",
        "checkedBy": "public_source",
        "tone": "positive",
        "line": "FDA and OIG records · no finding · matched at the source · 2026-10-21"
      }
    ],
    "telehealth": null,
    "exposure": null,
    "readAtTime": "2026-10-22T00:28:43.798Z",
    "profile": {
      "logoDataUrl": "",
      "headline": "",
      "location": "",
      "website": "",
      "specialties": [],
      "presentations": [],
      "authored": "The firm's own words. Veritura does not establish them."
    },
    "documents": [],
    "documentsLine": "",
    "sample": true,
    "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
  }
}
```

### List your private lookups

`GET /v1/lookups`

The files your workspace keeps about pharmacies, including pharmacies that never published one. Private: only your workspace's keys see them, and another workspace gets 404 for their ids. Paged with `limit` and `cursor`.

| Parameter | What it is |
| --- | --- |
| `limit` | 1 to 500. Default 100. |
| `cursor` | `next_cursor` from the page before. |

**curl**

```bash
curl https://www.veritura.co/v1/lookups \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

for await (const page of veritura.lookupPages()) {
  for (const l of page.lookups) console.log(l.name, l.publishedByPharmacy ? "published" : "not published", l.findings);
}
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

for page in veritura.lookup_pages():
    for l in page["lookups"]:
        print(l["name"], l["findings"])
```

**Example response** (From a test key)

```json
{
  "ok": true,
  "mode": "test",
  "order": "alphabetical",
  "note": "Private to this workspace. Listed in alphabetical order; nothing is ranked or graded.",
  "total": 2,
  "limit": 100,
  "next_cursor": null,
  "lookups": [
    {
      "id": "vfl_sample_lk_harbor",
      "name": "Sample Harborline Pharmacy",
      "instant": false,
      "kind": "pharmacy",
      "kindLabel": "503A compounding pharmacy",
      "homeState": "CO",
      "createdAt": "2026-10-16",
      "lastRefreshAt": "2026-10-21",
      "publishedByPharmacy": false,
      "findings": 0,
      "completeness": "3 of 26 items checked",
      "lookupUrl": "/v1/lookups/vfl_sample_lk_harbor",
      "sample": true,
      "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
    },
    {
      "id": "vfl_sample_lk_river",
      "name": "Sample Riverside Pharmacy",
      "instant": false,
      "kind": "pharmacy",
      "kindLabel": "503A compounding pharmacy",
      "homeState": "AZ",
      "createdAt": "2026-10-10",
      "lastRefreshAt": "2026-10-21",
      "publishedByPharmacy": false,
      "findings": 0,
      "completeness": "5 of 26 items checked",
      "lookupUrl": "/v1/lookups/vfl_sample_lk_river",
      "sample": true,
      "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
    }
  ]
}
```

### Run a lookup, or refresh one

`POST /v1/lookups`

Look up any pharmacy by name or NPI, the way the workspace does: NPPES, the FDA's compounding actions, warning letters and Data Dashboard, openFDA recalls and OIG, each answer with its receipt, kept private to your workspace. A lookup of the same pharmacy in the last day is returned as it is unless you send `force`; with `watch: true` it is watched too, so the weekly look-up tells you when its record changes. 10 lookups a minute per workspace. Send an `Idempotency-Key` so a retry never runs it twice. A test key never asks a public source: every source reads "Not checked here" and nothing is stored.

| Parameter | What it is |
| --- | --- |
| `q` | The pharmacy's name, or its 10-digit NPI. |
| `state` | Optional. Two letters, to narrow a name. |
| `force` | Optional. true asks the sources again now. |
| `watch` | Optional. true watches the lookup. |
| `Idempotency-Key` | Optional header. A new random key per request; the same key on a retry. |

**curl**

```bash
curl -X POST https://www.veritura.co/v1/lookups \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01" \
  -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \
  -H "Content-Type: application/json" \
  -d '{"q":"Riverside Pharmacy","state":"AZ","watch":true}'
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

// The client sends a new Idempotency-Key with each call and reuses it on its own retries.
const { lookup, reused, watch } = await veritura.runLookup({ q: "Riverside Pharmacy", state: "AZ", watch: true });
console.log(lookup.basis, reused, watch?.id);
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

# The client sends a new Idempotency-Key with each call and reuses it on its own retries.
r = veritura.run_lookup(q="Riverside Pharmacy", state="AZ", watch=True)
print(r["lookup"]["basis"], r["reused"])
```

**Example response** (Shortened, from a test key: nothing is stored)

```json
{
  "ok": true,
  "mode": "test",
  "lookup": {
    "id": "vfl_test_566059124b",
    "slug": "",
    "url": "",
    "side": "pharmacy",
    "kind": "pharmacy",
    "kindLabel": "503A compounding pharmacy",
    "name": "Riverside Pharmacy",
    "homeState": "AZ",
    "npi": "",
    "publishedAt": "",
    "lastRefreshAt": "",
    "asOf": "2026-10-22",
    "publishedAtTime": "",
    "lastRefreshAtTime": "",
    "statement": "Veritura checks paperwork and records at their source and reads documents against the rule each must meet. This page is not an approval, a certification or a rating of the pharmacy, and it says nothing about any medicine. Veritura does not sell medicine, route orders or rank pharmacies.",
    "completeness": {
      "checked": 0,
      "confirmed": 0,
      "applicable": 26,
      "bySelf": 0,
      "selfRecorded": 0,
      "claimed": 0,
      "notChecked": 26,
      "notApplicable": 10,
      "catalogue": 37,
      "line": "0 of 26 items checked",
      "detail": "0 of 26 items checked · 26 not checked here",
      "appliesTo": "the items that apply to a 503A pharmacy",
      "uncounted": 1,
      "note": "The full file has 37 items: 26 counted here, 1 shown but not counted (adverse event signals, which never establish cause), and 10 that do not apply to a 503A pharmacy. An item is checked when a public source, someone independent of the pharmacy, the issuer or Veritura's own read answered it; a finding counts as checked information. This is a count of what is on file and how it was checked, never a rating."
    },
    "findings": [],
    "pic": {
      "name": "",
      "nameFrom": "",
      "board": {
        "state": "missing",
        "stateWord": "Not checked here",
        "routeWord": "Not checked here",
        "at": "",
        "summary": "Nothing on record yet."
      },
      "oig": {
        "state": "not_run",
        "stateWord": "Not checked here",
        "routeWord": "Not checked here",
        "at": "",
        "summary": "OIG publishes a monthly file and no API; it runs once the file is loaded. Until then a person can check OIG's online search."
      }
    },
    "groups": [
      {
        "key": "identity",
        "label": "Who they are",
        "items": [
          "permit",
          "pic",
          "nonresident",
          "npi",
          "dea",
          "entity"
        ]
      },
      {
        "key": "accreditation",
        "label": "Accreditation",
        "items": [
          "pcab",
          "achc",
          "nabp_compounding",
          "lab_17025"
        ]
      }
    ],
    "items": [
      {
        "id": "permit",
        "group": "identity",
        "label": "State license, home state",
        "applies": true,
        "counted": true,
        "state": "missing",
        "stateWord": "Not checked here",
        "tone": "neutral",
        "checkedHere": false,
        "onRecord": false,
        "howWord": "Not checked here",
        "howMark": "missing",
        "checkedBy": "",
        "checkedByWord": "",
        "summary": "Nothing on record yet.",
        "route": "",
        "routeWord": "Not checked here",
        "at": "",
        "by": null,
        "receipt": null,
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "",
        "retired": null,
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "source": {
          "title": "State board of pharmacy license lookup",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/"
        },
        "history": [],
        "askable": "permit"
      },
      {
        "id": "fda_registration",
        "group": "identity",
        "label": "FDA registration",
        "applies": false
      }
    ],
    "licensedStates": [],
    "selfLicensedStates": [],
    "notCheckedHere": [
      {
        "id": "permit",
        "label": "State license, home state",
        "why": "Nothing on record yet.",
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "askable": "permit"
      },
      {
        "id": "pic",
        "label": "Pharmacist in charge",
        "why": "Nothing on record yet.",
        "how": "Named on the board record where the board shows it (Florida, Texas). Where it does not (California, Illinois), the board's permit record or letter is requested. The PIC's own license is checked too.",
        "askable": "pic"
      }
    ],
    "notCheckedLine": "26 of 26 items not checked here: ask for all",
    "askAll": [
      "permit",
      "pic",
      "nonresident",
      "dea",
      "entity",
      "pcab",
      "achc",
      "nabp_compounding",
      "lab_17025",
      "state_inspection",
      "sterility",
      "endotoxin",
      "potency",
      "bud",
      "stability",
      "cold_chain",
      "validation",
      "copies"
    ],
    "askAllUrl": "",
    "blocks": {
      "licences": []
    },
    "options": {
      "upstream": {
        "on": false,
        "since": "",
        "withdrawnAt": "",
        "supplierNames": false
      },
      "permits": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "readiness": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "operations": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "copies": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      }
    },
    "asks": null,
    "doors": null,
    "howToRead": [
      {
        "route": "Matched at source",
        "means": "A lookup ran against the issuer's own public source. The receipt records the query, the time and what the source returned."
      },
      {
        "route": "Answered by the issuer in writing",
        "means": "The issuer answered in writing. The reply is kept."
      }
    ],
    "whoChecked": [
      {
        "mark": "Public source lookup",
        "means": "Veritura ran a lookup at the source itself (the FDA, openFDA, NPPES, OIG) on the date shown. The receipt keeps the query and the answer."
      },
      {
        "mark": "Checked at the issuer by a named person",
        "means": "Someone independent of the pharmacy, such as a buyer's staff, opened the issuer's own record and recorded what it said, with their name, job title and company."
      },
      {
        "mark": "Recorded by the pharmacy's own staff",
        "means": "The pharmacy checked itself and recorded what the issuer's record said. Shown in grey with who recorded it, never as an independent confirmation."
      },
      {
        "mark": "Read by Veritura",
        "means": "Veritura read the document itself, line by line, against the rule it answers to."
      }
    ],
    "answer": {
      "facts": [
        "FDA: not looked up yet. OIG's exclusion list: not looked up here.",
        "Licenses: none on file yet.",
        "Test reports: none read yet."
      ],
      "coverage": "0 of 26 items checked; 26 not checked here. A count of what is on file, never a score.",
      "documentsRead": 0,
      "documentsOpen": 0,
      "documentsBad": 0,
      "supplierCertificatesRead": 0,
      "supplierCertificatesOwed": 0,
      "supplierCertificates": null,
      "line": "FDA: not looked up yet. OIG's exclusion list: not looked up here. Licenses: none on file yet. Test reports: none read yet.",
      "boundary": "Facts from the file below, each with its source and date. Never a grade or a rank of the pharmacy."
    },
    "glance": [
      {
        "key": "oig",
        "label": "OIG exclusions",
        "word": "not looked up here",
        "who": "",
        "at": "",
        "checkedBy": "",
        "tone": "neutral",
        "line": "OIG exclusions · not looked up here"
      }
    ],
    "telehealth": {
      "website": "",
      "websiteLine": "No website on file",
      "legitscript": {
        "applies": false,
        "naWord": "No website on file",
        "line": "No website on file. LegitScript and NABP's digital pharmacy list cover the website a pharmacy sells through, and this file names none."
      },
      "nabpDigital": {
        "applies": false,
        "naWord": "No website on file"
      },
      "states": {
        "home": "AZ",
        "list": [],
        "licensed": [],
        "selfRecorded": [],
        "negative": [],
        "map": [
          {
            "state": "AK",
            "x": 0,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "ME",
            "x": 10,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "VT",
            "x": 9,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "NH",
            "x": 10,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "WA",
            "x": 0,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ID",
            "x": 1,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MT",
            "x": 2,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ND",
            "x": 3,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MN",
            "x": 4,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "IL",
            "x": 5,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "WI",
            "x": 6,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MI",
            "x": 7,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "NY",
            "x": 8,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "RI",
            "x": 9,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MA",
            "x": 10,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "OR",
            "x": 0,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NV",
            "x": 1,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "WY",
            "x": 2,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "SD",
            "x": 3,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IA",
            "x": 4,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IN",
            "x": 5,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "OH",
            "x": 6,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "PA",
            "x": 7,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NJ",
            "x": 8,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CT",
            "x": 9,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CA",
            "x": 0,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "UT",
            "x": 1,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "CO",
            "x": 2,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "NE",
            "x": 3,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MO",
            "x": 4,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "KY",
            "x": 5,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "WV",
            "x": 6,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "VA",
            "x": 7,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MD",
            "x": 8,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "DE",
            "x": 9,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "AZ",
            "x": 1,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NM",
            "x": 2,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "KS",
            "x": 3,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "AR",
            "x": 4,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "TN",
            "x": 5,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NC",
            "x": 6,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "SC",
            "x": 7,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "DC",
            "x": 8,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "OK",
            "x": 3,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "LA",
            "x": 4,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "MS",
            "x": 5,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "AL",
            "x": 6,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "GA",
            "x": 7,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "HI",
            "x": 0,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "TX",
            "x": 3,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "FL",
            "x": 8,
            "y": 7,
            "status": "none",
            "word": ""
          }
        ],
        "source": "The licenses on file",
        "note": "No state license is on file yet."
      },
      "pic": {
        "name": "",
        "nameFrom": "",
        "board": {
          "state": "missing",
          "stateWord": "Not checked here",
          "routeWord": "Not checked here",
          "at": "",
          "summary": "Nothing on record yet."
        },
        "oig": {
          "state": "not_run",
          "stateWord": "Not checked here",
          "routeWord": "Not checked here",
          "at": "",
          "summary": "OIG publishes a monthly file and no API; it runs once the file is loaded. Until then a person can check OIG's online search."
        }
      },
      "copies": {
        "item": {
          "applies": true,
          "state": "missing",
          "stateWord": "Not checked here",
          "howWord": "Not checked here",
          "howMark": "missing",
          "tone": "neutral",
          "checkedHere": false,
          "onRecord": false,
          "checkedBy": "",
          "checkedByWord": "",
          "at": "",
          "summary": "Nothing on record yet.",
          "askable": "copies",
          "receipt": null
        },
        "block": {
          "on": false,
          "withdrawnAt": ""
        }
      }
    },
    "exposure": {
      "asOf": "2026-10-22",
      "products": [],
      "pharmacy": [],
      "counts": {
        "products": 0,
        "substances": 0,
        "factsToRead": 0,
        "pharmacyFindings": 0
      },
      "note": "Where each substance stands on the FDA's public lists, with the source and the date of each list. Facts only: whether a preparation may be compounded is the pharmacy's and the prescriber's call, and no list settles it alone.",
      "sources": [
        {
          "label": "21 CFR 216.23 and the FDA's 503A categories",
          "url": "https://www.fda.gov/drugs/human-drug-compounding/bulk-drug-substances-used-compounding"
        },
        {
          "label": "21 CFR 216.23",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.23"
        },
        {
          "label": "21 CFR 216.24",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.24"
        },
        {
          "label": "The FDA's 503A category list, updated May 14, 2026",
          "url": "https://www.fda.gov/media/94155/download"
        },
        {
          "label": "The FDA's drug shortage database",
          "url": "https://dps.fda.gov/drugshortages"
        },
        {
          "label": "The FDA's NDC directory (openFDA)",
          "url": "https://open.fda.gov/apis/drug/ndc/"
        },
        {
          "label": "Section 503A(b)(1)(D) and (b)(2), and the FDA's 2018 guidance on essentially copies",
          "url": "https://www.fda.gov/media/98973/download"
        },
        {
          "label": "The FDA's establishment registry (DECRS)",
          "url": "https://www.accessdata.fda.gov/scripts/cder/drls/"
        }
      ]
    },
    "instant": true,
    "private": true,
    "publishedByPharmacy": false,
    "basis": "Not published by the pharmacy: public sources and your own workspace's checks only.",
    "createdAt": "",
    "lookedUpAt": "2026-10-22T00:28:43.792Z",
    "refreshedWeekly": true,
    "watching": false,
    "changes": [],
    "sample": true,
    "sampleNote": "A test key never asks a public source, so every source reads \"Not checked here\" and nothing is stored. A live key runs the lookup and keeps it private to your workspace."
  },
  "reused": false,
  "stored": false,
  "watch": null
}
```

### Read one private lookup

`GET /v1/lookups/{id}`

One lookup, item by item, in the shape of a published file, with `private`, `publishedByPharmacy` and a `basis` line that says, in words, whether the pharmacy published. An instant lookup adds `lookupSummary`, the public sources asked; `exposure` covers the products you receive from that pharmacy.

| Parameter | What it is |
| --- | --- |
| `id` | The lookup id (vfl_...). |

**curl**

```bash
curl https://www.veritura.co/v1/lookups/vfl_sample_lk_harbor \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { lookup } = await veritura.getLookup("vfl_sample_lk_harbor");
console.log(lookup.basis);
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

print(veritura.get_lookup("vfl_sample_lk_harbor")["lookup"]["basis"])
```

**Example response** (Shortened, from a test key)

```json
{
  "ok": true,
  "mode": "test",
  "lookup": {
    "id": "vfl_sample_lk_harbor",
    "slug": "",
    "url": "",
    "side": "pharmacy",
    "kind": "pharmacy",
    "kindLabel": "503A compounding pharmacy",
    "name": "Sample Harborline Pharmacy",
    "homeState": "CO",
    "npi": "",
    "publishedAt": "",
    "lastRefreshAt": "2026-10-21",
    "asOf": "2026-10-22",
    "publishedAtTime": "",
    "lastRefreshAtTime": "2026-10-21T06:00:00.000Z",
    "statement": "Veritura checks paperwork and records at their source and reads documents against the rule each must meet. This page is not an approval, a certification or a rating of the pharmacy, and it says nothing about any medicine. Veritura does not sell medicine, route orders or rank pharmacies.",
    "completeness": {
      "checked": 3,
      "confirmed": 3,
      "applicable": 26,
      "bySelf": 0,
      "selfRecorded": 0,
      "claimed": 0,
      "notChecked": 23,
      "notApplicable": 10,
      "catalogue": 37,
      "line": "3 of 26 items checked",
      "detail": "3 of 26 items checked · 23 not checked here",
      "appliesTo": "the items that apply to a 503A pharmacy",
      "uncounted": 1,
      "note": "The full file has 37 items: 26 counted here, 1 shown but not counted (adverse event signals, which never establish cause), and 10 that do not apply to a 503A pharmacy. An item is checked when a public source, someone independent of the pharmacy, the issuer or Veritura's own read answered it; a finding counts as checked information. This is a count of what is on file and how it was checked, never a rating."
    },
    "findings": [],
    "pic": {
      "name": "",
      "nameFrom": "",
      "board": {
        "state": "missing",
        "stateWord": "Not checked here",
        "routeWord": "Not checked here",
        "at": "",
        "summary": "Nothing on record yet."
      },
      "oig": {
        "state": "verified",
        "stateWord": "No match in the list as loaded",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "summary": "Nothing on record for \"Sample Harborline Pharmacy\" in HHS OIG List of Excluded Individuals/Entities."
      }
    },
    "groups": [
      {
        "key": "identity",
        "label": "Who they are",
        "items": [
          "permit",
          "pic",
          "nonresident",
          "npi",
          "dea",
          "entity"
        ]
      },
      {
        "key": "accreditation",
        "label": "Accreditation",
        "items": [
          "pcab",
          "achc",
          "nabp_compounding",
          "lab_17025"
        ]
      }
    ],
    "items": [
      {
        "id": "warning_letters",
        "group": "fda",
        "label": "FDA warning letters",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Harborline Pharmacy\" in FDA warning letters.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "FDA warning letters",
          "note": "Run by Veritura"
        },
        "receipt": {
          "id": "src_00e24772b76eef5c3421",
          "source": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters",
          "query": "\"Sample Harborline Pharmacy\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Harborline Pharmacy\" in FDA warning letters.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "1cca7bbbc12119f4536f6a3f9d97884ddee32db6defd77861e05f571a9723883"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-04",
        "retired": null,
        "how": "The FDA's warning letter database, searched by the firm's name.",
        "source": {
          "title": "FDA warning letters",
          "url": "https://www.fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "recalls",
        "group": "fda",
        "label": "Recalls",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Harborline Pharmacy\" in openFDA drug enforcement reports.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "openFDA drug enforcement reports",
          "note": "Run by Veritura"
        },
        "receipt": {
          "id": "src_2f9fde466feff2865c2e",
          "source": "openFDA drug enforcement reports",
          "url": "https://api.fda.gov/drug/enforcement.json",
          "query": "\"Sample Harborline Pharmacy\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Harborline Pharmacy\" in openFDA drug enforcement reports.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "8db66be4897cab37eab1fb9b7b3f81ac94a19d704593d85e1ce68ed4aac3e20a"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-10-28",
        "retired": null,
        "how": "openFDA enforcement reports, searched by recalling firm: class, reason, lots, distribution. There is no compounding flag, so the match is by name.",
        "source": {
          "title": "openFDA drug enforcement reports",
          "url": "https://open.fda.gov/apis/drug/enforcement/"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "exclusions",
        "group": "fda",
        "label": "Not excluded (HHS OIG)",
        "applies": true,
        "counted": true,
        "state": "verified",
        "stateWord": "Checked at the source",
        "tone": "positive",
        "checkedHere": true,
        "onRecord": true,
        "howWord": "Checked at the source",
        "howMark": "source",
        "checkedBy": "public_source",
        "checkedByWord": "Public source lookup",
        "summary": "Nothing on record for \"Sample Harborline Pharmacy\" in HHS OIG List of Excluded Individuals/Entities.",
        "route": "source_auto",
        "routeWord": "Matched at source",
        "at": "2026-10-21",
        "by": {
          "kind": "source",
          "name": "HHS OIG List of Excluded Individuals/Entities",
          "note": "Run by Veritura"
        },
        "receipt": {
          "id": "src_3012de2269c72a351c4a",
          "source": "HHS OIG List of Excluded Individuals/Entities",
          "url": "https://oig.hhs.gov/exclusions/exclusions_list.asp",
          "query": "\"Sample Harborline Pharmacy\"",
          "capturedAt": "2026-10-21",
          "sourceCurrentAs": "",
          "result": "Nothing on record for \"Sample Harborline Pharmacy\" in HHS OIG List of Excluded Individuals/Entities.",
          "by": "Veritura source worker",
          "limitation": "No match applies only to the recorded query, source coverage, and capture time. It is not a universal clearance.",
          "hash": "3c0a858df6b13a1c312d081b324303a2cb23a350c02dd9c5d2db254af208cb42"
        },
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "2026-11-20",
        "retired": null,
        "how": "The firm, its pharmacist in charge and its owners, screened against OIG's exclusion list. A name match is confirmed in OIG's online search before it is shown.",
        "source": {
          "title": "HHS OIG List of Excluded Individuals and Entities",
          "url": "https://exclusions.oig.hhs.gov/"
        },
        "history": [],
        "askable": ""
      },
      {
        "id": "permit",
        "group": "identity",
        "label": "State license, home state",
        "applies": true,
        "counted": true,
        "state": "missing",
        "stateWord": "Not checked here",
        "tone": "neutral",
        "checkedHere": false,
        "onRecord": false,
        "howWord": "Not checked here",
        "howMark": "missing",
        "checkedBy": "",
        "checkedByWord": "",
        "summary": "Nothing on record yet.",
        "route": "",
        "routeWord": "Not checked here",
        "at": "",
        "by": null,
        "receipt": null,
        "docName": "",
        "checks": [],
        "expires": "",
        "daysLeft": null,
        "nextCheck": "",
        "retired": null,
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "source": {
          "title": "State board of pharmacy license lookup",
          "url": "https://nabp.pharmacy/about/boards-of-pharmacy/"
        },
        "history": [],
        "askable": "permit"
      },
      {
        "id": "fda_registration",
        "group": "identity",
        "label": "FDA registration",
        "applies": false
      }
    ],
    "licensedStates": [],
    "selfLicensedStates": [],
    "notCheckedHere": [
      {
        "id": "permit",
        "label": "State license, home state",
        "why": "Nothing on record yet.",
        "how": "A person opens the board's own lookup and records status, class, expiry and any discipline. Most boards forbid automated queries; the lookup is captured and dated.",
        "askable": "permit"
      },
      {
        "id": "pic",
        "label": "Pharmacist in charge",
        "why": "Nothing on record yet.",
        "how": "Named on the board record where the board shows it (Florida, Texas). Where it does not (California, Illinois), the board's permit record or letter is requested. The PIC's own license is checked too.",
        "askable": "pic"
      }
    ],
    "notCheckedLine": "23 of 26 items not checked here: ask for all",
    "askAll": [
      "permit",
      "pic",
      "nonresident",
      "dea",
      "entity",
      "pcab",
      "achc",
      "nabp_compounding",
      "lab_17025",
      "state_inspection",
      "sterility",
      "endotoxin",
      "potency",
      "bud",
      "stability",
      "cold_chain",
      "validation",
      "copies"
    ],
    "askAllUrl": "",
    "blocks": {
      "licences": []
    },
    "options": {
      "upstream": {
        "on": false,
        "since": "",
        "withdrawnAt": "",
        "supplierNames": false
      },
      "permits": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "readiness": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "operations": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      },
      "copies": {
        "on": false,
        "since": "",
        "withdrawnAt": ""
      }
    },
    "asks": null,
    "doors": null,
    "howToRead": [
      {
        "route": "Matched at source",
        "means": "A lookup ran against the issuer's own public source. The receipt records the query, the time and what the source returned."
      },
      {
        "route": "Answered by the issuer in writing",
        "means": "The issuer answered in writing. The reply is kept."
      }
    ],
    "whoChecked": [
      {
        "mark": "Public source lookup",
        "means": "Veritura ran a lookup at the source itself (the FDA, openFDA, NPPES, OIG) on the date shown. The receipt keeps the query and the answer."
      },
      {
        "mark": "Checked at the issuer by a named person",
        "means": "Someone independent of the pharmacy, such as a buyer's staff, opened the issuer's own record and recorded what it said, with their name, job title and company."
      },
      {
        "mark": "Recorded by the pharmacy's own staff",
        "means": "The pharmacy checked itself and recorded what the issuer's record said. Shown in grey with who recorded it, never as an independent confirmation."
      },
      {
        "mark": "Read by Veritura",
        "means": "Veritura read the document itself, line by line, against the rule it answers to."
      }
    ],
    "answer": {
      "facts": [
        "FDA and OIG: no finding in the lookups that ran.",
        "Licenses: none on file yet.",
        "Test reports: none read yet."
      ],
      "coverage": "3 of 26 items checked; 23 not checked here. A count of what is on file, never a score.",
      "documentsRead": 0,
      "documentsOpen": 0,
      "documentsBad": 0,
      "supplierCertificatesRead": 0,
      "supplierCertificatesOwed": 0,
      "supplierCertificates": null,
      "line": "FDA and OIG: no finding in the lookups that ran. Licenses: none on file yet. Test reports: none read yet.",
      "boundary": "Facts from the file below, each with its source and date. Never a grade or a rank of the pharmacy."
    },
    "glance": [
      {
        "key": "fda",
        "label": "FDA and OIG records",
        "word": "no finding",
        "who": "matched at the source",
        "at": "2026-10-21",
        "checkedBy": "public_source",
        "tone": "positive",
        "line": "FDA and OIG records · no finding · matched at the source · 2026-10-21"
      }
    ],
    "telehealth": {
      "website": "",
      "websiteLine": "No website on file",
      "legitscript": {
        "applies": false,
        "naWord": "No website on file",
        "line": "No website on file. LegitScript and NABP's digital pharmacy list cover the website a pharmacy sells through, and this file names none."
      },
      "nabpDigital": {
        "applies": false,
        "naWord": "No website on file"
      },
      "states": {
        "home": "CO",
        "list": [],
        "licensed": [],
        "selfRecorded": [],
        "negative": [],
        "map": [
          {
            "state": "AK",
            "x": 0,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "ME",
            "x": 10,
            "y": 0,
            "status": "none",
            "word": ""
          },
          {
            "state": "VT",
            "x": 9,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "NH",
            "x": 10,
            "y": 1,
            "status": "none",
            "word": ""
          },
          {
            "state": "WA",
            "x": 0,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ID",
            "x": 1,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MT",
            "x": 2,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "ND",
            "x": 3,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MN",
            "x": 4,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "IL",
            "x": 5,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "WI",
            "x": 6,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MI",
            "x": 7,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "NY",
            "x": 8,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "RI",
            "x": 9,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "MA",
            "x": 10,
            "y": 2,
            "status": "none",
            "word": ""
          },
          {
            "state": "OR",
            "x": 0,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NV",
            "x": 1,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "WY",
            "x": 2,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "SD",
            "x": 3,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IA",
            "x": 4,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "IN",
            "x": 5,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "OH",
            "x": 6,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "PA",
            "x": 7,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "NJ",
            "x": 8,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CT",
            "x": 9,
            "y": 3,
            "status": "none",
            "word": ""
          },
          {
            "state": "CA",
            "x": 0,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "UT",
            "x": 1,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "CO",
            "x": 2,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "NE",
            "x": 3,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MO",
            "x": 4,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "KY",
            "x": 5,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "WV",
            "x": 6,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "VA",
            "x": 7,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "MD",
            "x": 8,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "DE",
            "x": 9,
            "y": 4,
            "status": "none",
            "word": ""
          },
          {
            "state": "AZ",
            "x": 1,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NM",
            "x": 2,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "KS",
            "x": 3,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "AR",
            "x": 4,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "TN",
            "x": 5,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "NC",
            "x": 6,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "SC",
            "x": 7,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "DC",
            "x": 8,
            "y": 5,
            "status": "none",
            "word": ""
          },
          {
            "state": "OK",
            "x": 3,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "LA",
            "x": 4,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "MS",
            "x": 5,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "AL",
            "x": 6,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "GA",
            "x": 7,
            "y": 6,
            "status": "none",
            "word": ""
          },
          {
            "state": "HI",
            "x": 0,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "TX",
            "x": 3,
            "y": 7,
            "status": "none",
            "word": ""
          },
          {
            "state": "FL",
            "x": 8,
            "y": 7,
            "status": "none",
            "word": ""
          }
        ],
        "source": "The licenses on file",
        "note": "No state license is on file yet."
      },
      "pic": {
        "name": "",
        "nameFrom": "",
        "board": {
          "state": "missing",
          "stateWord": "Not checked here",
          "routeWord": "Not checked here",
          "at": "",
          "summary": "Nothing on record yet."
        },
        "oig": {
          "state": "verified",
          "stateWord": "No match in the list as loaded",
          "routeWord": "Matched at source",
          "at": "2026-10-21",
          "summary": "Nothing on record for \"Sample Harborline Pharmacy\" in HHS OIG List of Excluded Individuals/Entities."
        }
      },
      "copies": {
        "item": {
          "applies": true,
          "state": "missing",
          "stateWord": "Not checked here",
          "howWord": "Not checked here",
          "howMark": "missing",
          "tone": "neutral",
          "checkedHere": false,
          "onRecord": false,
          "checkedBy": "",
          "checkedByWord": "",
          "at": "",
          "summary": "Nothing on record yet.",
          "askable": "copies",
          "receipt": null
        },
        "block": {
          "on": false,
          "withdrawnAt": ""
        }
      }
    },
    "exposure": {
      "asOf": "2026-10-22",
      "products": [],
      "pharmacy": [],
      "counts": {
        "products": 0,
        "substances": 0,
        "factsToRead": 0,
        "pharmacyFindings": 0
      },
      "note": "Where each substance stands on the FDA's public lists, with the source and the date of each list. Facts only: whether a preparation may be compounded is the pharmacy's and the prescriber's call, and no list settles it alone.",
      "sources": [
        {
          "label": "21 CFR 216.23 and the FDA's 503A categories",
          "url": "https://www.fda.gov/drugs/human-drug-compounding/bulk-drug-substances-used-compounding"
        },
        {
          "label": "21 CFR 216.23",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.23"
        },
        {
          "label": "21 CFR 216.24",
          "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.24"
        },
        {
          "label": "The FDA's 503A category list, updated May 14, 2026",
          "url": "https://www.fda.gov/media/94155/download"
        },
        {
          "label": "The FDA's drug shortage database",
          "url": "https://dps.fda.gov/drugshortages"
        },
        {
          "label": "The FDA's NDC directory (openFDA)",
          "url": "https://open.fda.gov/apis/drug/ndc/"
        },
        {
          "label": "Section 503A(b)(1)(D) and (b)(2), and the FDA's 2018 guidance on essentially copies",
          "url": "https://www.fda.gov/media/98973/download"
        },
        {
          "label": "The FDA's establishment registry (DECRS)",
          "url": "https://www.accessdata.fda.gov/scripts/cder/drls/"
        }
      ]
    },
    "instant": false,
    "private": true,
    "publishedByPharmacy": false,
    "basis": "Not published by the pharmacy: public sources and your own workspace's checks only.",
    "createdAt": "2026-10-16",
    "lookedUpAt": "",
    "refreshedWeekly": false,
    "watching": false,
    "changes": [],
    "sample": true,
    "sampleNote": "Sample data for test keys: invented firms, never a real pharmacy or supplier. A live key reads published files."
  }
}
```

### Where your products stand on the FDA's lists

`GET /v1/exposure`

Name your products and read, product by product, where each substance stands on the FDA's public lists: the 503A bulks lists and categories, a component of a drug marketed under an FDA application, 21 CFR 216.24, the shortage list, and marketed products a compounded version would copy. Each fact carries its source and the date of the list. Add `lookup` or `pharmacy` to read what the FDA has said about that pharmacy too. `products` is paged with `limit` and `cursor`; `counts` covers every product named. Facts, never a verdict.

| Parameter | What it is |
| --- | --- |
| `product` | A product as the label names it. Repeat for each, up to 24. |
| `lookup` | Optional. One of your lookup ids. |
| `pharmacy` | Optional. A published pharmacy file id or public name. |
| `limit` | Products a page, 1 to 24. Default 24. |
| `cursor` | `next_cursor` from the page before. |

**curl**

```bash
curl -G https://www.veritura.co/v1/exposure \
  --data-urlencode "product=Semaglutide 2.5 mg/mL injection" \
  --data-urlencode "product=Naltrexone 4.5 mg capsules" \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const { exposure } = await veritura.getExposure({ products: ["Semaglutide 2.5 mg/mL injection", "Naltrexone 4.5 mg capsules"] });
for (const p of exposure.products ?? []) for (const s of p.substances ?? []) for (const f of s.facts ?? []) console.log(p.product, f.label, f.line);
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

r = veritura.get_exposure(["Semaglutide 2.5 mg/mL injection", "Naltrexone 4.5 mg capsules"])
for p in r["exposure"]["products"]:
    print(p["product"], [f["state"] for s in p["substances"] for f in s["facts"]])
```

**Example response** (Shortened, from a test key)

```json
{
  "ok": true,
  "mode": "test",
  "pharmacy": null,
  "exposure": {
    "asOf": "2026-10-22",
    "products": [
      {
        "product": "Semaglutide 2.5 mg/mL injection",
        "from": "yours",
        "fromWord": "You added it",
        "lotNumber": "",
        "receivedAt": "",
        "basis": null,
        "substances": [
          {
            "name": "Semaglutide",
            "key": "semaglutide",
            "facts": [
              {
                "key": "bulks_503a",
                "label": "503A bulk drug substance lists",
                "asOf": "2026-09-21",
                "state": "application_component",
                "tone": "neutral",
                "source": {
                  "label": "The FDA's NDC directory (openFDA)",
                  "url": "https://open.fda.gov/apis/drug/ndc/"
                },
                "marketedAs": [
                  "Wegovy",
                  "Ozempic",
                  "Rybelsus"
                ],
                "line": "Semaglutide is not on the 503A bulks list (21 CFR 216.23(a)) or on the FDA's Category 1 or Category 2 lists (updated May 14, 2026), but it is the active ingredient of drugs marketed under an FDA application: Wegovy, Ozempic, Rybelsus (NDA), per the FDA's NDC directory as of Sep 21, 2026. Section 503A lets a bulk substance that is a component of a drug marketed under an FDA application be used in compounding; that covers the same active ingredient, and a different salt form is a different substance. A compounded drug that is essentially a copy of the marketed product needs a prescriber's determination (below)."
              },
              {
                "key": "withdrawn",
                "label": "Withdrawn or removed for safety or effectiveness (21 CFR 216.24)",
                "source": {
                  "label": "21 CFR 216.24",
                  "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.24"
                },
                "state": "not_on_list",
                "tone": "neutral",
                "asOf": "2026-10-19",
                "line": "Semaglutide does not appear in Veritura's capture of 21 CFR 216.24 as published Oct 19, 2026."
              },
              {
                "key": "shortage",
                "label": "The FDA's drug shortage list",
                "source": {
                  "label": "The FDA's drug shortage database",
                  "url": "https://dps.fda.gov/drugshortages"
                },
                "asOf": "2026-09-21",
                "state": "shortage_resolved",
                "tone": "attention",
                "line": "The FDA lists the Semaglutide shortage as resolved on Feb 21, 2025. The FDA has said its enforcement discretion for 503A compounding of Semaglutide injection products ended on Apr 24, 2025."
              },
              {
                "key": "copy",
                "label": "\"Essentially a copy\" of a marketed product",
                "source": {
                  "label": "The FDA's NDC directory (openFDA)",
                  "url": "https://open.fda.gov/apis/drug/ndc/"
                },
                "asOf": "2026-09-21",
                "state": "marketed",
                "tone": "attention",
                "guidance": {
                  "label": "Section 503A(b)(1)(D) and (b)(2), and the FDA's 2018 guidance on essentially copies",
                  "url": "https://www.fda.gov/media/98973/download"
                },
                "marketed": [
                  "Wegovy",
                  "Ozempic",
                  "Rybelsus"
                ],
                "line": "Marketed as Wegovy, Ozempic, Rybelsus (NDA), oral, subcutaneous, in 17 strengths, per the FDA's NDC directory as of Sep 21, 2026. A compounded drug that is essentially a copy of a marketed product needs, for each patient, a prescriber's determination of the change made and the significant difference it produces, on the prescription (section 503A(b)(2))."
              },
              {
                "key": "supplier_registration",
                "label": "The makers' FDA registration",
                "source": {
                  "label": "The pharmacy's published file",
                  "url": ""
                },
                "state": "not_published",
                "tone": "neutral",
                "asOf": "",
                "line": "The pharmacy has not published its supplier lots, so the FDA registration of the makers behind its Semaglutide is not shown here."
              }
            ]
          }
        ],
        "unread": ""
      }
    ],
    "pharmacy": [],
    "counts": {
      "products": 2,
      "substances": 2,
      "factsToRead": 3,
      "pharmacyFindings": 0
    },
    "note": "Where each substance stands on the FDA's public lists, with the source and the date of each list. Facts only: whether a preparation may be compounded is the pharmacy's and the prescriber's call, and no list settles it alone.",
    "sources": [
      {
        "label": "21 CFR 216.23 and the FDA's 503A categories",
        "url": "https://www.fda.gov/drugs/human-drug-compounding/bulk-drug-substances-used-compounding"
      },
      {
        "label": "21 CFR 216.23",
        "url": "https://www.ecfr.gov/current/title-21/chapter-I/subchapter-C/part-216/subpart-B/section-216.23"
      }
    ]
  },
  "total": 2,
  "limit": 24,
  "next_cursor": null,
  "sample": true,
  "sampleNote": "The FDA lists are public reference data, read the same for every key; the pharmacy, when named, is from the sample."
}
```

### List your watches and what changed

`GET /v1/watches`

Your watches (oldest first) and the changes found (newest first), a page of each; one cursor pages both. The first page compares each watched file with what it showed before, at most once a minute for your workspace; Veritura also compares every six hours without being asked. A change is a sentence, never a score.

| Parameter | What it is |
| --- | --- |
| `limit` | 1 to 500 of each list. Default 100. |
| `cursor` | `next_cursor` from the page before. |

**curl**

```bash
curl https://www.veritura.co/v1/watches \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

for await (const page of veritura.watchPages()) {
  for (const a of page.alerts) for (const ch of a.changes) console.log(a.name, ch.type, ch.line);
}
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

for page in veritura.watch_pages():
    for a in page["alerts"]:
        for ch in a["changes"]:
            print(a["name"], ch["type"], ch["line"])
```

**Example response** (From a test key)

```json
{
  "ok": true,
  "mode": "test",
  "limit": 100,
  "next_cursor": null,
  "watches": [
    {
      "id": "fw_t_3f9a1c2b7d10",
      "kind": "pharmacy",
      "fileId": "vfl_sample_northgate",
      "name": "Sample Northgate Outsourcing",
      "url": "",
      "createdAt": "2026-10-22T00:28:43.791Z",
      "via": "api"
    }
  ],
  "alerts": [
    {
      "id": "fa_sample_3f9a1c2b7d10",
      "kind": "pharmacy",
      "fileId": "vfl_sample_northgate",
      "name": "Sample Northgate Outsourcing",
      "url": "",
      "at": "2026-10-22T00:28:43.791Z",
      "changes": [
        {
          "type": "new_finding",
          "item": "inspections",
          "line": "New finding: FDA inspections: classification, citations, 483s. FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations."
        },
        {
          "type": "expiring",
          "item": "permit",
          "line": "State license, home state expires within 30 days. Active, name and number match (FL)."
        }
      ],
      "read": false,
      "askId": "",
      "sample": true
    }
  ]
}
```

### Watch a published file, or one of your lookups

`POST /v1/watches`

Send the kind and the id. A published file is watched by its file id or public name; a pharmacy that never published is watched through your own lookup of it (kind `lookup`), which the weekly look-up keeps current. Watching what you already watch returns the same watch. Free. To be told by webhook rather than by asking, register a file.changed webhook, which is on a paid plan. Send an `Idempotency-Key` so a retry never runs it twice.

| Parameter | What it is |
| --- | --- |
| `kind` | pharmacy, supplier or lookup. |
| `id` | The file id or its public name, or your lookup id (vfl_...). |
| `Idempotency-Key` | Optional header. A new random key per request; the same key on a retry. |

**curl**

```bash
curl -X POST https://www.veritura.co/v1/watches \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01" \
  -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \
  -H "Content-Type: application/json" \
  -d '{"kind":"pharmacy","id":"vfl_sample_northgate"}'
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

const watch = await veritura.watch({ kind: "pharmacy", id: "vfl_sample_northgate" });
const mine = await veritura.watch({ kind: "lookup", id: "vfl_sample_lk_harbor" });
console.log(watch.id, mine.id);
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

watch = veritura.watch("pharmacy", "vfl_sample_northgate")
mine = veritura.watch("lookup", "vfl_sample_lk_harbor")
print(watch["id"], mine["id"])
```

**Example response** (From a test key)

```json
{
  "ok": true,
  "mode": "test",
  "watch": {
    "id": "fw_t_3f9a1c2b7d10",
    "kind": "pharmacy",
    "fileId": "vfl_sample_northgate",
    "name": "Sample Northgate Outsourcing",
    "url": "",
    "createdAt": "2026-10-22T00:28:43.791Z",
    "via": "api"
  }
}
```

### Stop watching a file

`DELETE /v1/watches/{id}`

The watch is gone; the changes you were told about stay in your list. No Idempotency-Key is needed: a second delete of the same watch answers 404 and changes nothing.

| Parameter | What it is |
| --- | --- |
| `id` | The watch id (fw_...). |

**curl**

```bash
curl -X DELETE https://www.veritura.co/v1/watches/fw_t_3f9a1c2b7d10 \
  -H "Authorization: Bearer vk_test_..." \
  -H "X-Veritura-Version: 2026-10-01"
```

**TypeScript**

```ts
import { VerituraBuyerApi } from "./veritura-buyer-api";

const veritura = new VerituraBuyerApi({ apiKey: process.env.VERITURA_API_KEY! });

await veritura.unwatch("fw_t_3f9a1c2b7d10");
```

**Python**

```python
import os
from veritura_buyer_api import VerituraBuyerApi

veritura = VerituraBuyerApi(os.environ["VERITURA_API_KEY"])

veritura.unwatch("fw_t_3f9a1c2b7d10")
```

**Example response** (From a test key)

```json
{
  "ok": true,
  "mode": "test",
  "deleted": "fw_t_3f9a1c2b7d10"
}
```

## Webhook: file.changed

Webhooks are on a paid plan. Reading, watching and asking `GET /v1/watches` for what changed are free.

With a paid plan, register an https endpoint for `file.changed` in Settings, Developer, and each change to a file or a lookup you watch is posted to it, signed. A lookup's change says `"kind": "lookup"`.

| Header | What it holds |
| --- | --- |
| `X-Veritura-Event` | `file.changed` |
| `X-Veritura-Event-Id` | The event id, the same on every redelivery. |
| `X-Veritura-Signature` | `sha256=` and the hex HMAC-SHA256 of the raw body, keyed with your endpoint's secret. |

**The body**

```json
{
  "id": "evt_5d1c0b9e7a2f4c3d8e6b1a90",
  "event": "file.changed",
  "created": "2026-10-22T00:28:43.791Z",
  "attempt": 1,
  "data": {
    "event": "file.changed",
    "file": {
      "id": "vfl_sample_northgate",
      "kind": "pharmacy",
      "name": "Sample Northgate Outsourcing",
      "url": "https://www.veritura.co/pharmacy/sample-northgate-outsourcing"
    },
    "changes": [
      {
        "type": "new_finding",
        "item": "inspections",
        "line": "New finding: FDA inspections: classification, citations, 483s. FDA inspection ending 2026-08-08: classified Voluntary Action Indicated, 2 citations."
      },
      {
        "type": "expiring",
        "item": "permit",
        "line": "State license, home state expires within 30 days. Active, name and number match (FL)."
      }
    ],
    "at": "2026-10-22T00:28:43.791Z"
  }
}
```

### Check the signature first

Compute the HMAC over the raw bytes you received, before parsing them, and compare it in constant time. Answer 2xx within 5 seconds; anything else is tried again. Both clients do this for you and refuse a delivery older than 5 minutes.

**TypeScript**

```ts
import { constructFileChangedEvent } from "./veritura-buyer-api";

// rawBody: the request body exactly as received (a string or bytes)
const event = await constructFileChangedEvent(rawBody, req.headers["x-veritura-signature"], process.env.VERITURA_WEBHOOK_SECRET!);
for (const ch of event.data.changes) console.log(event.data.file.name, ch.line);
```

**Python**

```python
import os
from veritura_buyer_api import construct_file_changed_event

# raw_body: the request body exactly as received, as bytes
event = construct_file_changed_event(raw_body, headers["X-Veritura-Signature"], os.environ["VERITURA_WEBHOOK_SECRET"])
for ch in event["data"]["changes"]:
    print(event["data"]["file"]["name"], ch["line"])
```

**Node.js**

```js
const crypto = require("node:crypto");

function verified(rawBody, header, secret) {
  const want = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(String(header || "")), b = Buffer.from(want);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
```

## Errors

Every error is `{ "error": "...", "code": "..." }`: a sentence for a person, a code for your program. Match on `code`; the sentence can change.

| Status | code | What happened |
| --- | --- | --- |
| 400 | `version_unknown` | X-Veritura-Version names a version this API does not have; `versions` lists the ones it does. |
| 400 | `cursor_invalid` | The cursor did not come from this list, these filters and this key's mode. |
| 400 | `idempotency_key_invalid` | Idempotency-Key is not 1 to 255 visible characters. |
| 400 | `bad_request` | Something is missing, for example the kind of file to watch, or cursor and offset were sent together. |
| 400 | `own_file` | Your own file: you see every change to it in your workspace. |
| 401 | `key_missing` | No Authorization header. |
| 401 | `key_malformed` | Not a Veritura key. |
| 401 | `key_invalid` | The key is not recognised. |
| 401 | `key_revoked` | The key was revoked. |
| 401 | `key_expired` | The key has expired. |
| 401 | `key_issuer_removed` | The teammate who made it left the workspace. |
| 403 | `scope_missing` | The key does not carry network:read. |
| 403 | `demo` | The shared demo cannot be changed. |
| 404 | `not_found` | Nothing with that id: an unpublished file, another workspace's lookup or watch, or a typo. |
| 405 | `method_not_allowed` | That method is not used here; the Allow header says which is. |
| 409 | `idempotency_key_reused` | The Idempotency-Key was used in the last 24 hours for a different request. |
| 409 | `idempotency_in_progress` | The first request with this Idempotency-Key is still running. Wait Retry-After seconds. |
| 429 | `rate_limited` | Over the limit. Wait Retry-After seconds. |
| 502 | `lookup_failed` | A lookup did not run. Try again with the same Idempotency-Key. |

### Retrying

These can be retried: a dropped connection or a timeout, 502, 503 and 504, 409 `idempotency_in_progress`, and 429 after `Retry-After`. Retry a write only with the same `Idempotency-Key`. Both clients retry the first four twice by default, with a short wait between, and leave a 429 to you.

## Clients

Two clients, each one file with no dependencies, typed from the OpenAPI file. Both send the version header, page with cursors, put an Idempotency-Key on every write and reuse it when they retry, and check webhook signatures.

### TypeScript

Node 18 or later, Deno, Bun and edge runtimes. Every answer is typed, errors throw `VerituraApiError` with `status` and `code`, and `lastRateLimit`, `lastVersion` and `lastReplayed` describe the last answer.

**Get the client**

```bash
curl -o veritura-buyer-api.ts https://www.veritura.co/buyer-api/client.ts
```

| Method | Calls |
| --- | --- |
| `listPharmacies(params?)` | GET /v1/pharmacies |
| `pharmacyPages(params?)` | every page of GET /v1/pharmacies |
| `getPharmacyFile(id)` | GET /v1/pharmacies/{id}/file |
| `listSuppliers(params?)`, `supplierPages(params?)` | GET /v1/suppliers |
| `getSupplierFile(id)` | GET /v1/suppliers/{id}/file |
| `listLookups(params?)`, `lookupPages(params?)` | GET /v1/lookups |
| `runLookup(request, options?)` | POST /v1/lookups |
| `getLookup(id)` | GET /v1/lookups/{id} |
| `getExposure(params)`, `exposurePages(params)` | GET /v1/exposure |
| `listWatches(params?)`, `watchPages(params?)` | GET /v1/watches |
| `watch({ kind, id }, options?)` | POST /v1/watches; kind is pharmacy, supplier or lookup |
| `unwatch(watchId)` | DELETE /v1/watches/{id} |
| `verifyWebhookSignature(body, header, secret)` | true when the signature holds |
| `constructFileChangedEvent(body, header, secret)` | the typed event, or it throws |

### Python

Python 3.8 or later, standard library only (urllib). Answers are plain dicts in the shapes above, errors raise `VerituraApiError` with `status` and `code`, and `last_rate_limit`, `last_version` and `last_replayed` describe the last answer.

**Get the client**

```bash
curl -o veritura_buyer_api.py https://www.veritura.co/buyer-api/client.py
```

| Method | Calls |
| --- | --- |
| `list_pharmacies(...)`, `pharmacy_pages(...)` | GET /v1/pharmacies |
| `get_pharmacy_file(id)` | GET /v1/pharmacies/{id}/file |
| `list_suppliers(...)`, `supplier_pages(...)` | GET /v1/suppliers |
| `get_supplier_file(id)` | GET /v1/suppliers/{id}/file |
| `list_lookups(...)`, `lookup_pages(...)` | GET /v1/lookups |
| `run_lookup(q=..., ...)` | POST /v1/lookups |
| `get_lookup(id)` | GET /v1/lookups/{id} |
| `get_exposure(products, ...)`, `exposure_pages(products, ...)` | GET /v1/exposure |
| `list_watches(...)`, `watch_pages(...)` | GET /v1/watches |
| `watch(kind, id)` | POST /v1/watches |
| `unwatch(watch_id)` | DELETE /v1/watches/{id} |
| `verify_webhook_signature(body, header, secret)` | True when the signature holds |
| `construct_file_changed_event(body, header, secret)` | the event as a dict, or it raises |

## What this is not

- **No ratings, no ranking.** No score, grade, star or badge. Lists are alphabetical, and a count says what is on file and how it was checked.
- **Paperwork, not medicine.** Veritura checks records at their source and reads documents against their rule. A file says nothing about any medicine or ingredient.
- **Not an approval.** A file is not an approval, a certification or an endorsement of a pharmacy or supplier.
- **No orders, no routing.** Veritura does not sell medicine, route orders or take a share of a sale.

## Changelog

### Oct 3, 2026: Documents on a file, and who may open them

- Each item with a document on file carries `document`: `access` (`public`, `connected` or `private`, as the firm chose), `accessWord` ("Open", "Ask for access", or empty when private), `name`, `keptWord` (how it is kept: the original file or a text copy), `at` (the date it was added) and `url` (the public address, set only when `access` is `public`).
- A published file carries `documents`, every item's current document with the same fields plus `label`, `kept`, `kind`, `size` and a `line` in words, and `documentsLine`, the documents in one sentence. A directory row carries `documents` too.
- A private document is still listed, without its name or address. The item, how it was established and any finding are shown whatever the firm chooses.
- Two values `route` can now hold: `attested`, a document Veritura could not read, kept and attested by the person who added it while a Veritura reviewer reads it, and `reviewed`, a document a Veritura reviewer read and found to be what the item asks for. On a firm's own file an attested document reads as the firm's own record (`checkedBy` `self`); a reviewed one reads `checkedBy` `document`. No new `checkedBy` value.
- Every item carries `howWord` and `howMark`: how it was established, in words and as a key. A verified item's `stateWord` now says the same words (for example "Read from its document, not checked at the issuer"), never a bare "Confirmed"; only a check at the source or by a named person is `source` or `person`.

### Oct 1, 2026: Docs: search, copy and Markdown

- Search on this page filters the sections and endpoints as you type. Cmd-K or Ctrl-K (or /) focuses it; Esc clears it.
- Copy on every code block and every example response.
- The whole page as Markdown at `/buyer-api.md`, built from the same words as this page.
- New sections for versioning, pagination and idempotency, the new error codes, and both clients. Every endpoint now has an example response.

### Oct 1, 2026: Python client

- A Python client, one file, standard library only (urllib), for Python 3.8 or later: every endpoint, pages that follow `next_cursor`, the version header, an Idempotency-Key on every write, retries, and webhook signature checks. Get it at `/buyer-api/client.py`.

### Oct 1, 2026: TypeScript client 0.2.0

- New methods: `runLookup` (POST /v1/lookups), `getExposure` (GET /v1/exposure), and `watch({ kind: "lookup", id })` for one of your lookups.
- Page iterators that follow `next_cursor`: `pharmacyPages`, `supplierPages`, `lookupPages`, `watchPages` and `exposurePages`.
- Sends X-Veritura-Version on every request (the `version` option; `lastVersion` holds the version that answered) and an Idempotency-Key on every write, reused on its own retries (the `idempotencyKey` option; `lastReplayed`).
- Retries a dropped connection, a timeout, 502, 503, 504 and `idempotency_in_progress` twice by default (`maxRetries`).

Changed: `watch(kind, id)` still works; `watch({ kind, id })` is the form to use.

### Oct 1, 2026: Idempotency keys on writes

- POST /v1/lookups and POST /v1/watches take an `Idempotency-Key` header. For 24 hours the same key and body return the first successful answer again, with `Idempotent-Replayed: true`, and nothing runs twice.
- The same key with a different body is a 409 `idempotency_key_reused`; a retry while the first request is still running is a 409 `idempotency_in_progress` with Retry-After. A key that is not 1 to 255 visible characters is a 400 `idempotency_key_invalid`.

### Oct 1, 2026: Cursor pagination on every list

- GET /v1/pharmacies, /v1/suppliers, /v1/lookups, /v1/watches and /v1/exposure take `limit` and `cursor` and answer with `next_cursor` (null on the last page). A cursor marks a place, not a count, so rows published while you page never repeat or skip a row that was already there.
- A cursor sent with another list, other filters or the other mode is a 400 `cursor_invalid`.

Changed: `offset` on /v1/pharmacies and /v1/suppliers is deprecated and keeps working until at least Oct 1, 2027; an answer that used it carries Deprecation, Sunset and Link headers. GET /v1/watches pages the watches (oldest first) and every change found (newest first) with one cursor, instead of returning the latest 50 changes. GET /v1/lookups takes `limit` (default 100).

### Oct 1, 2026: Dated versions

- Send `X-Veritura-Version: 2026-10-01` to pin the version. Every answer carries X-Veritura-Version with the version it was answered under; with no header, the latest stable version answers.
- An unknown version is a 400 `version_unknown` that lists the versions accepted.
- A breaking change ships only under a new dated version, and the version it replaces keeps working for at least 12 months. It is announced here on the day it ships, and answers under the old version carry Deprecation and Sunset headers.

### Oct 1, 2026: Lookups you can run and watch, and exposure by product

- New: POST /v1/lookups runs a lookup of any pharmacy, or refreshes one, privately to your workspace; watch: true watches it.
- Watches take kind lookup, so a pharmacy that never published can be watched through your own lookup. Lookups are looked up again every week, and a change arrives in the same file.changed shape, with kind lookup.
- New: GET /v1/exposure, where each product stands on the FDA's public lists, by product, with each list's source and date.
- completeness.checked leads every summary; an item the firm recorded about itself reads state self_recorded and is never counted as checked or confirmed.

Changed: completeness.line now reads "N of M items checked". completeness.confirmed no longer counts items the firm recorded about itself. A state a pharmacy shipped to with no permit on record reads state gap ("Not on record"), never a finding.

### Sep 30, 2026: Free to read

- Read keys (scope network:read) are free for every workspace: clinics, telehealth platforms, and pharmacies reading other files. Make one in Settings, Developer.
- Test keys read a fixed sample with invented names, the same everywhere. Live keys read published files, your watches and your private lookups.
- New: GET /v1/lookups and GET /v1/lookups/{id}, the files your workspace keeps about pharmacies, private to your workspace.
- Rate limit: 300 requests a minute per workspace, counted apart for test and live keys, with X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on every answer and Retry-After on a 429.
- Lists take limit and offset. Every answer carries mode (test or live). Errors carry a stable code.
- An OpenAPI 3.1 file, an llms.txt and a TypeScript client.
- Signed webhooks, file.changed among them, stay on a paid plan for now.

Changed: A test key no longer reads real published files; use a live key for those.

### Sep 30, 2026: Published pharmacy and supplier files

- GET /v1/pharmacies, GET /v1/pharmacies/{id}/file, GET /v1/suppliers and GET /v1/suppliers/{id}/file: every item with how it was checked, when, who checked it (checkedBy, checkedByWord) and its receipt; findings first.
- POST /v1/watches, GET /v1/watches and DELETE /v1/watches/{id}, and the file.changed webhook.

---

Veritura checks paperwork and records at their source and reads documents against the rule each must meet. Nothing here says anything about any medicine.

[Pharmacy files](https://www.veritura.co/pharmacy) · [Supplier files](https://www.veritura.co/supplier) · [OpenAPI](https://www.veritura.co/buyer-api/openapi.json) · [llms.txt](https://www.veritura.co/buyer-api/llms.txt) · [Markdown](https://www.veritura.co/buyer-api.md) · [Veritura](https://www.veritura.co/)
