API reference · v1 (1.2.0)

Peptide Library API reference

Generated from the OpenAPI 3.1 document that describes the live API (also as YAML).

Overview

Base URL: https://api.peptidelibrary.app/v1. Every response is JSON over HTTPS. The version is in the path; v1 only gains fields and endpoints, never loses or renames them. Breaking changes would ship as v2 with notice in the changelog.

{
  "data": [ … ],
  "pagination": { "next_cursor": "eyJvIjoyMH0…", "has_more": true, "total": 182, "limit": 20 },
  "meta": { "api_version": "v1", "request_id": "req_…", "retrieved_at": "2026-10-18T14:00:00.000Z", … }
}

Authentication

Research and study endpoints work without a key, limited per IP address. Vendor, product and price endpoints need a key with the matching scope. Create keys in the developer dashboard; a key is shown once and stored only as a hash.

Authorization: Bearer pl_live_…
# or
X-API-Key: pl_live_…
  • research:read: Peptide profiles, research summaries, regulatory status, categories, search. Also works without a key.
  • studies:read: Cited studies and the studies index. Also works without a key.
  • vendors:read: Vendor directory, profiles, shipping and comparisons.
  • products:read: Products (compound × form) with price ranges.
  • pricing:read: Current offers with listed prices and affiliate links.

Keep keys on your server. Never put a key in a web page, a mobile app or a public repository; rotate it if it leaks.

Pagination, filters and fields

List endpoints take limit (1-100) and return pagination.next_cursor; pass it as cursor with the same filters for the next page. A cursor made for other filters is refused. Unknown parameters are refused too, so a typo never silently returns everything. Most lists take fields (comma-separated top-level fields).

Rate limits and caching

Keyed vendor, product and price requests count against your plan per account (Free Developer: 60 per minute, 5,000 per month, reset on the 1st, UTC). Responses carry RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and X-RateLimit-Monthly-*. Over a limit you get 429 with Retry-After. Anonymous requests are limited to about 300 a minute per IP address. Nothing is billed automatically.

Responses carry an ETag; send it back as If-None-Match to get 304 Not Modified. Research data changes rarely (cached up to an hour); prices are refreshed about once a day and cached for at most 10 minutes.

Data conventions

  • Timestamps are UTC ISO 8601. Money is a decimal string ("29.99") in the listed currency; never converted.
  • Research fields a profile doesn't document are the string not_documented; unknown vendor and price fields are null. Nothing is guessed or filled in.
  • Human (clinical) evidence and preclinical (animal, lab, in vitro) evidence are always kept apart.
  • No dose figures, regimens, reconstitution or injection instructions are ever returned.
  • Prices: last_seen_at says when a price was last seen on the vendor's site; is_stale after 7 days; offers unseen for 30 days are dropped. Prices for different strengths, package sizes, forms or currencies are never treated as the same product.
  • Shipping status unknown is never shown as ships.

Errors

{ "error": { "code": "insufficient_scope", "message": "…", "request_id": "req_…", "details": { "required_scope": "pricing:read" } } }
invalid_parameter400A parameter is missing, unknown or out of range. `details.parameter` names it.
invalid_cursor400The cursor is malformed or was made for different filters.
missing_key401The endpoint needs a key and none was sent.
invalid_key401The key is malformed or unknown.
revoked_key401The key was revoked or rotated.
insufficient_scope403The key lacks the endpoint's scope (`details.required_scope`).
account_suspended403The developer account is suspended.
not_found404No such endpoint or resource. Peptide lookups include `details.suggestions`.
method_not_allowed405The API is read-only: only GET, HEAD and OPTIONS.
response_too_large422Lower `limit` or narrow the filters.
rate_limited429Over your per-minute limit (or the per-IP limit). Wait `Retry-After` seconds.
quota_exceeded429Your plan's monthly limit is used up until `details.reset_at`.
internal_error500Our fault. Quote `request_id` if you contact us.
backend_unavailable503A data source is briefly unavailable. Retry with backoff.
auth_unavailable503Keys can't be checked right now. Retry shortly.

Attribution and use

Show “Data from Peptide Library” with a link to the page each result returns (url), keep vendor links as returned, show prices with their last_seen_at, and present the data as research and education, not medical advice. Peptide Library may earn a commission when you buy through these links, at no cost to you. Commissions never affect which offers are listed or their order. Prices are as last seen on the vendor's site; check the vendor before relying on them.

Full terms: API terms of use. Research and educational information only. Not medical advice, and not a recommendation to buy or use any substance. Many of these compounds are not approved for human use.

Research

Peptide research profiles, research summaries, regulatory status, categories and search. No key needed.

GET/v1/peptides

List and search peptides

Peptide research profiles with filters. `search` matches names, synonyms and aliases (fuzzy). Each result links to its canonical Peptide Library page.

Scope research:read · key optional · paginated

