Skip to main content
Each dataset has two endpoints. A list endpoint returns the records that match your filters. A get endpoint returns one record by its id. For programs these are GET /v1/programs and GET /v1/programs/{program_id}. All examples on this page use programs. The same rules apply to every dataset.

List records

Call the list endpoint with the filters you need.
Every list returns the same shape:
object[]
One page of matching records.
string | null
Pass this back as cursor to get the next page. Null on the last page.
integer
The number of records that match, across all pages.

Filter

Each query parameter narrows the list. When you pass several parameters, a record must match all of them. To match any of several values, separate them with commas:
Filters take the values you would write yourself:
  • company takes a ticker (PFE), a company slug or the company’s exact registered name. It includes the companies that company owns. A name that matches more than one company returns a 400 that lists the candidates.
  • phase and modality take Pav’s normalized values, such as phase_3 and adc. An unknown value returns a 400 that lists the allowed values.
  • indication and target take a name, a synonym or an ontology id.
Each dataset page lists its filters. When you already have an id from an earlier response, you can filter by it instead: company_id, drug_id and program_id each take one id or a comma-separated list.
Programs and drugs count only active programs unless you pass status. Add status=discontinued to see discontinued programs.

Filter by date

from and to limit a list to a date range. Both are inclusive and take YYYY-MM-DD. The date they apply to depends on the dataset:

Sort

sort takes a field name. Add a leading - to sort in descending order.
Each dataset page lists the fields you can sort by and the default order.

Page through results

A list returns 50 records by default. Set limit to get between 1 and 200. When there are more records, the response includes next_cursor. Pass it back as cursor, with the same filters, to get the next page. Keep going until next_cursor is null.
To count matches without reading them all, request limit=1 and read total.

Fetch one record

Pass an id from a list response to the get endpoint. An unknown id returns a 404.
A get response often carries more than a list row. A program, for example, includes its linked trials and ontology terms.

Get lighter rows

Programs and patents take view=slim, which returns smaller rows. A slim program has a trial_count instead of its trials and ontology terms. A slim patent family leaves out its member list.

Missing values

A field is null, or a list is empty, when the source does not disclose the value. A filter on such a field returns only the records where it is set. See Coverage and sources.

Errors

Errors return a status code and a JSON body with a code, a message and a request_id. See Rate limits and errors for every status and when to retry.