Docs
API overview
Read-only JSON over HTTPS. No key. Credit Peptilyze when you show the data and respect the rate limits.
Base URL
https://peptilyze.com/api/v1- Methods:
GET,HEAD,OPTIONS. Anything else is405. - CORS is open: any origin may call the API from a browser.
- No authentication. Send a
User-Agentthat names your application. - Machine description: /api/v1/openapi.json (OpenAPI 3.1).
| Endpoint | Returns |
|---|---|
GET /compounds | Every compound with at least one offer |
GET /compounds/{slug} | One compound with all its offers |
GET /shops | Listed shops with statistics |
GET /shops/{id} | One shop with all its offers |
GET /market | Market summary numbers |
Response envelope
Every successful answer has the same three keys:
attribution: the credit to show. See attribution.generatedAt: when the underlying hourly snapshot was made (ISO 8601, UTC).pricing: the currency and VAT basis of every price indata, plus the exchange rate and its date when converted.data: the payload documented per endpoint.
{
"attribution": {
"required": true,
"text": "Data: Peptilyze (peptilyze.com)",
"url": "https://peptilyze.com/",
"license": "CC BY 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
"terms": "https://peptilyze.com/docs/attribution/"
},
"generatedAt": "2026-11-09T13:00:54.150Z",
"pricing": { "currency": "USD", "vat": "excluded", "eurRate": 1.0873, "rateDate": "2026-11-09", "rateSource": "European Central Bank euro foreign exchange reference rates" },
"data": { }
}Conventions
- Prices are EUR including VAT by default.
?currency=and?vat=excludedchange that;pricingin every answer says what was used. Rounded for output: 2 decimals per pack or unit, 4 per mg. - Field names are camelCase. A
nullmeans unknown, never zero. See data and caveats. - Compound slugs and shop ids are the ones in the page URLs. They are stable; a shop that closes disappears from the API but keeps its page.
- Lists are complete, not paged: the catalog is a few hundred rows.
Currency and VAT
Every endpoint that returns prices takes the same two optional query parameters.
| Parameter | Values | Default |
|---|---|---|
currency | an ISO 4217 code: EUR, one the ECB publishes (USD, GBP, CHF, CAD, AUD, JPY, SEK and more), or one of a short list of others served from community rates (AED, SAR and more). A wrong code returns the full list. | EUR |
vat | included, excluded | included |
ship | an ISO 3166-1 country code, for example DE | none |
curl 'https://peptilyze.com/api/v1/compounds/bpc-157?currency=USD&vat=excluded'ship works like the site's “Ship to” choice: compound and market numbers leave out shops that state they do not ship to that country, and shops that do not say stay in. The answer lists them in shipTo.excludedShops and counts the unconfirmed ones in shipTo.unconfirmedShops. Shop objects always stay complete and carry shipsTo and, with ship, ships.
See Data and caveats for how conversion and the VAT basis work and what they do not tell you.
Errors
| Status | Meaning |
|---|---|
400 | A bad currency (not a supported code), vat (not included or excluded) or ship (not a two-letter country code) value. |
404 | Unknown path, slug or id. |
405 | A method other than GET, HEAD or OPTIONS. |
429 | Rate limit. Wait Retry-After seconds. See rate limits. |
503 | Data, or exchange rates for a non-EUR request, temporarily unavailable. Retry after Retry-After seconds, or use currency=EUR. |
Errors are JSON and never cached:
{ "error": "Not found.", "docs": "https://peptilyze.com/docs/api/" }Versioning
Within version 1, changes only add fields, so ignore fields you do not know. (Before 2026-11-09 price fields carried an Eur suffix; they are now currency-neutral, and pricing says which currency applies.) A breaking change would ship as /api/v2, with v1 kept for a notice period.