Query parameterTypeDescription
searchstringName, synonym, alias or partial name.
category"fat-loss" | "cognitive" | "muscle-recovery" | "longevity" | "glp1-metabolic" | "cosmetic" | "experimental"Research category id (see /v1/categories).
research_areastringStudied research area, e.g. "tissue repair" (see /v1/research-areas).
evidence_level"fda-approved" | "established-human" | "clinical-trial" | "limited-human" | "preclinical" | "insufficient"Evidence level of reviewed profiles.
regulatory_status"approved" | "investigational" | "experimental" | "withdrawn" | "insufficient"Regulatory class from the recorded FDA status.
sort"relevance" | "name" | "-name" | "evidence" | "updated"Order: `relevance` (default with `search`), `name` (default), `-name`, `evidence`, `updated`.
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, name, also_known_as, categories, summary, research_topics, classification, fda_status, evidence, url, regulatory_status, content_reviewed_at, api_url.
curl "https://api.peptidelibrary.app/v1/peptides?search=bpc&limit=5"
Response fields: PeptideSummary
idstring
namestring
also_known_asstring[]
categoriesobject[]
summarystring | "not_documented"
research_topicsstring[]
classificationstring | "not_documented"
fda_statusstring | "not_documented"
evidenceobject
urlstring
regulatory_status"approved" | "investigational" | "experimental" | "withdrawn" | "insufficient"Regulatory class read from the profile's FDA status.
content_reviewed_atstring | "not_documented"
api_urlstringAbsolute URL.
Try it in the playground →

GET/v1/peptides/{slug}

Get a peptide research profile

The full research profile: names, classification, mechanism, chemical properties, evidence (human and preclinical kept separate), safety, regulatory status and references. Dose figures are never included.

Scope research:read · key optional

Path parameterTypeDescription
slugrequiredstringPeptide id (e.g. `bpc-157`), name, synonym or alias. Aliases resolve to the canonical profile.
curl "https://api.peptidelibrary.app/v1/peptides/bpc-157"
Response fields: Peptide
idstring
namestring
also_known_asstring[]
urlstring
summarystring | "not_documented"
research_areasstring[]
categoriesobject[]
classificationobject
mechanismobject
propertiesobject
evidenceobject
safetyobject
regulatoryobject
referencesobject[]
reviewobject
notesstring[]
regulatory_status"approved" | "investigational" | "experimental" | "withdrawn" | "insufficient"
linksobject
Try it in the playground →

GET/v1/peptides/{slug}/research

Research summary for a peptide

Mechanisms under investigation, clinical (human) evidence, preclinical evidence, secondary reports, safety information, known limitations, research gaps and source references.

Scope research:read · key optional

Path parameterTypeDescription
slugrequiredstringPeptide id (e.g. `bpc-157`), name, synonym or alias. Aliases resolve to the canonical profile.
curl "https://api.peptidelibrary.app/v1/peptides/bpc-157/research"
Response fields: ResearchSummary
peptideobject
evidenceobject
mechanismsobject
clinical_evidenceobject
preclinical_evidenceobject
secondary_reportsobject
regulatory_evidenceStudy[]
safetyobject
limitationsstring[]
research_gapsstring[]Evidence steps with no documented source in the profile.
referencesobject[]
reviewobject
Try it in the playground →

GET/v1/regulatory-status/{slug}

Regulatory status of a peptide

FDA and WADA status, availability and development stage as recorded in the profile, with the date reviewed.

Scope research:read · key optional

Path parameterTypeDescription
slugrequiredstringPeptide id (e.g. `bpc-157`), name, synonym or alias. Aliases resolve to the canonical profile.
curl "https://api.peptidelibrary.app/v1/regulatory-status/semaglutide"
Response fields: RegulatoryStatus
peptideobject
regulatory_status"approved" | "investigational" | "experimental" | "withdrawn" | "insufficient"
regulatory_status_labelstring
approved_medicinebooleanTrue only when the recorded FDA status is Approved.
fda_statusstring | "not_documented"
wada_statusstring | "not_documented"
availabilitystring | "not_documented"
development_stagestring | "not_documented"
library_classificationstring | "not_documented"
statementstring | "not_documented"
conflictstring | "not_documented"
last_reviewedstring | "not_documented"
notestring
Try it in the playground →

GET/v1/categories

Research categories

Peptide Library research categories with every profile in each.

Scope research:read · key optional · paginated

curl "https://api.peptidelibrary.app/v1/categories"
Response fields: Category
idstring
labelstring
descriptionstring
peptide_countinteger
urlstringAbsolute URL.
peptidesobject[]
Try it in the playground →

GET/v1/research-areas

Research areas

Research areas the profiles cover (their studied topics), with the peptides studied for each, most-studied first.

Scope research:read · key optional · paginated

Query parameterTypeDescription
searchstringPart of an area name.
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
curl "https://api.peptidelibrary.app/v1/research-areas?limit=10"
Response fields: ResearchArea
namestring
peptide_countinteger
peptidesobject[]
Try it in the playground →

Research statistics

Research Intelligence Center: published statistics on the peptide literature (PubMed records and ClinicalTrials.gov registrations), trends, counted publications, per-peptide statistics, datasets, reports and charts. Every number names its snapshot version. No key needed.

