Caliber Corner APIcalibercorner.com ↗
Search and retrieve full specifications for watch calibers from Caliber Corner. Access movement specs, jewel count, beat rate, power reserve, and more via 2 endpoints.
What is the Caliber Corner API?
The Caliber Corner API provides access to the watch movement database at calibercorner.com through 2 endpoints. Use search_calibers to query listings by brand, caliber number, or keyword and filter by movement type, then call get_caliber with a slug to retrieve the complete specification table — including fields like jewel count, beat rate, power reserve, and known models — alongside the narrative description and article images.
curl -X GET 'https://api.parse.bot/scraper/047259e1-4443-4594-8d60-7dafc6af2420/search_calibers?query=miyota&per_page=5&movement_type=quartz' \ -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 calibercorner-com-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: CaliberCorner SDK — search calibers, drill into full specs."""
from parse_apis.calibercorner_com_api import CaliberCorner, MovementType, CaliberNotFound
client = CaliberCorner()
# Browse automatic calibers, capped at 5 total results.
for summary in client.caliber_summaries.search(movement_type=MovementType.AUTOMATIC, limit=5):
print(summary.title, summary.movement_types)
# Drill into the first quartz caliber's full detail via .details().
hit = client.caliber_summaries.search(query="miyota", movement_type=MovementType.QUARTZ, limit=1).first()
if hit is not None:
caliber = hit.details()
print(caliber.title, caliber.description[:120])
for spec in caliber.specs:
print(f" {spec.label}: {spec.value}")
# Point lookup by slug, with typed error handling.
try:
detail = client.calibers.get(slug="eta-caliber-c07111")
except CaliberNotFound:
print("Caliber not found")
else:
print(detail.title, detail.tags)
print("exercised: caliber_summaries.search / details / calibers.get")
Searches caliber (watch movement) listings by free text (brand, caliber number, keywords) and optionally restricts results to one movement type. One request per call; results are paginated with `page` and `per_page` (max 50, default 20), ordered newest listing first. `total` and `total_pages` are the site's own counts for the query; `has_more` is true while further pages exist. A page past the last one returns an empty `calibers` list. When no movement type is given, the site's editorial guide/school/tool articles are excluded so only caliber listings are returned. Each row carries `slug`, which is the key for get_caliber, plus the site's spec excerpt, movement-type categories and tags. A query with no matches returns an empty list with total 0.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page. |
| query | string | Free-text search over caliber listings, e.g. a brand name or caliber number. Omitted = all listings, newest first. |
| per_page | integer | Rows per page, clamped to 50. |
| movement_type | string | Restrict results to one movement-type category. Omitted = all caliber categories. |
{
"type": "object",
"fields": {
"page": "page returned",
"query": "echo of the search text (empty string when omitted)",
"total": "site-reported total matching listings",
"calibers": "array of listing summaries: id (site post id), slug (key for get_caliber), title, url, published_at, modified_at (site-local ISO timestamps), excerpt (spec summary text), movement_types (category names), tags (tag names)",
"has_more": "true when a later page exists",
"per_page": "rows per page applied",
"total_pages": "site-reported page count at this per_page",
"movement_type": "echo of the movement-type filter, null when omitted"
},
"sample": {
"data": {
"page": 1,
"query": "miyota",
"total": 70,
"calibers": [
{
"id": 26643,
"url": "https://calibercorner.com/miyota-caliber-gl30/",
"slug": "miyota-caliber-gl30",
"tags": [
"GL20",
"GL30",
"Japan",
"Miyota",
"Quartz Movements"
],
"title": "Miyota Caliber GL30",
"excerpt": "Manufacturer Miyota Caliber Number GL30 Movement Type Quartz, battery-powered Lignes 6.75”’ x 8”’ Diameter 15.3mm x 18.5mm Height 2.28mm Jewel Count No jewels (0) Frequency 32,768 Hz [...]",
"modified_at": "2026-09-22T01:23:03",
"published_at": "2026-08-05T17:35:41",
"movement_types": [
"Quartz"
]
}
],
"has_more": true,
"per_page": 5,
"total_pages": 14,
"movement_type": "quartz"
},
"status": "success"
}
}About the Caliber Corner API
Searching the Caliber Database
The search_calibers endpoint accepts a free-text query parameter (brand names, caliber numbers, or general terms) and an optional movement_type filter to narrow results to a specific category of movement. Pagination is controlled by page (1-based) and per_page (max 50, default 20). Every response includes total, total_pages, and has_more so you can walk through large result sets reliably. When query is omitted, the endpoint returns all listings ordered newest first.
Retrieving Full Caliber Specifications
The get_caliber endpoint takes a slug from any search_calibers result and returns the complete listing. The specs field is an ordered array of {label, value} pairs drawn from the specification table — labels vary per listing but commonly include Manufacturer, Caliber Number, Jewel Count, Beat Rate / Frequency, Power Reserve, Functions, and Known Models. The description field provides the narrative article text with paragraphs joined by newlines, and images lists in-article image URLs. Each record also includes published_at and modified_at ISO timestamps.
Coverage and Data Shape
Listings span both mechanical and non-mechanical movement types. Because spec table labels differ from caliber to caliber, client code should treat specs as a key-value collection rather than expecting a fixed schema. Tags on each listing (returned in get_caliber as tags) can help group related calibers without relying on label presence.
The Caliber Corner API is a managed, monitored endpoint for calibercorner.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when calibercorner.com 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 calibercorner.com 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?+
- Build a watch reference tool that shows full movement specs (jewel count, power reserve, frequency) for any caliber by slug
- Aggregate all calibers from a specific manufacturer by running paginated
search_calibersqueries with the brand name as thequery - Filter listings to a specific movement type using the
movement_typeparameter to compare mechanical vs. quartz calibers - Track newly listed or recently edited calibers by sorting on
published_atormodified_atfromsearch_calibersresults - Index caliber-to-model relationships using the Known Models spec label returned in the
specsarray fromget_caliber - Populate a watch database with narrative descriptions and specification tables for a curated set of caliber slugs
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Caliber Corner offer an official developer API?+
What does `get_caliber` return and how complete are the specs?+
specs array of ordered {label, value} pairs from the spec table, a description narrative, images, tags, and timestamps. Spec table labels vary per caliber — one listing may include Jewel Count and Power Reserve while another omits them — so specs should be treated as a variable-length key-value list rather than a fixed schema.Can I filter `search_calibers` results by brand, and how does pagination work?+
query string. The response includes total, total_pages, and has_more fields. Increment the page parameter (1-based) and use per_page (up to 50) to walk through all matching results.Does the API return pricing or market value data for calibers?+
Is there an endpoint to list all available movement types for the `movement_type` filter?+
movement_type parameter in search_calibers accepts a category string, but there is no dedicated endpoint that enumerates valid movement-type values. You can fork the API on Parse and revise it to add a lookup endpoint that returns the available movement-type categories.