Juno APIjuno.co.uk ↗
Access Juno Records catalog via API. Search vinyl and CDs, get product details with tracklists, browse by genre, and retrieve bestseller charts.
What is the Juno API?
The Juno Records API provides 6 endpoints for querying one of the web's largest independent record stores, covering search, genre browsing, new releases, bestseller charts, product detail, and autocomplete. The search_products endpoint returns up to 50 products per page with fields including artist, title, label, catalog number, format, genre, price, status, and image URL. Product detail via get_product_detail adds per-track data including side, number, title, and duration.
curl -X GET 'https://api.parse.bot/scraper/64c810a2-fe0a-4683-8207-1b49beb30fd2/search_products?page=1&query=techno' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace juno-co-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Juno Records SDK — discover, browse, and inspect music products."""
from parse_apis.juno_records_api import JunoRecords, Timeframe, GenreSlug, ProductNotFound
client = JunoRecords()
# Search for products by keyword, capped at 5 results
for product in client.products.search(query="aphex twin", limit=5):
print(product.artist, product.title, product.price)
# Browse a genre using the enum
for product in client.products.browse_genre(genre_slug=GenreSlug.TECHNO, timeframe=Timeframe.THIS_WEEK, limit=3):
print(product.title, product.label, product.format)
# Drill into one product's full detail via the sub-resource navigation
top_hit = client.products.bestsellers(timeframe=Timeframe.THIS_WEEK, limit=1).first()
if top_hit:
detail = top_hit.details()
print(detail.details.artist, detail.details.title, detail.details.price, detail.details.currency)
print(detail.metadata.genre, detail.metadata.format)
for track in detail.tracklist[:3]:
print(track.side, track.number, track.title, track.duration)
# Autocomplete suggestions
for suggestion in client.suggestions.search(query="daft", limit=5):
print(suggestion.label, suggestion.category)
# Typed error handling
try:
bad = client.products.search(query="zzzznonexistent999", limit=1).first()
if bad:
bad.details()
except ProductNotFound as exc:
print(f"Product not found: {exc.url}")
print("exercised: products.search / products.browse_genre / products.bestsellers / product.details / suggestions.search")Full-text search over Juno Records' catalog. Returns a paginated list of up to 50 products per page matching the query keyword against artist, title, and label fields. Pagination advances via the page parameter; results include artist, title, label, price, format, and product URL.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| queryrequired | string | Search keyword (e.g. 'techno', 'aphex twin'). |
{
"type": "object",
"fields": {
"count": "integer, number of items returned on this page",
"items": "array of product objects with product_id, artist, title, label, catalog_number, format, genre, price, status, url, and image_url",
"summary": "string, pagination summary text from the site"
},
"sample": {
"data": {
"count": 50,
"items": [
{
"url": "https://www.juno.co.uk/products/talla-2xlc-yakooza-techno-club-retro-vol-2-vinyl/1139098-01/",
"genre": "Techno",
"label": "Techno Club Germany",
"price": "$30.12",
"title": "Techno Club Retro Vol 2",
"artist": "TALLA 2XLC",
"format": "coloured vinyl 12\"",
"status": "FORTHCOMING",
"image_url": "https://imagescdn.juno.co.uk/300/CS1139098-01A-MED.jpg",
"product_id": "1139098-1",
"catalog_number": "TCR 210011."
}
],
"summary": ""
},
"status": "success"
}
}About the Juno API
Search and Browse the Catalog
The search_products endpoint accepts a query string — artist names, release titles, genre terms — and returns paginated results with a count, a summary string reflecting pagination state, and an items array. Each item carries product_id, artist, title, label, catalog_number, format, genre, price, status, url, and image_url. Pages are controlled with the page parameter; each page returns up to 50 items.
The browse_genre endpoint works similarly but filters by genre_slug (e.g. techno, house, drum-n-bass) and accepts a timeframe parameter — today, this-week, eight-weeks, back-cat, or preorders — making it practical for tracking what's newly listed or available to pre-order within a specific scene. The get_new_releases endpoint applies the same timeframe logic across all genres, while get_bestsellers narrows to today or this-week for chart data.
Product Detail and Tracklists
Passing a Juno product URL path or full URL to get_product_detail returns structured data beyond the list view. The details object contains artist, title, id, price, currency, and category. The metadata object holds key-value pairs such as format and catalog number. The tracklist array breaks down individual tracks with side, number, title, and duration. A description field carries the editorial review or product description text.
Autocomplete
The search_autocomplete endpoint accepts a partial query string and returns a data array of suggestion objects. Each suggestion includes a label (display text), a category, and a url pointing to the matching result on Juno. This is useful for building type-ahead search interfaces or resolving canonical URLs before calling get_product_detail.
The Juno API is a managed, monitored endpoint for juno.co.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when juno.co.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official juno.co.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new techno or house vinyl listings each week using
browse_genrewith thethis-weektimeframe filter. - Build a record-store price tracker by polling
search_productsfor specific artist or label names and recording thepricefield over time. - Populate a music discovery app with weekly bestseller charts using
get_bestsellersfiltered tothis-week. - Enrich a music database with full tracklists by calling
get_product_detailfor catalog numbers retrieved from search results. - Implement type-ahead search for a vinyl collection tool using the
search_autocompleteendpoint with partial artist or title strings. - Aggregate new pre-order listings across multiple genres by calling
browse_genrewithtimeframe=preordersfor each genre slug. - Cross-reference catalog numbers from a personal collection against Juno's
labelandformatfields to identify pressings.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Juno Records have an official developer API?+
What does `get_product_detail` return that the list endpoints don't?+
search_products, browse_genre, etc.) return summary fields: artist, title, label, catalog number, format, genre, price, status, and image URL. get_product_detail adds a structured tracklist array with per-track side, number, title, and duration, a metadata key-value object, and a description field containing the editorial review text.What timeframe options are available for genre browsing and charts?+
browse_genre accepts today, this-week, eight-weeks, back-cat, and preorders. get_new_releases supports today, this-week, and eight-weeks. get_bestsellers supports today and this-week. There is no custom date-range parameter; filtering is limited to these preset values.Does the API expose user reviews, ratings, or seller inventory counts?+
Can I retrieve a full list of available genre slugs from the API?+
browse_genre endpoint requires a genre_slug input matching Juno's URL structure — examples include techno, house, electronic, and drum-n-bass. A slug that doesn't match a valid Juno genre path will return no results. You can fork the API on Parse and revise it to add a genre-listing endpoint.