GET/v1/research/statistics

Research statistics

Every published statistic of a snapshot (the State of Peptide Research figures), each with its exact definition, numerator, denominator and caveat flags. Cite the snapshot version.

Scope research:read · key optional · paginated

Query parameterTypeDescription
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
sectionintegerOnly statistics used in this report section (1-10).
limitintegerResults per page (1-100, default 50).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
curl "https://api.peptidelibrary.app/v1/research/statistics?version=latest&limit=5"
Response fields: ResearchStatistic
idstring
namestring
kind"count" | "share" | "growth" | "cagr" | "ranking"
unitstring
sectionintegerState of Peptide Research section that uses it.
definitionstring
numerator_definitionstring | null
denominator_definitionstring | null
min_baselineinteger | null
valuenumber | null
numeratornumber | null
denominatornumber | null
flagsstring[]Caveats: partial_year, small_baseline, high_unclassified, whole_months_only, no_denominator.
detailobjectRankings (array of rows) or comparison detail (object); null when none.
snapshotResearchSnapshotRef
methodology_urlstringAbsolute URL.
Try it in the playground →

GET/v1/research/statistics/{id}

One research statistic

A single published statistic with its definition and the snapshot it comes from.

Scope research:read · key optional

Path parameterTypeDescription
idrequired"total_publications" | "compounds_indexed" | "compounds_with_publications" | "publications_ytd" | "growth_ytd" | "pubmed_growth_ytd" | "cagr_10y" | "pubmed_cagr_10y" | "human_clinical_share" | "preclinical_share" | "animal_share" | "in_vitro_share" | "secondary_share" | "unclassified_share" | "rct_publications" | "compounds_with_human_clinical_share" | "compounds_preclinical_only_share" | "trials_registered" | "trials_without_results_share" | "open_access_share" | "retracted_publications" | "ai_classified_share" | "top_compounds" | "top_research_only" | "fastest_growing_compounds" | "fastest_growing_categories" | "top_categories" | "evidence_gap" | "glp1_publications" | "glp1_share" | "glp1_growth_ytd" | "glp1_human_clinical_share" | "glp1_trials" | "cognitive_publications" | "cognitive_human_clinical_share" | "longevity_publications" | "longevity_human_clinical_share" | "top_journals"Statistic id, e.g. `human_clinical_share`.
Query parameterTypeDescription
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
curl "https://api.peptidelibrary.app/v1/research/statistics/total_publications"
Response fields: ResearchStatistic
idstring
namestring
kind"count" | "share" | "growth" | "cagr" | "ranking"
unitstring
sectionintegerState of Peptide Research section that uses it.
definitionstring
numerator_definitionstring | null
denominator_definitionstring | null
min_baselineinteger | null
valuenumber | null
numeratornumber | null
denominatornumber | null
flagsstring[]Caveats: partial_year, small_baseline, high_unclassified, whole_months_only, no_denominator.
detailobjectRankings (array of rows) or comparison detail (object); null when none.
snapshotResearchSnapshotRef
methodology_urlstringAbsolute URL.
Try it in the playground →

GET/v1/research/trends

Research trends

A data series from a snapshot: publications by year, the same months of every year (`ytd_by_year`), evidence classes, study types, categories, peptides, trials, journals, countries, open access, all of PubMed, and counts-only compounds. The cutoff year is partial.

Scope research:read · key optional

Query parameterTypeDescription
metricrequired"publications_by_year" | "ytd_by_year" | "evidence_by_year" | "evidence_mix" | "study_types" | "categories" | "categories_by_year" | "compounds" | "trials_by_year" | "trials_by_phase" | "trials_by_status" | "journals" | "countries" | "open_access_by_year" | "pubmed_by_year" | "counts_only"The series.
peptidestringOnly publications about this peptide (id, name or alias).
group"glp1" | "amylin" | "gh_axis" | "tissue_repair" | "cognitive_neuro" | "longevity_aging" | "bioregulators" | "thymic" | "melanocortin" | "cosmetic"Only publications about a peptide in this compound group.
category"metabolic" | "obesity_weight" | "cognitive" | "neurological" | "longevity_aging" | "tissue_repair" | "musculoskeletal" | "cardiovascular" | "immune" | "dermatology" | "gastrointestinal" | "endocrinology" | "oncology" | "antimicrobial" | "reproductive_sexual"Only publications in this research category.
evidence_class"human_clinical" | "secondary" | "animal" | "in_vitro" | "computational" | "other" | "unclassified"Only this evidence class.
study_type"rct" | "clinical_trial" | "observational" | "case_report" | "meta_analysis" | "systematic_review" | "review" | "animal" | "in_vitro" | "computational" | "guideline" | "other" | "notice" | "unclassified"Only this study type.
regulatory"FDA-Approved" | "Clinical Trial" | "Research-Only"Only peptides with this regulatory label in the library.
from_yearintegerFirst year (default: the window start).
to_yearintegerLast year (default: the cutoff year).
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
curl "https://api.peptidelibrary.app/v1/research/trends?metric=publications_by_year&group=glp1"
Response fields: ResearchTrend
metricstring
filtersobject
partial_yearintegerThe cutoff year, which is incomplete.
rowsobject[]
snapshotResearchSnapshotRef
chart_urlstring | null
Try it in the playground →

