API reference · v1 (1.0.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 →

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.
slugstring
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_urlstringAbsolute 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.
slugstring
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_urlstringAbsolute 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 →