GET/v1/research/publications

Counted publications

The publications behind the statistics (metadata only: identifiers, title, journal, date, classification, peptides). Newest first.

Scope research:read · key optional · paginated

Query parameterTypeDescription
peptidestringOnly publications about this peptide (id, name or alias).
group"glp1" | "amylin" | "gh_axis" | "tissue_repair" | "cognitive_neuro" | "longevity_aging" | "bioregulators" | "thymic" | "melanocortin" | "cosmetic"Only publications about a peptide in this compound group.
category"metabolic" | "obesity_weight" | "cognitive" | "neurological" | "longevity_aging" | "tissue_repair" | "musculoskeletal" | "cardiovascular" | "immune" | "dermatology" | "gastrointestinal" | "endocrinology" | "oncology" | "antimicrobial" | "reproductive_sexual"Only publications in this research category.
evidence_class"human_clinical" | "secondary" | "animal" | "in_vitro" | "computational" | "other" | "unclassified"Only this evidence class.
study_type"rct" | "clinical_trial" | "observational" | "case_report" | "meta_analysis" | "systematic_review" | "review" | "animal" | "in_vitro" | "computational" | "guideline" | "other" | "notice" | "unclassified"Only this study type.
regulatory"FDA-Approved" | "Clinical Trial" | "Research-Only"Only peptides with this regulatory label in the library.
yearintegerFirst-publication year.
searchstringWords in the title.
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
limitintegerResults per page (1-100, default 25).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, pmid, doi, title, journal, first_pub_date, study_type, evidence_class, categories, peptide_ids, open_access, pubmed_url, doi_url.
curl "https://api.peptidelibrary.app/v1/research/publications?peptide=bpc-157&evidence_class=human_clinical&limit=10"
Response fields: ResearchPublication
idstring`pmid-` + the PubMed id.
pmidstring
doistring | null
titlestring | null
journalstring | null
first_pub_datestring
study_typestring
evidence_classstring
categoriesstring[]
peptide_idsstring[]
open_accessboolean | null
pubmed_urlstringAbsolute URL.
doi_urlstring | null
Try it in the playground →

GET/v1/research/peptides/{slug}/statistics

Research statistics for a peptide

Publication counts by year, evidence class and study type, research categories, registered trials, key publications and evidence limitations for one peptide. Compounds with very large general literatures are counts only.

Scope research:read · key optional

Path parameterTypeDescription
slugrequiredstringPeptide id (e.g. `bpc-157`), name, synonym or alias. Aliases resolve to the canonical profile.
Query parameterTypeDescription
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
curl "https://api.peptidelibrary.app/v1/research/peptides/bpc-157/statistics"
Response fields: ResearchPeptideStatistics
peptideobject
snapshotResearchSnapshotRef
tier"records" | "counts_only" | "excluded"`counts_only`: yearly counts only (a very large, general literature); `excluded`: a blend or comparison entry.
tier_reasonstring | null
is_peptideboolean
originstring | null
regulatorystring | null
groupsstring[]
totalsobject | null
by_yearobject[]
study_typesobject[]
categoriesobject[]
trialsobject | null
key_publicationsResearchPublication[]
limitationsobject[]
querystring | nullThe exact Europe PMC query behind the counts.
research_urlstringAbsolute URL.
Try it in the playground →

GET/v1/research/categories

Research categories

The research categories (from MeSH major topics) with their MeSH roots and the snapshot's publication count in each. Categories overlap.

Scope research:read · key optional · paginated

Query parameterTypeDescription
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
curl "https://api.peptidelibrary.app/v1/research/categories"
Response fields: ResearchCategory
idstring
labelstring
descriptionstring
mesh_rootsstring[]
publicationsinteger | null
Try it in the playground →

GET/v1/research/datasets

Research datasets

Downloadable datasets with their columns, every published version (CSV, JSON and XLSX links), the license and how to cite them.

Scope research:read · key optional · paginated

curl "https://api.peptidelibrary.app/v1/research/datasets"
Response fields: ResearchDataset
idstring
titlestring
descriptionstring
columnsobject[]
versionsobject[]
licenseobject
citationstring
Try it in the playground →

GET/v1/research/reports

Research reports

Published research reports and quarterly updates, newest first, with every edition (editions never change; revisions are new versions).

Scope research:read · key optional · paginated

curl "https://api.peptidelibrary.app/v1/research/reports"
Response fields: ResearchReport
slugstring
kindstring
titlestring
subtitlestring | null
versioninteger
published_atstring
snapshotResearchSnapshotRef
urlstringAbsolute URL.
versionsobject[]
Try it in the playground →

GET/v1/research/charts/{id}

A research chart

A chart's definition, its data rows, and links to its page, embed, PNG and SVG. Images carry the source line.

Scope research:read · key optional

Path parameterTypeDescription
idrequired"publications-by-year" | "publications-year-to-date" | "evidence-by-year" | "evidence-mix" | "most-researched-peptides" | "research-categories" | "glp1-publications-by-year" | "glp1-peptides" | "cognitive-peptides" | "longevity-peptides" | "trials-by-year" | "top-journals" | "open-access-by-year"Chart id.
Query parameterTypeDescription
versionstringWhich snapshot: `latest` (default; the newest editorially approved edition), `live` (the automated weekly refresh) or a dataset version such as `2026.1`.
curl "https://api.peptidelibrary.app/v1/research/charts/publications-by-year"
Response fields: ResearchChart
idstring
titlestring
subtitlestring
kindstring
unitstring
how_to_readstring
rowsobject[]
snapshotResearchSnapshotRef
permalinkstringAbsolute URL.
embed_urlstringAbsolute URL.
png_urlstringAbsolute URL.
svg_urlstringAbsolute URL.
sourcestring
Try it in the playground →

Studies

Studies and other sources cited by the profiles, with evidence classifications. No key needed.

GET/v1/peptides/{slug}/studies

Studies cited by a peptide profile

Up to 12 cited sources with their evidence classification (regulatory label, controlled human trial, human study, secondary report, animal or lab, in vitro), identifiers and the editors' finding summary.

Scope studies:read · key optional · paginated

Path parameterTypeDescription
slugrequiredstringPeptide id (e.g. `bpc-157`), name, synonym or alias. Aliases resolve to the canonical profile.
curl "https://api.peptidelibrary.app/v1/peptides/semaglutide/studies"
Response fields: Study
idstring | nullStable id from the study's identifier (`pmid-…`, `doi-…`, `nct-…`); null when it has none.
titlestring
publication_yearnumber | "not_documented"
authors"not_documented"Not stored by Peptide Library.
journal"not_documented"Not stored by Peptide Library.
doistring | null
pmidstring | null
nct_idstring | null
study_typestring | "not_documented"
research_model"human" | "animal_or_lab" | "in_vitro" | "regulatory_label" | "secondary_report"
populationstring | "not_documented"
sample_sizenumber | "not_documented"
summarystring | "not_documented"The finding as summarised by Peptide Library editors (dose figures removed).
evidence_classification"regulatory_label" | "human_controlled_trial" | "human_study" | "secondary_report" | "animal_or_lab" | "in_vitro"
evidence_classification_labelstring
analog_compoundbooleanResearch on a related compound, not this one.
limitationsstring[]
source_urlstring | "not_documented"
Try it in the playground →

GET/v1/studies

List studies

Studies with a PubMed, DOI or ClinicalTrials.gov identifier, de-duplicated across every profile, with the profiles that cite them.

Scope studies:read · key optional · paginated

Query parameterTypeDescription
peptidestringOnly studies cited by this peptide (id, name or alias).
evidence_classificationstringComma-separated classifications.
year_fromintegerEarliest publication year.
year_tointegerLatest publication year.
searchstringWords in the title.
sort"newest" | "oldest" | "title"`newest` (default), `oldest` or `title`.
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, title, publication_year, authors, journal, doi, pmid, nct_id, study_type, research_model, evidence_classification, evidence_classification_label, source_url, cited_by.
curl "https://api.peptidelibrary.app/v1/studies?peptide=semaglutide&evidence_classification=human_controlled_trial"
Response fields: StudyIndexEntry
idstring
titlestring
publication_yearnumber | "not_documented"
authors"not_documented"Not stored by Peptide Library.
journal"not_documented"Not stored by Peptide Library.
doistring | null
pmidstring | null
nct_idstring | null
study_typestring | "not_documented"
research_model"human" | "animal_or_lab" | "in_vitro" | "regulatory_label" | "secondary_report"
evidence_classification"regulatory_label" | "human_controlled_trial" | "human_study" | "secondary_report" | "animal_or_lab" | "in_vitro"
evidence_classification_labelstring
source_urlstring | "not_documented"
cited_byobject[]
Try it in the playground →

GET/v1/studies/{id}

Get a study

One study by id (`pmid-…`, `doi-…` with `/` written as `--`, or `nct-…`) with each citing profile's summary.

Scope studies:read · key optional

Path parameterTypeDescription
idrequiredstringStudy id from /v1/studies.
curl "https://api.peptidelibrary.app/v1/studies/pmid-33567185"
Response fields: StudyDetail
idstring
titlestring
publication_yearnumber | "not_documented"
authors"not_documented"Not stored by Peptide Library.
journal"not_documented"Not stored by Peptide Library.
doistring | null
pmidstring | null
nct_idstring | null
study_typestring | "not_documented"
research_model"human" | "animal_or_lab" | "in_vitro" | "regulatory_label" | "secondary_report"
evidence_classification"regulatory_label" | "human_controlled_trial" | "human_study" | "secondary_report" | "animal_or_lab" | "in_vitro"
evidence_classification_labelstring
source_urlstring | "not_documented"
cited_byobject[]
citationsobject[]
Try it in the playground →

Vendors

The Peptide Library vendor directory. Needs a key with vendors:read (products and prices: their own scopes).

GET/v1/vendors

List vendors

The Peptide Library vendor directory with search and filters. Ratings come from published reviews (verified = receipt checked by a moderator); order never depends on commissions or affiliate status.

Scope vendors:read · key required · counts against your plan · paginated

Query parameterTypeDescription
searchstringVendor name or alias.
countrystringWhere the vendor is based (ISO 3166-1 alpha-2).
ships_tostringOnly vendors that ship to this destination (country "US" or subdivision "US-CA"). Unknown coverage is left out.
product_category"peptides" | "sprays" | "capsules" | "other"Only vendors with live listings of this product type.
min_ratingnumberMinimum average rating (0-5).
peptidestringOnly vendors with live listings of this peptide (id, name or alias).
sort"best_match" | "rating" | "reviews" | "popular" | "products" | "name" | "-name"Order (default `best_match`).
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, slug, name, description, logo_url, country, region, website_url, profile_url, product_categories, rating, catalog, shipping, api_url.
curl "https://api.peptidelibrary.app/v1/vendors?ships_to=US&min_rating=4" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: Vendor
idstringStable vendor id.
slugstringThe vendor's profile URL slug (`/shop/vendor/{slug}`). Permanent unless staff change it; former slugs still resolve.
namestring
descriptionstring | null
logo_urlstring | null
countrystring | null
regionstring | null
website_urlstringPeptide Library link to the vendor's site (may be an affiliate link).
profile_urlstringThe vendor's profile page on Peptide Library (its slug URL).
product_categories"peptides" | "sprays" | "capsules" | "other"[]
ratingobject
catalogobject
shippingobject
api_urlstringAbsolute URL.
Try it in the playground →

GET/v1/vendors/compare

Compare vendors

Two to four vendors side by side: ratings, catalog size, shipping facts.

Scope vendors:read · key required · counts against your plan

Query parameterTypeDescription
idsrequiredstring2-4 comma-separated vendor ids or slugs.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
curl "https://api.peptidelibrary.app/v1/vendors/compare?ids=8,13&ships_to=US" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: VendorComparison
vendorsVendor[]
rowsobject[]
notestring
Try it in the playground →

GET/v1/vendors/{id}

Get a vendor

A vendor's public profile: description, location, catalog, shipping summary, review summary and the source of each fact.

Scope vendors:read · key required · counts against your plan

Path parameterTypeDescription
idrequiredstringVendor id (stable) or the vendor's slug.
Query parameterTypeDescription
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
curl "https://api.peptidelibrary.app/v1/vendors/8" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: VendorDetail
idstringStable vendor id.
slugstringThe vendor's profile URL slug (`/shop/vendor/{slug}`). Permanent unless staff change it; former slugs still resolve.
namestring
descriptionstring | null
logo_urlstring | null
countrystring | null
regionstring | null
website_urlstringPeptide Library link to the vendor's site (may be an affiliate link).
profile_urlstringThe vendor's profile page on Peptide Library (its slug URL).
product_categories"peptides" | "sprays" | "capsules" | "other"[]
ratingobject
catalogobject
shippingobject
api_urlstringAbsolute URL.
aboutobject
reviewsobject
sourcesobject
Try it in the playground →

GET/v1/vendors/{id}/shipping

Vendor shipping destinations

Destinations, exclusions, methods, free-shipping and returns facts, each with its source.

Scope vendors:read · key required · counts against your plan

Path parameterTypeDescription
idrequiredstringVendor id (stable) or the vendor's slug.
Query parameterTypeDescription
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
curl "https://api.peptidelibrary.app/v1/vendors/8/shipping?ships_to=US-CA" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: VendorShipping
vendorobject
ships_toobject | nullShipping to the `ships_to` destination you asked about; null when you didn't ask. `unknown` is never shown as ships.
coverage"verified" | "partial" | "unknown"
destinationsstring[]Countries, US-XX states or groups (EU, EEA, WORLDWIDE) the vendor lists.
excludedstring[]
ships_internationallyboolean | null
ships_fromstring | null
processing_timestring | null
methodsobject[]
free_shippingobject | null
returnsobject | null
policy_urlstring | null
last_verified_atstring | null
sourcesobject
Try it in the playground →

GET/v1/vendors/{id}/products

Products a vendor lists

The vendor's current products, one per compound and form.

Scope products:read · key required · counts against your plan · paginated

Path parameterTypeDescription
idrequiredstringVendor id (stable) or the vendor's slug.
Query parameterTypeDescription
searchstringProduct or compound name.
peptidestringPeptide id, name or alias.
categorystringComma-separated product types.
formstringComma-separated forms: vial, solution, pen, nasal_spray, oral_spray, spray, capsule, tablet, topical, liquid, bulk_powder, other, unknown.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
in_stockbooleanOnly in-stock offers.
sort"name" | "offers" | "vendors"Order (default `name`).
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, peptide, form, product_type, offer_count, vendor_count, in_stock_count, prices, last_seen_at, api_url.
curl "https://api.peptidelibrary.app/v1/vendors/8/products" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: Product
idstringCompound and form, e.g. `bpc-157::vial`.
peptideobject
form"vial" | "solution" | "pen" | "nasal_spray" | "oral_spray" | "spray" | "capsule" | "tablet" | "topical" | "liquid" | "bulk_powder" | "other" | "unknown"
product_type"peptides" | "sprays" | "capsules" | "other"
offer_countinteger
vendor_countinteger
in_stock_countinteger
pricesobject[]Per currency, never converted or mixed.
last_seen_atstring | null
api_urlstringAbsolute URL.
Try it in the playground →

GET/v1/vendors/{id}/prices

A vendor's prices

The vendor's current offers with listed prices.

Scope pricing:read · key required · counts against your plan · paginated

Path parameterTypeDescription
idrequiredstringVendor id (stable) or the vendor's slug.
Query parameterTypeDescription
searchstringProduct or compound name.
peptidestringPeptide id, name or alias.
categorystringComma-separated product types.
formstringComma-separated forms: vial, solution, pen, nasal_spray, oral_spray, spray, capsule, tablet, topical, liquid, bulk_powder, other, unknown.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
in_stockbooleanOnly in-stock offers.
productstringComma-separated product ids (`<peptide>::<form>`).
currencystringISO 4217 currency of the listed price.
price_minnumberMinimum listed price.
price_maxnumberMaximum listed price.
strength_min_mgnumberMinimum listed strength in mg.
strength_max_mgnumberMaximum listed strength in mg.
sort"price" | "-price" | "price_per_mg" | "updated" | "newest" | "vendor"Order (default `price`).
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, product_id, product_name, peptide, vendor, product_type, form, strength, price, regular_price, currency, price_per_mg, price_per_unit, availability, ships_to, last_seen_at, is_stale, first_seen_at, price_changed_at, product_page_url, is_affiliate_link.
curl "https://api.peptidelibrary.app/v1/vendors/8/prices?form=vial" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: Offer
idstringOffer id.
product_idstring
product_namestringAs the vendor lists it.
peptideobject
vendorobject
product_type"peptides" | "sprays" | "capsules" | "other"
form"vial" | "solution" | "pen" | "nasal_spray" | "oral_spray" | "spray" | "capsule" | "tablet" | "topical" | "liquid" | "bulk_powder" | "other" | "unknown"
strengthobject
pricestringDecimal amount as a string, never a float.
regular_pricestring | null
currencystring
price_per_mgstring | null
price_per_unitstring | null
availability"in_stock" | "out_of_stock"
ships_toobject | nullShipping to the `ships_to` destination you asked about; null when you didn't ask. `unknown` is never shown as ships.
last_seen_atstring | nullWhen the price was last seen on the vendor's site.
is_stalebooleanTrue when not seen in the last 7 days.
first_seen_atstring | null
price_changed_atstring | null
product_page_urlstringPeptide Library redirect to the vendor's page; logs the click.
is_affiliate_linkboolean
Try it in the playground →

Products

Products (compound x form) with price ranges per currency. Needs products:read.

GET/v1/products

List products

One product per compound and form (e.g. BPC-157 vials), with offer counts and price ranges per currency.

Scope products:read · key required · counts against your plan · paginated

Query parameterTypeDescription
searchstringProduct or compound name.
peptidestringPeptide id, name or alias.
categorystringComma-separated product types.
formstringComma-separated forms: vial, solution, pen, nasal_spray, oral_spray, spray, capsule, tablet, topical, liquid, bulk_powder, other, unknown.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
in_stockbooleanOnly in-stock offers.
sort"name" | "offers" | "vendors"Order (default `name`).
vendorstringVendor id or slug.
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, peptide, form, product_type, offer_count, vendor_count, in_stock_count, prices, last_seen_at, api_url.
curl "https://api.peptidelibrary.app/v1/products?peptide=bpc-157" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: Product
idstringCompound and form, e.g. `bpc-157::vial`.
peptideobject
form"vial" | "solution" | "pen" | "nasal_spray" | "oral_spray" | "spray" | "capsule" | "tablet" | "topical" | "liquid" | "bulk_powder" | "other" | "unknown"
product_type"peptides" | "sprays" | "capsules" | "other"
offer_countinteger
vendor_countinteger
in_stock_countinteger
pricesobject[]Per currency, never converted or mixed.
last_seen_atstring | null
api_urlstringAbsolute URL.
Try it in the playground →

GET/v1/products/{id}

Get a product

One compound and form with its price ranges; with `pricing:read`, every current offer.

Scope products:read · key required · counts against your plan

Path parameterTypeDescription
idrequiredstringProduct id: peptide id and form, e.g. `bpc-157::vial`.
Query parameterTypeDescription
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
curl "https://api.peptidelibrary.app/v1/products/bpc-157::vial" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: ProductDetail
idstringCompound and form, e.g. `bpc-157::vial`.
peptideobject
form"vial" | "solution" | "pen" | "nasal_spray" | "oral_spray" | "spray" | "capsule" | "tablet" | "topical" | "liquid" | "bulk_powder" | "other" | "unknown"
product_type"peptides" | "sprays" | "capsules" | "other"
offer_countinteger
vendor_countinteger
in_stock_countinteger
pricesobject[]Per currency, never converted or mixed.
last_seen_atstring | null
api_urlstringAbsolute URL.
offersOffer[] | nullWith the `pricing:read` scope; otherwise null.
Try it in the playground →

Prices

Current vendor offers with listed prices. Needs pricing:read. Includes affiliate links.

GET/v1/prices

List prices

Current offers with listed price, strength, availability, shipping eligibility and when the price was last seen.

Scope pricing:read · key required · counts against your plan · paginated

Query parameterTypeDescription
searchstringProduct or compound name.
peptidestringPeptide id, name or alias.
categorystringComma-separated product types.
formstringComma-separated forms: vial, solution, pen, nasal_spray, oral_spray, spray, capsule, tablet, topical, liquid, bulk_powder, other, unknown.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
in_stockbooleanOnly in-stock offers.
productstringComma-separated product ids (`<peptide>::<form>`).
currencystringISO 4217 currency of the listed price.
price_minnumberMinimum listed price.
price_maxnumberMaximum listed price.
strength_min_mgnumberMinimum listed strength in mg.
strength_max_mgnumberMaximum listed strength in mg.
sort"price" | "-price" | "price_per_mg" | "updated" | "newest" | "vendor"Order (default `price`).
vendorstringVendor id or slug.
limitintegerResults per page (1-100, default 20).
cursorstringOpaque cursor from `pagination.next_cursor` of the previous page.
fieldsstringComma-separated fields to return for each item (`id` is always included). One of: id, product_id, product_name, peptide, vendor, product_type, form, strength, price, regular_price, currency, price_per_mg, price_per_unit, availability, ships_to, last_seen_at, is_stale, first_seen_at, price_changed_at, product_page_url, is_affiliate_link.
curl "https://api.peptidelibrary.app/v1/prices?peptide=bpc-157&form=vial&currency=USD&ships_to=US" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: Offer
idstringOffer id.
product_idstring
product_namestringAs the vendor lists it.
peptideobject
vendorobject
product_type"peptides" | "sprays" | "capsules" | "other"
form"vial" | "solution" | "pen" | "nasal_spray" | "oral_spray" | "spray" | "capsule" | "tablet" | "topical" | "liquid" | "bulk_powder" | "other" | "unknown"
strengthobject
pricestringDecimal amount as a string, never a float.
regular_pricestring | null
currencystring
price_per_mgstring | null
price_per_unitstring | null
availability"in_stock" | "out_of_stock"
ships_toobject | nullShipping to the `ships_to` destination you asked about; null when you didn't ask. `unknown` is never shown as ships.
last_seen_atstring | nullWhen the price was last seen on the vendor's site.
is_stalebooleanTrue when not seen in the last 7 days.
first_seen_atstring | null
price_changed_atstring | null
product_page_urlstringPeptide Library redirect to the vendor's page; logs the click.
is_affiliate_linkboolean
Try it in the playground →

GET/v1/prices/compare

Compare prices for a peptide

Offers for one peptide grouped by form, currency and listed strength. Prices are compared only within a group; nothing is ranked or recommended.

Scope pricing:read · key required · counts against your plan

Query parameterTypeDescription
peptiderequiredstringPeptide id, name or alias.
formstringComma-separated forms.
currencystringISO 4217 currency.
ships_tostringShipping destination: ISO 3166-1 alpha-2 country ("US") or subdivision ("US-CA"). Adds `ships_to` to each result; `unknown` is never treated as ships.
in_stockbooleanOnly in-stock offers.
curl "https://api.peptidelibrary.app/v1/prices/compare?peptide=bpc-157&currency=USD" \
  -H "Authorization: Bearer $PEPTIDE_LIBRARY_API_KEY"
Response fields: PriceComparison
peptideobject
groupsobject[]
notestring
Try it in the playground →

Meta

API index and health.

GET/v1

API index

The API's version, documentation links and endpoints.

Scope research:read · key optional

curl "https://api.peptidelibrary.app/v1"
Response fields: ApiIndex
namestring
versionstring
releasestring
documentationstringAbsolute URL.
openapistringAbsolute URL.
endpointsobject[]
Try it in the playground →

GET/v1/health

Health check

Whether the API can read its data. 503 when the database is unavailable.

Scope research:read · key optional

curl "https://api.peptidelibrary.app/v1/health"
Response fields: Health
status"ok" | "degraded"
database"ok" | "unavailable"
releasestring
Try it in the playground →