Getting Started
Welcome to the Tire Library API. This API provides read-only access to our tire catalog, vehicle fitment data, and rebate information.
Authentication
All API requests must include your company's API key via the x-api-key header:
x-api-key: tl_live_your_key
API keys are per-company. Generate and manage your keys from the Billing page in your Tire Library account. Only users with billing permissions can create or revoke keys.
Never expose your API key in client-side code. The x-api-key header should only be sent from your backend server. If you’re building a web or mobile app, route API requests through your own server-side proxy rather than calling the Tire Library API directly from the browser or app. This prevents your key from being visible in network requests.
Quick Start
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tires/search?width=205&aspect_ratio=65&rim_size=15"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tires/search?width=205&aspect_ratio=65&rim_size=15",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tires/search",
params={"width": "205", "aspect_ratio": "65", "rim_size": "15"},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Rate Limits
API requests are limited to 100 requests per minute per company, shared across all API keys. Exceeding this limit returns a 429 Too Many Requests response.
Read-Only Access
API keys only support GET requests. POST, PUT, PATCH, and DELETE requests will receive a 405 Method Not Allowed response.
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
403 | Your subscription does not include API access |
404 | Requested resource not found |
405 | HTTP method not allowed (API is read-only) |
429 | Rate limit exceeded — slow down and retry |
500 | Internal server error |
Base URL & Versioning
All endpoints are versioned via the URL path. The current version is v1:
https://app.tireweblibrary.com/api/v1/
Every request must include the version segment. Requests without a version (e.g. /api/tires/search) will return a 400 error with the message Unsupported API version.
Why versioned URLs? Versioning in the URL path ensures that if we introduce breaking changes in a future version (e.g. /api/v2/), your existing integration on /api/v1/ will continue to work unchanged.
Response Format
All responses are JSON with snake_case property names. All string filter values are case-insensitive — for example, make_name=Michelin and make_name=MICHELIN produce the same results. Paginated endpoints return a standard envelope:
{
"current_page": 1,
"data": [ ... ],
"from": 1,
"last_page": 5,
"per_page": 20,
"to": 20,
"total": 100
}
Pagination
Several endpoints return paginated results. Control pagination with two query parameters:
| Parameter | Type | Description |
page | int | Page number, 1-based. Defaults to 1. |
per_page | int | Results per page. Defaults vary by endpoint (see below). Maximum 100. |
Default per_page by Endpoint
| Endpoint | Default | Max |
/api/v1/tires/search | 20 | 100 |
/api/v1/tires/catalog | 30 | 100 |
/api/v1/tire-patterns/catalog | 24 | 100 |
/api/v1/rebate | 30 | 100 |
Paginated Response Fields
| Field | Type | Description |
current_page | int | The page number returned |
data | array | Results for the current page |
from | int? | 1-based index of the first result in this page |
last_page | int | Total number of pages |
per_page | int | Number of results per page |
to | int? | 1-based index of the last result in this page |
total | int | Total number of results across all pages |
Iterating Pages
Fetch page 1, check last_page, then request subsequent pages:
Tip: Use per_page=100 to minimize the number of requests when fetching large result sets. Requesting pages beyond last_page returns an empty data array.
Two Ways to Access the Catalog
| Use case | Recommended access |
| Production systems, POS/ERP integrations, scheduled jobs, or any headless/unattended server-side agent | REST API with an API key (this page) — non-interactive, no re-authentication |
| Interactive AI assistants (Claude.ai, Claude Desktop, ChatGPT) used by you or your team | MCP server — connect in a few clicks, browser sign-in with your Tire Library account |
Building an unattended agent? Don’t use the MCP server for headless integrations — its browser-based OAuth requires re-authentication after ~7 days of inactivity, which a headless process cannot complete. Use an API key against the REST API instead.
Available Endpoints
| Endpoint | Description |
| Tires | Search tires by size, browse with faceted filters, get tire details |
| Tire Makes | List all tire makes (manufacturers) |
| Tire Categories | List all tire categories for filtering |
| Tire Patterns | List tire patterns by make, browse with faceted filters, get pattern details |
| Vehicle Fitments | Look up tire fitments by year/make/model/trim |
| Rebates | Browse available rebates and rebate details |
OpenAPI Specification
The API provides a machine-readable OpenAPI 3.0 specification (also known as Swagger). You can use it to generate client SDKs, import into API tools, or explore the API interactively.
| Resource | URL | Description |
| Swagger UI | https://app.tireweblibrary.com/api/swagger | Interactive documentation with “Try it out” for every endpoint |
| OpenAPI JSON | https://app.tireweblibrary.com/api/swagger/v1/swagger.json | Machine-readable spec for code generation and tooling |
Using the OpenAPI Spec
Import into API tools: Load the JSON URL into Postman, Insomnia, or Hoppscotch to get a pre-configured collection of all endpoints.
Generate client SDKs: Use OpenAPI Generator to create type-safe clients in your language:
# Install the generator CLI
npm install @openapitools/openapi-generator-cli -g
# Generate a TypeScript client
openapi-generator-cli generate \
-i https://app.tireweblibrary.com/api/swagger/v1/swagger.json \
-g typescript-axios \
-o ./tire-library-client
// Install via npx (no global install needed)
// npx @openapitools/openapi-generator-cli generate \
// -i https://app.tireweblibrary.com/api/swagger/v1/swagger.json \
// -g javascript \
// -o ./tire-library-client
# Generate a Python client
# npx @openapitools/openapi-generator-cli generate \
# -i https://app.tireweblibrary.com/api/swagger/v1/swagger.json \
# -g python \
# -o ./tire-library-client
Authentication in Swagger UI: Click the Authorize button in Swagger UI and enter your API key to test any endpoint directly from the browser.
Tires
Three endpoints for discovering and inspecting tires: a simple dimensional search, a full faceted catalog browser, and a detail endpoint for individual tire sizes.
Case-insensitive filtering. String filter values such as make_name, category, season, terrain, and exclude_category are case-insensitive — for example, make_name=Michelin and make_name=MICHELIN produce the same results.
Search Tires
Search tire sizes by dimensional attributes. Returns paginated results with basic tire information.
Query Parameters
| Parameter | Type | Required | Default | Description |
width | string | No | — | Tire width in mm (e.g. 205) |
aspect_ratio | string | No | — | Aspect ratio (e.g. 65) |
rim_size | string | No | — | Rim diameter in inches (e.g. 15) |
load_rating | string | No | — | Load rating code (e.g. 97) |
speed_rating | string | No | — | Speed rating code (e.g. H) |
size_format | string | No | — | Size format. One of: Modern (metric, e.g. 205/65R15), Imperial, Imperial Truck (e.g. 10R22.5), OD (flotation, e.g. 31x10.50R15), Lawn and Garden |
exclude_category | string[] | No | [] | Exclude tires in these categories. Repeat for multiple: ?exclude_category=OTR/Construction, Earthmover&exclude_category=Industrial |
page | int | No | 1 | Page number (1-based) |
per_page | int | No | 20 | Results per page (max 100) |
Imperial & flotation sizes. Non-metric sizes have aspect_ratio: null. For imperial truck sizes (e.g. 10R22.5), query with aspect_ratio=0. For flotation sizes (e.g. 31x10.50R15), query by width and rim (?width=31&rim_size=15) and use size_format=OD to include only flotation tires.
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tires/search?width=205&aspect_ratio=65&rim_size=15"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tires/search?width=205&aspect_ratio=65&rim_size=15",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tires/search",
params={"width": "205", "aspect_ratio": "65", "rim_size": "15"},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Response
{
"current_page": 1,
"data": [
{
"id": 12345,
"name": "205/65R15",
"item_number": "12345",
"tire_model_id": 678,
"tire_make_id": 90,
"width": "205",
"aspect_ratio": "65",
"rim_size": "15",
"load_rating": "97",
"speed_rating": "H",
"make_name": "Michelin",
"model_name": "Defender T+H",
"season": "All Season",
"category": "Passenger",
"three_pmsf": false,
"run_flat": false,
"mud_and_snow": true,
"size_format": "Modern",
"thumbnail_image": null,
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"image_url": "https://..."
}
],
"from": 1,
"last_page": 3,
"per_page": 20,
"to": 20,
"total": 55
}
Response Fields
| Field | Type | Description |
id | long | Unique tire size identifier |
name | string | Tire size name (e.g. "205/65R15") |
item_number | string? | Item number / SKU |
tire_model_id | long | ID of the tire pattern |
tire_make_id | long | ID of the tire make |
width | string? | Tire width in mm |
aspect_ratio | string? | Aspect ratio |
rim_size | string? | Rim diameter in inches |
load_rating | string? | Load rating code |
speed_rating | string? | Speed rating code |
size_format | string? | Size format: Modern, Imperial, Imperial Truck, OD, or Lawn and Garden; null when unclassified |
make_name | string? | Make name (e.g. "Michelin") |
model_name | string? | Pattern name (e.g. "Defender T+H") |
season | string? | Season classification |
category | string? | Tire category |
warranty | string? | Warranty mileage |
ply_rating | string? | Ply rating |
load_range | string? | Load range (e.g. "SL") |
utqg | string? | UTQG rating (e.g. "820 A B") |
tread_depth | string? | Tread depth (32nds of an inch) |
weight | string? | Tire weight (lbs) |
make_image | string? | URL to make logo image |
terrain | string? | Terrain classification |
studdable | bool? | Studdable tire |
three_pmsf | bool | Three-Peak Mountain Snowflake certification |
run_flat | bool | Run-flat tire |
mud_and_snow | bool | M+S rated |
thumbnail_image | string? | Deprecated — always null. Use angle_image_url / side_image_url / image_url (per-model images) instead. |
angle_image_url | string? | URL to a 500x500 angled tread photo with cache-busting ?v=; null when unavailable (see Angle Images below) |
side_image_url | string? | URL to the side-view product photo (per tire model), with cache-busting ?v=; null when unavailable |
side2_image_url | string? | Alternate side-view photo for this tire’s model (seeded set), with cache-busting ?v=; null when unavailable |
front_image_url | string? | Front-view product photo for this tire’s model, with cache-busting ?v=; null when unavailable |
rotation_image_url | string? | Poster frame of the 360° spin set for this tire’s model (first frame), with cache-busting ?v=; null when unavailable |
image_url | string? | URL to the legacy pattern product image (fallback when the angle image is unavailable) |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tire Makes — get make IDs and names for the
tire_make_id field
- Tire Patterns — get pattern details for the
tire_model_id field
- Tire Categories — reference list of category values for the
exclude_category filter
Browse Catalog
Full-featured faceted catalog browser. Returns matching tires along with available facet values for building interactive filters. Most parameters accept multiple values — repeat the query parameter for each value.
Query Parameters
| Parameter | Type | Required | Default | Description |
search | string | No | — | Free-text search |
make_name | string[] | No | [] | Filter by make. Repeat for multiple: ?make_name=Michelin&make_name=Bridgestone |
width | string[] | No | [] | Filter by width |
aspect_ratio | string[] | No | [] | Filter by aspect ratio |
rim_size | string[] | No | [] | Filter by rim size |
speed_rating | string[] | No | [] | Filter by speed rating |
load_rating | string[] | No | [] | Filter by load rating |
ply_rating | string[] | No | [] | Filter by ply rating |
load_range | string[] | No | [] | Filter by load range |
utqg | string[] | No | [] | Filter by UTQG |
warranty | string[] | No | [] | Filter by warranty |
item_number | string[] | No | [] | Filter by item number |
size_format | string[] | No | [] | Filter by size format. Values: Modern, Imperial, Imperial Truck, OD (flotation), Lawn and Garden |
season | string[] | No | [] | Filter by season |
terrain | string[] | No | [] | Filter by terrain |
category | string[] | No | [] | Filter by category |
exclude_category | string[] | No | [] | Exclude tires in these categories. Repeat for multiple: ?exclude_category=OTR/Construction, Earthmover&exclude_category=Industrial |
three_pmsf | bool | No | — | Three-Peak Mountain Snowflake |
run_flat | bool | No | — | Run-flat tires only |
mud_and_snow | bool | No | — | M+S rated only |
studdable | bool | No | — | Studdable only |
sort | string | No | — | Sort key (e.g. name_asc) |
page | int | No | 1 | Page number |
per_page | int | No | 30 | Results per page (max 100) |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tires/catalog?make_name=Michelin&per_page=30"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tires/catalog?make_name=Michelin&per_page=30",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tires/catalog",
params={"make_name": "Michelin", "per_page": 30},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Response
{
"results": {
"current_page": 1,
"data": [
{
"id": 12345,
"name": "205/65R15",
"item_number": "12345",
"tire_model_id": 678,
"tire_make_id": 90,
"width": "205",
"aspect_ratio": "65",
"rim_size": "15",
"load_rating": "97",
"speed_rating": "H",
"make_name": "Michelin",
"model_name": "Defender T+H",
"season": "All Season",
"category": "Passenger",
"warranty": "90000",
"ply_rating": "4",
"load_range": "SL",
"utqg": "820 A B",
"tread_depth": "9.5",
"weight": "22",
"make_image": "https://...",
"terrain": "Highway",
"studdable": false,
"three_pmsf": false,
"run_flat": false,
"mud_and_snow": true,
"size_format": "Modern",
"thumbnail_image": null,
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"front_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"rotation_image_url": "https://...",
"image_url": "https://..."
}
],
"from": 1,
"last_page": 5,
"per_page": 30,
"to": 30,
"total": 150
},
"facets": {
"make_name": ["Michelin", "Bridgestone", "Goodyear", "..."],
"width": ["155", "165", "175", "185", "195", "205", "..."],
"aspect_ratio": ["40", "45", "50", "55", "60", "65", "..."],
"rim_size": ["14", "15", "16", "17", "18", "..."],
"speed_rating": ["H", "V", "W", "Y", "..."],
"load_rating": ["93", "97", "101", "..."],
"ply_rating": ["4", "6", "8", "..."],
"load_range": ["SL", "XL", "E", "..."],
"utqg": ["820 A B", "740 A A", "..."],
"warranty": ["90000", "80000", "60000", "..."],
"season": ["All Season", "Winter", "Summer", "..."],
"terrain": ["Highway", "All-Terrain", "Mud-Terrain", "..."],
"category": ["Passenger", "Light Truck", "..."],
"size_format": ["Imperial", "Imperial Truck", "Lawn and Garden", "Modern", "OD"]
}
}
Response Fields
| Field | Type | Description |
results | object | Paginated tire results (same fields as Search Tires) |
facets | object | Available filter values for building interactive UIs |
facets.make_name | string[] | Distinct make names in the result set |
facets.width | string[] | Distinct widths |
facets.aspect_ratio | string[] | Distinct aspect ratios |
facets.rim_size | string[] | Distinct rim sizes |
facets.speed_rating | string[] | Distinct speed ratings |
facets.load_rating | string[] | Distinct load ratings |
facets.ply_rating | string[] | Distinct ply ratings |
facets.load_range | string[] | Distinct load ranges |
facets.utqg | string[] | Distinct UTQG ratings |
facets.warranty | string[] | Distinct warranty values |
facets.season | string[] | Distinct seasons |
facets.terrain | string[] | Distinct terrain values |
facets.category | string[] | Distinct categories |
facets.size_format | string[] | Distinct size formats |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tire Makes — get make names for the
make_name filter
- Tire Categories — reference list of category values for the
category and exclude_category filters
Get Tire by ID
Get the full specification sheet for a single tire size, including dimensions, performance ratings, images, rebates, and vehicle fitments.
Path Parameters
| Parameter | Type | Description |
id | long | Tire size ID (obtained from search or catalog endpoints) |
Query Parameters
| Parameter | Type | Required | Default | Description |
rebate_status | string | No | — (returns all) | Filter rebates by status: Active, Upcoming, or Expired. Without this parameter, all rebates are returned. |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tires/12345"
# Only include active rebates
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tires/12345?rebate_status=Active"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tires/12345",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const tire = await response.json();
// Only include active rebates
const response2 = await fetch(
"https://app.tireweblibrary.com/api/v1/tires/12345?rebate_status=Active",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const tire2 = await response2.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tires/12345",
headers={"x-api-key": "tl_live_your_key"},
)
tire = response.json()
# Only include active rebates
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tires/12345",
params={"rebate_status": "Active"},
headers={"x-api-key": "tl_live_your_key"},
)
tire = response.json()
Response
{
"id": 12345,
"name": "205/65R15",
"item_number": "12345",
"upc": "086699212345",
"ean": "00866992123455",
"asin": "B0CX12AB34",
"gm_code": "356096357",
"width": "205",
"aspect_ratio": "65",
"rim_size": "15",
"load_rating": "97",
"speed_rating": "H",
"price": "129.99",
"load_capacity_dual": "1709",
"load_capacity_single": "1609",
"max_inflation_pressure": "44",
"revolutions_per_mile": "775",
"rolling_circumference": "81.8",
"diameter_overall": "25.5",
"sidewall": "5.3",
"section_width": "8.5",
"weight": "22",
"warranty": "90000",
"utqg": "820 A B",
"ply_rating": "4",
"load_range": "SL",
"tread_depth": "9.5",
"category": "Passenger",
"season": "All Season",
"terrain": "Highway",
"studdable": false,
"three_pmsf": false,
"run_flat": false,
"mud_and_snow": true,
"thumbnail_image": null,
"tire_make": {
"id": 90,
"name": "Michelin",
"image_url": "https://...",
"dot_reg_url": "https://..."
},
"tire_model": {
"id": 678,
"name": "Defender T+H",
"image_url": "https://...",
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"rotation_frame_count": 36,
"image_360_url": "https://...",
"image_360_thumbnail_url": "https://...",
"video_url": "https://...",
"manufacturer_url": "https://...",
"features": "Extended tread life...",
"benefits": "All-season confidence...",
"description": "...",
"three_pmsf": false
},
"rebates": [
{
"id": 10,
"name": "Spring Rebate",
"description": "Save on select Michelin tires",
"start_date": "2025-03-01",
"end_date": "2025-05-31",
"global": false,
"status": "Active"
}
],
"fitments_grouped": {
"Chevrolet": {
"Equinox": [
{ "trim": "L", "years": "2018-2021", "year_list": [2018, 2019, 2020, 2021] },
{ "trim": "LS", "years": "2018-2024", "year_list": [2018, 2019, 2020, 2021, 2022, 2023, 2024] },
{ "trim": "LT", "years": "2018-2024", "year_list": [2018, 2019, 2020, 2021, 2022, 2023, 2024] }
]
},
"Ford": {
"Escape": [
{ "trim": "SE", "years": "2020-2022", "year_list": [2020, 2021, 2022] }
]
}
}
}
Response Fields
| Field | Type | Description |
id | long | Unique tire size identifier |
name | string | Tire size name (e.g. "205/65R15") |
item_number | string? | Item number / SKU |
upc | string? | Universal Product Code (UPC, 12 digits); null when not provided by the manufacturer |
ean | string? | International Article Number (EAN-13); null when unavailable |
asin | string? | Amazon Standard Identification Number; null when unavailable |
gm_code | string? | GM code; null when unavailable |
width | string? | Tire width in mm |
aspect_ratio | string? | Aspect ratio |
rim_size | string? | Rim diameter in inches |
load_rating | string? | Load rating code |
speed_rating | string? | Speed rating code |
price | string? | List price |
load_capacity_dual | string? | Load capacity for dual fitment (lbs) |
load_capacity_single | string? | Load capacity for single fitment (lbs) |
max_inflation_pressure | string? | Maximum inflation pressure (PSI) |
revolutions_per_mile | string? | Revolutions per mile |
rolling_circumference | string? | Rolling circumference (inches) |
diameter_overall | string? | Overall diameter (inches) |
sidewall | string? | Sidewall height (inches) |
section_width | string? | Section width (inches) |
weight | string? | Tire weight (lbs) |
warranty | string? | Warranty mileage |
utqg | string? | UTQG rating (e.g. "820 A B") |
ply_rating | string? | Ply rating |
load_range | string? | Load range (e.g. "SL") |
tread_depth | string? | Tread depth (32nds of an inch) |
category | string? | Tire category |
season | string? | Season classification |
terrain | string? | Terrain classification |
studdable | bool? | Studdable tire |
three_pmsf | bool | Three-Peak Mountain Snowflake certification |
run_flat | bool | Run-flat tire |
mud_and_snow | bool | M+S rated |
thumbnail_image | string? | Deprecated — always null. Use angle_image_url / side_image_url / image_url (per-model images) instead. |
tire_make | object? | Nested make object with id, name, image_url, dot_reg_url |
tire_model | object? | Nested pattern object with id, name and images: image_url (legacy pattern JPG) plus per-model angle_image_url (500x500 angled tread photo), side_image_url, side2_image_url, front_image_url (all null when unavailable, cache-busting ?v=), rotation_image_url/rotation_frame_count (360° spin poster + frame count, when the pattern has a spin set); then image_360_url, image_360_thumbnail_url, video_url, manufacturer_url, features, benefits, description, three_pmsf |
rebates | array | Applicable rebates with id, name, description, start_date, end_date, global, status |
fitments_grouped | object? | Vehicle fitments for this size, grouped by make, then model. Outer keys are make names, inner keys are model names, and each model maps to an array of objects with trim (string, the trim level), years (string: individual years and collapsed ranges for display, e.g. "2019, 2021-2023"), and year_list (int array: every applicable model year, e.g. [2019, 2021, 2022, 2023] — use this for programmatic year matching instead of parsing years). null when no fitment data exists for this size. |
Tire-level images deprecated. Legacy per-size image fields (thumbnail_image, angle_image, front_image, side_image, side2_image, image_0100, image_0200, image_0301) always return null. Use the per-model images instead: tire_model.image_url / tire_model.angle_image_url (search and catalog also expose image_url, angle_image_url, side_image_url, side2_image_url, front_image_url and rotation_image_url).
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
404 | Tire with the given ID does not exist |
Related Endpoints
Compare & Export not available. The /api/v1/tires/compare and /api/v1/tires/compare-export endpoints require a logged-in web session and are not available via API keys.
Tire Makes
List all tire makes (manufacturers) in the catalog. Returns the make ID, name, logo image, and DOT registration URL for each make.
Case-insensitive filtering. Make names are stored in uppercase and are case-insensitive as filter values — for example, make_name=Michelin and make_name=MICHELIN produce the same results.
List Tire Makes
Returns all tire makes sorted alphabetically by name. No pagination — the dataset is small enough to return in a single request.
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-makes"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-makes",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const makes = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-makes",
headers={"x-api-key": "tl_live_your_key"},
)
makes = response.json()
Response
[
{
"id": 90,
"name": "Michelin",
"image_url": "https://...",
"dot_reg_url": "https://..."
},
{
"id": 42,
"name": "Bridgestone",
"image_url": "https://...",
"dot_reg_url": null
}
]
Response Fields
| Field | Type | Description |
id | long | Unique tire make identifier |
name | string | Make name (e.g. "Michelin") |
image_url | string? | URL to the make's logo/brand image |
dot_reg_url | string? | URL to DOT registration information |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tire Patterns — use
id as the make_id parameter to list patterns for a make, or use search to match patterns by name across all makes
- Tires — use
name as the make_name filter in catalog endpoints
- Rebates — filter rebates by
make_name on the list endpoint
Common Make Names
The catalog contains 650+ makes. The most commonly used makes are:
| Common Make Names |
| MICHELIN |
| BRIDGESTONE |
| GOODYEAR |
| CONTINENTAL |
| PIRELLI |
| HANKOOK |
| KUMHO |
| NITTO |
| COOPER |
| FIRESTONE |
Full list: Use GET /api/v1/tire-makes to retrieve all 650+ makes with their IDs, logos, and DOT registration URLs.
Tire Categories
List all tire categories in the catalog. Categories classify tires by application (e.g. “Passenger Car”, “Commercial Truck/Bus”, “Agricultural”). Use these values with the category and exclude_category filters on search and catalog endpoints.
Case-insensitive filtering. Category values are case-insensitive as filter values — for example, category=Passenger Car and category=passenger car produce the same results.
List Tire Categories
Returns all tire categories sorted by tire count (most common first). No pagination — the dataset is small enough to return in a single request.
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-categories"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-categories",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const categories = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-categories",
headers={"x-api-key": "tl_live_your_key"},
)
categories = response.json()
Response
Returns a flat JSON array of category strings, ordered by tire count descending.
[
"Commercial Truck/Bus",
"Passenger Car",
"Passenger Light Truck/SUV, Light Truck",
"Agricultural, Lawn & Garden/Golf",
"Trailer, Special Trailer (ST)",
"Passenger Car, CAR, Performance, UHP",
"OTR/Construction, Earthmover",
"..."
]
Response Fields
| Field | Type | Description |
(element) | string | Category string for use as category or exclude_category filter values |
Note: Categories are exact-match strings. exclude_category=Passenger Car excludes only tires with the exact category “Passenger Car” — it does not exclude “Passenger Car, Performance, Touring”. To exclude multiple categories, repeat the parameter for each value.
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tires — use category values with
category and exclude_category filters
- Tire Patterns — use category values with
category and exclude_category filters
Category Reference
The complete list of 70 tire categories, grouped by application.
Passenger Car
| Category |
Passenger Car |
Passenger Car, CAR |
Passenger Car, CAR, Classic/Vintage |
Passenger Car, CAR, Classic/Vintage, Performance, Touring |
Passenger Car, CAR, Competition/Racing |
Passenger Car, CAR, Competition/Racing, Performance |
Passenger Car, CAR, Competition/Racing, Performance, UHP |
Passenger Car, CAR, Performance |
Passenger Car, CAR, Performance, HP |
Passenger Car, CAR, Performance, HP, Touring |
Passenger Car, CAR, Performance, Touring |
Passenger Car, CAR, Performance, UHP |
Passenger Car, CAR, Performance, UHP, HP |
Passenger Car, CAR, SUV/CUV |
Passenger Car, CAR, SUV/CUV, Performance |
Passenger Car, CAR, SUV/CUV, Performance, HP |
Passenger Car, CAR, SUV/CUV, Performance, Touring |
Passenger Car, CAR, SUV/CUV, Performance, UHP |
Passenger Car, Performance |
Passenger Car, Performance, HP |
Passenger Car, Performance, Touring |
Passenger Car, Performance, UHP |
Passenger Car, SUV/CUV |
Passenger Car, SUV/CUV, Performance |
Passenger Car, SUV/CUV, Performance, HP |
Passenger Car, SUV/CUV, Performance, HP, Touring |
Passenger Car, SUV/CUV, Performance, Touring |
Passenger Car, SUV/CUV, Performance, UHP |
Passenger Light Truck/SUV
| Category |
Passenger Light Truck/SUV |
Passenger Light Truck/SUV, Light Truck |
Passenger Light Truck/SUV, Light Truck, SUV |
Passenger Light Truck/SUV, SUV |
Commercial
| Category |
Commercial Light Truck/Van |
Commercial Light Truck/Van, Commercial Light Truck |
Commercial Light Truck/Van, Commercial Van |
Commercial Truck/Bus |
Commercial Truck/Bus, Bus/Coach |
Commercial Truck/Bus, Bus/Coach, Service/Application, Regional Service, Long Haul |
Commercial Truck/Bus, Medium-Duty Truck |
Commercial Truck/Bus, Medium-Duty Truck, Service/Application |
Commercial Truck/Bus, Service/Application |
Commercial Truck/Bus, Service/Application, Long Haul |
Commercial Truck/Bus, Service/Application, Mixed-S |
Commercial Truck/Bus, Service/Application, Regional Service |
Commercial Truck/Bus, Service/Application, Regional Service, Long Haul |
Commercial Truck/Bus, Service/Application, Regional Service, Mixed-S |
Commercial Truck/Bus, Service/Application, Urban/P |
Agricultural
| Category |
Agricultural |
Agricultural, Forestry/Logging |
Agricultural, Front Tractor |
Agricultural, High Flotation |
Agricultural, Implement |
Agricultural, Lawn & Garden/Golf |
Agricultural, Rear Tractor |
Agricultural, Tractor |
OTR/Construction
| Category |
OTR/Construction |
OTR/Construction, Compactor |
OTR/Construction, Earthmover |
OTR/Construction, Loader/Dozer/Grader |
Industrial
Sport ATV/UTV
| Category |
Sport ATV/UTV |
Sport ATV/UTV, Sport ATV |
Sport ATV/UTV, Sport UTV/SXS |
Sport ATV/UTV, Sport UTV/SXS, Sport ATV |
Trailer
| Category |
Trailer |
Trailer, Special Trailer (ST) |
Motorcycle
Temporary Spare
| Category |
Temporary Spare |
Temporary Spare, Temporary/Compact Spare |
Undefined
Tire Patterns
Three endpoints for discovering tire patterns: list patterns by make or by name search, browse with faceted filters, or get full details for a single pattern.
Case-insensitive filtering. String filter values such as make_name and search are case-insensitive — for example, make_name=Michelin and make_name=MICHELIN produce the same results.
List Tire Patterns
Returns tire patterns, optionally filtered by make and/or pattern name, sorted alphabetically by name. No pagination — the dataset is small enough to return in a single request. The make_id parameter is optional; when omitted, search is required and matches pattern names across all makes.
Query Parameters
| Parameter | Type | Required | Default | Description |
make_id | long | No | — | Tire make ID from /api/v1/tire-makes. When omitted, search is required. |
search | string | Conditional | — | Free-text search to filter pattern names. Required when make_id is omitted. |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns?make_id=90"
# Filter patterns by name
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns?make_id=90&search=alpin"
# Search patterns by name across all makes (make_id optional)
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns?search=ventus"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns?make_id=90",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const patterns = await response.json();
// Filter patterns by name
const filtered = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns?make_id=90&search=alpin",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const matches = await filtered.json();
// Search patterns by name across all makes (make_id optional)
const byName = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns?search=ventus",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const nameMatches = await byName.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns",
params={"make_id": 90},
headers={"x-api-key": "tl_live_your_key"},
)
patterns = response.json()
# Filter patterns by name
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns",
params={"make_id": 90, "search": "alpin"},
headers={"x-api-key": "tl_live_your_key"},
)
matches = response.json()
# Search patterns by name across all makes (make_id optional)
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns",
params={"search": "ventus"},
headers={"x-api-key": "tl_live_your_key"},
)
name_matches = response.json()
Response
[
{
"id": 42,
"name": "Alpin 6",
"description": "Winter tire for passenger cars",
"image_url": "https://...",
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"rotation_frame_count": 36,
"size_count": 34
},
{
"id": 43,
"name": "CrossClimate 2",
"description": "All-season tire with winter certification",
"image_url": "https://...",
"angle_image_url": null,
"side_image_url": null,
"side2_image_url": null,
"front_image_url": null,
"rotation_image_url": null,
"rotation_frame_count": null,
"size_count": 89
}
]
Response Fields
| Field | Type | Description |
id | long | Unique tire pattern identifier |
name | string | Pattern name (e.g. "CrossClimate 2") |
description | string? | Pattern description, if available |
image_url | string? | Pattern image URL; null when the pattern has no image. (The legacy per-size thumbnail fallback was retired along with the deprecated tire-level image fields.) |
angle_image_url | string? | 500x500 pixel angled tread photo; null when unavailable |
side_image_url | string? | Side-view product photo (per tire model); null when unavailable |
side2_image_url | string? | Alternate side-view photo (per tire model, seeded set); null when unavailable |
front_image_url | string? | Front-view product photo (per tire model); null when unavailable |
rotation_image_url | string? | Poster frame of the self-hosted 360° spin set (first frame); null when the pattern has no spin set |
rotation_frame_count | int? | Number of frames in the spin set; frames are served at {base}/{n}.png for n in 1..count |
size_count | int | Number of tire sizes available for this pattern |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
400 | Neither make_id nor search provided, or make_id is not a positive integer |
404 | Tire make with the given make_id does not exist |
Related Endpoints
- List tire makes — get
make_id values, or use search to match patterns across all makes
- Tire Categories — reference list of category values
- Tire catalog — filter tires by make name via
GET /api/v1/tires/catalog?make_name=Michelin
Browse Catalog
Browse tire patterns with optional filtering by make name and free-text search. Returns paginated results with facets for building interactive filters.
Query Parameters
| Parameter | Type | Required | Default | Description |
search | string | No | — | Free-text search |
make_name | string[] | No | [] | Filter by make. Repeat for multiple values. |
category | string[] | No | [] | Filter by category. Repeat for multiple values: ?category=Passenger Car&category=Light Truck |
exclude_category | string[] | No | [] | Exclude patterns in these categories. Repeat for multiple: ?exclude_category=Industrial&exclude_category=Commercial Truck/Bus |
page | int | No | 1 | Page number |
per_page | int | No | 24 | Results per page (max 100) |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns/catalog?make_name=Michelin"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns/catalog?make_name=Michelin",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns/catalog",
params={"make_name": "Michelin"},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Response
{
"results": {
"current_page": 1,
"data": [
{
"id": 678,
"name": "Defender T+H",
"description": "All-season tire...",
"image_url": "https://...",
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"rotation_frame_count": 36,
"make_name": "Michelin",
"make_image": "https://...",
"size_count": 42
}
],
"from": 1,
"last_page": 4,
"per_page": 24,
"to": 24,
"total": 85
},
"facets": {
"make_name": ["Michelin", "Bridgestone", "Goodyear", "..."],
"category": ["Passenger Car", "Light Truck", "Commercial Truck/Bus", "..."]
}
}
Response Fields
| Field | Type | Description |
id | long | Unique pattern identifier |
name | string | Pattern name |
description | string? | Pattern description |
image_url | string? | Pattern image URL |
angle_image_url | string? | 500x500 pixel angled tread photo; null when unavailable |
side_image_url | string? | Side-view product photo (per tire model); null when unavailable |
side2_image_url | string? | Alternate side-view photo (per tire model, seeded set); null when unavailable |
front_image_url | string? | Front-view product photo (per tire model); null when unavailable |
rotation_image_url | string? | Poster frame of the self-hosted 360° spin set (first frame); null when the pattern has no spin set |
rotation_frame_count | int? | Number of frames in the spin set; frames are served at {base}/{n}.png for n in 1..count |
make_name | string? | Make name (e.g. "Michelin") |
make_image | string? | Make logo image URL |
size_count | int | Number of tire sizes available |
facets.make_name | string[] | Distinct make names in the result set |
facets.category | string[] | Distinct categories in the result set |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tire Makes — get make names for the
make_name filter
- Tire Categories — reference list of category values for the
category and exclude_category filters
- Tires — search for specific tire sizes by dimensional attributes
Get Tire Pattern by ID
Get full detail for a single tire pattern, including all its available sizes and applicable rebates.
Path Parameters
| Parameter | Type | Description |
id | long | Tire pattern ID |
Query Parameters
| Parameter | Type | Required | Default | Description |
rebate_status | string | No | — (returns all) | Filter rebates by status: Active, Upcoming, or Expired. Without this parameter, all rebates are returned. |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns/678"
# Only include active rebates
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/tire-patterns/678?rebate_status=Active"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns/678",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const pattern = await response.json();
// Only include active rebates
const response2 = await fetch(
"https://app.tireweblibrary.com/api/v1/tire-patterns/678?rebate_status=Active",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const pattern2 = await response2.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns/678",
headers={"x-api-key": "tl_live_your_key"},
)
pattern = response.json()
# Only include active rebates
response = requests.get(
"https://app.tireweblibrary.com/api/v1/tire-patterns/678",
params={"rebate_status": "Active"},
headers={"x-api-key": "tl_live_your_key"},
)
pattern = response.json()
Response
{
"id": 678,
"name": "Defender T+H",
"image_url": "https://...",
"angle_image_url": "https://...",
"side_image_url": "https://...",
"side2_image_url": "https://...",
"front_image_url": "https://...",
"rotation_image_url": "https://...",
"rotation_frame_count": 36,
"image_360_url": "https://...",
"image_360_thumbnail_url": "https://...",
"video_url": "https://...",
"manufacturer_url": "https://...",
"benefits": "All-season confidence...",
"description": "The Michelin Defender...",
"features": "IntelliSipe Technology...",
"three_pmsf": false,
"tire_make": {
"id": 90,
"name": "Michelin",
"image_url": "https://...",
"dot_reg_url": "https://..."
},
"tire_sizes": [
{
"id": 12345,
"name": "205/65R15",
"item_number": "12345",
"three_pmsf": false,
"season": "All Season",
"terrain": "Highway",
"studdable": false,
"category": "Passenger",
"run_flat": false,
"mud_and_snow": true
}
],
"rebates": [
{
"id": 10,
"name": "Spring Rebate",
"description": "Save on select Michelin tires",
"start_date": "2025-03-01",
"end_date": "2025-05-31",
"global": false,
"status": "Active"
}
]
}
Response Fields
| Field | Type | Description |
id | long | Unique pattern identifier |
name | string | Pattern name |
image_url | string? | Pattern image URL |
angle_image_url | string? | 500x500 pixel angled tread photo; null when unavailable |
side_image_url | string? | Side-view product photo (per tire model); null when unavailable |
side2_image_url | string? | Alternate side-view photo (per tire model, seeded set); null when unavailable |
front_image_url | string? | Front-view product photo (per tire model); null when unavailable |
rotation_image_url | string? | Poster frame of the self-hosted 360° spin set (first frame); null when the pattern has no spin set |
rotation_frame_count | int? | Number of frames in the spin set; frames are served at {base}/{n}.png for n in 1..count |
image_360_url | string? | 360-degree image URL |
image_360_thumbnail_url | string? | 360-degree image thumbnail URL |
video_url | string? | Promotional video URL |
manufacturer_url | string? | Manufacturer product page URL |
benefits | string? | Pattern benefits |
description | string? | Pattern description |
features | string? | Pattern features |
three_pmsf | bool | Three-Peak Mountain Snowflake certification |
tire_make | object? | Nested make object with id, name, image_url, dot_reg_url |
tire_sizes | array | Available tire sizes with id, name, item_number, three_pmsf, season, terrain, studdable, category, run_flat, mud_and_snow |
rebates | array | Applicable rebates with id, name, description, start_date, end_date, global, status |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
404 | Tire pattern with the given ID does not exist |
Angle Images
angle_image_url is a 500x500 pixel PNG photo of the tread at an angle, served with
long-lived caching. The ?v= query string changes when the image set is updated, so
always use the URL exactly as returned. Coverage is partial (~10,900 of ~20,000 patterns, about
55%); the field is null when no angle image exists for a pattern.
Related Endpoints
- Tires — get full specifications for a tire size within this pattern
- Vehicle Fitments — look up vehicles that fit the tire sizes in this pattern
- Rebates — get full rebate details for rebates returned in the response
Vehicle Fitments
Look up tire fitments for a specific vehicle. Supports a cascading selector pattern — pass parameters incrementally to drill down from year to make to model to trim.
Case-insensitive filtering. String filter values such as make, model, and trim are case-insensitive — for example, make=Toyota and make=TOYOTA produce the same results.
Cascading drill-down. The response endpoint field tells you which level you reached: year, make, model, trim, or fitment. Omit any parameter to discover valid values for the next one.
Drivetrain in trim names. There is no separate drivetrain field. Where the vehicle has multiple drivetrain options, the trim name includes it, e.g. LE (AWD) vs LE (FWD) on the 2024 Toyota RAV4, and these appear as separate trim values.
Vehicle Lookup
Pass year to get available makes. Add make to get models. Add model to get trims. Add trim to get tire fitment results. Omit all parameters to get available years.
Query Parameters
| Parameter | Type | Required | Default | Description |
year | string | No | — | Vehicle year (e.g. 2024). Omit to get available years. |
make | string | No | — | Vehicle make (e.g. Toyota). Requires year. |
model | string | No | — | Vehicle model (e.g. Camry). Requires year + make. |
trim | string | No | — | Vehicle trim (e.g. SE). Requires year + make + model. |
Code Examples
Step 1 — Get available years:
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/vehicle/lookup"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const years = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup",
headers={"x-api-key": "tl_live_your_key"},
)
years = response.json()
Step 2 — Get makes for a year:
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/vehicle/lookup?year=2024"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup?year=2024",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup",
params={"year": "2024"},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Step 3 — Get fitments (full drill-down):
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/vehicle/lookup?year=2024&make=Toyota&model=Camry&trim=SE"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup?year=2024&make=Toyota&model=Camry&trim=SE",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const fitments = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/vehicle/lookup",
params={"year": "2024", "make": "Toyota", "model": "Camry", "trim": "SE"},
headers={"x-api-key": "tl_live_your_key"},
)
fitments = response.json()
Response
{
"endpoint": "year",
"options": ["2024", "2023", "2022", "2021", "2020", "..."],
"fitments": null
}
{
"endpoint": "make",
"options": ["Acura", "Audi", "BMW", "Buick", "Toyota", "..."],
"fitments": null
}
{
"endpoint": "fitment",
"options": null,
"fitments": [
{
"name": "225/65R17 102H",
"position": "B",
"width": "225",
"aspect_ratio": "65",
"rim_size": "17",
"load_rating": "102",
"speed_rating": "H"
}
]
}
For staggered vehicles (different front and rear sizes) each axle is a separate row, with position "F" (front) and "R" (rear):
{
"endpoint": "fitment",
"options": null,
"fitments": [
{
"name": "225/45R18 95Y",
"position": "F",
"width": "225",
"aspect_ratio": "45",
"rim_size": "18",
"load_rating": "95",
"speed_rating": "Y"
},
{
"name": "255/40R18 99Y",
"position": "R",
"width": "255",
"aspect_ratio": "40",
"rim_size": "18",
"load_rating": "99",
"speed_rating": "Y"
}
]
}
Response Fields
| Field | Type | Description |
endpoint | string | Current drill-down level: year, make, model, trim, or fitment |
options | string[]? | Available choices for the next drill-down parameter |
fitments | array? | Tire fitment results (only present when endpoint is fitment) |
fitments[].name | string | Tire size designation including load/speed rating (e.g. "225/65R17 102H") |
fitments[].position | string? | Axle position code: B = both axles (square fitment — same size front and rear), F = front axle, R = rear axle. Staggered vehicles return separate F and R rows. There is no factory-standard-versus-optional flag. |
fitments[].width | string? | Tire width in mm |
fitments[].aspect_ratio | string? | Aspect ratio |
fitments[].rim_size | string? | Rim diameter in inches |
fitments[].load_rating | string? | Load rating code |
fitments[].speed_rating | string? | Speed rating code |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tires — search for specific tire sizes by dimensional attributes from the fitment results
- Tire Patterns — browse tire patterns for the makes and models found
Rebates
Browse available tire rebates and get detailed rebate information including line items and associated tire patterns.
Case-insensitive filtering. String filter values such as make_name and status are case-insensitive — for example, status=active and status=Active produce the same results.
List Rebates
List rebates with optional filters for date range, status, and make. Returns paginated results.
Query Parameters
| Parameter | Type | Required | Default | Description |
start_date | date | No | — | Filter by start date (e.g. 2025-03-01) |
end_date | date | No | — | Filter by end date (e.g. 2025-05-31) |
global | string | No | — | true/1 for global rebates only, false/0 for non-global |
status | string | No | — | One of: Active, Upcoming, Expired |
sort_by_key | string | No | — | Sort field: start_date, end_date, name |
sort_by_order | string | No | — | Sort direction: asc or desc |
page | int | No | 1 | Page number |
per_page | int | No | 30 | Results per page (max 100) |
make_name | string | No | — | Filter by tire make name |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/rebate?status=Active"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/rebate?status=Active",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const data = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/rebate",
params={"status": "Active"},
headers={"x-api-key": "tl_live_your_key"},
)
data = response.json()
Response
{
"current_page": 1,
"data": [
{
"id": 10,
"name": "Spring Rebate",
"start_date": "2025-03-01",
"end_date": "2025-05-31",
"global": true,
"status": "Active"
}
],
"from": 1,
"last_page": 1,
"per_page": 30,
"to": 12,
"total": 12
}
Response Fields
| Field | Type | Description |
id | long | Unique rebate identifier |
name | string | Rebate name |
start_date | string | Rebate start date (ISO 8601) |
end_date | string | Rebate end date (ISO 8601) |
global | bool | Whether the rebate applies to all makes |
status | string | Rebate status: Active, Upcoming, or Expired |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
Related Endpoints
- Tire Makes — get make names for the
make_name filter
- Tire Patterns — browse patterns associated with rebate line items
Get Rebate by ID
Get full detail for a single rebate including line items (amounts, quantities, spend requirements) and associated tire patterns.
Path Parameters
| Parameter | Type | Description |
id | long | Rebate ID |
Code Examples
curl -H "x-api-key: tl_live_your_key" \
"https://app.tireweblibrary.com/api/v1/rebate/10"
const response = await fetch(
"https://app.tireweblibrary.com/api/v1/rebate/10",
{ headers: { "x-api-key": "tl_live_your_key" } }
);
const rebate = await response.json();
import requests
response = requests.get(
"https://app.tireweblibrary.com/api/v1/rebate/10",
headers={"x-api-key": "tl_live_your_key"},
)
rebate = response.json()
Response
{
"id": 10,
"name": "Spring Rebate",
"description": "Save on select tires this spring.",
"image_url": "https://...",
"image_horizontal_url": "https://...",
"image_preview_url": "https://...",
"form_url": "https://...",
"start_date": "2025-03-01",
"end_date": "2025-05-31",
"global": true,
"status": "Active",
"rebate_items": [
{
"id": 25,
"amount": 70.00,
"amount_reason": "Prepaid Card",
"amount_two": 100.00,
"amount_two_reason": "Prepaid Card (select sizes)",
"quantity_required": 4,
"quantity_limit": null,
"spend_min": null,
"spend_max": null,
"tire_patterns": [
{
"id": 678,
"name": "Defender T+H",
"description": "All-season tire...",
"image_url": "https://..."
}
]
}
]
}
Response Fields
| Field | Type | Description |
id | long | Unique rebate identifier |
name | string | Rebate name |
description | string? | Rebate description |
image_url | string? | Rebate image URL (vertical) |
image_horizontal_url | string? | Rebate image URL (horizontal) |
image_preview_url | string? | Rebate preview image URL |
form_url | string? | URL to the rebate claim form |
start_date | string | Rebate start date (ISO 8601) |
end_date | string | Rebate end date (ISO 8601) |
global | bool | Whether the rebate applies to all makes |
status | string | Rebate status: Active, Upcoming, or Expired |
rebate_items | array | Line items with amounts, quantities, and qualifying tire patterns |
rebate_items[].id | long | Rebate item identifier |
rebate_items[].amount | decimal? | Primary rebate amount |
rebate_items[].amount_reason | string? | Description of how the primary amount is paid |
rebate_items[].amount_two | decimal? | Secondary rebate amount (e.g. for select sizes) |
rebate_items[].amount_two_reason | string? | Description of how the secondary amount is paid |
rebate_items[].quantity_required | int? | Number of tires required to qualify |
rebate_items[].quantity_limit | int? | Maximum number of submissions allowed |
rebate_items[].spend_min | decimal? | Minimum spend to qualify |
rebate_items[].spend_max | decimal? | Maximum spend to qualify |
rebate_items[].tire_patterns | array | Qualifying tire patterns with id, name, description, image_url |
Error Responses
| Status | Condition |
401 | Missing or invalid API key |
404 | Rebate with the given ID does not exist |
Related Endpoints
- Tire Patterns — get full pattern details for the tire patterns in
rebate_items[].tire_patterns
- Tires — search for tire sizes that qualify for a rebate
- Tire Makes — filter rebates by
make_name on the list endpoint
MCP Server (AI Assistants)
Connect AI assistants like Claude directly to the Tire Library catalog using the Model Context Protocol (MCP) — an open standard that lets AI tools query data through natural conversation. Instead of writing code against the REST API, you ask questions: “Find 205/55R16 winter tires from Michelin” or “What rebates are active right now?” — and the assistant calls the catalog for you.
MCP or REST API — which should I use?
| Use case | Recommended access |
| Interactive AI assistants (Claude.ai, Claude Desktop, ChatGPT) used by you or your team | MCP server — browser-based OAuth sign-in, no code to write |
| Production systems, POS/ERP integrations, scheduled jobs, or any headless/unattended agent running on a server | REST API with an API key (tl_live_...) — non-interactive, no re-authentication |
MCP sessions re-authenticate after ~7 days of inactivity. The MCP server uses browser-based OAuth: refresh tokens last seven days and are rotated on each use. That’s fine for an interactive assistant on someone’s desktop, but it is
not suitable for unattended server-side agents — a headless process cannot complete the browser sign-in. Build headless integrations against the
REST API with an API key instead.
Requirements
- An account with an active API membership subscription (the same tier that unlocks
tl_live_ API keys). If you can use the REST API, you can use the MCP server.
- An MCP-compatible client: Claude.ai, Claude Desktop, ChatGPT, or any other MCP client.
Connection Details
| Setting | Value |
| Server URL | https://mcp.tireweblibrary.com/sse |
| Authentication | OAuth 2.0 (authorization code + PKCE) — sign in with your Tire Library account email and password |
| Access | Read-only catalog access, tied to your account |
Connect in Claude.ai
- Go to Settings → Connectors → Add custom connector.
- Enter the server URL:
https://mcp.tireweblibrary.com/sse
- Click Connect. A browser window opens to our sign-in page.
- Sign in with your Tire Library account credentials.
- Done — Claude can now query the tire catalog on your behalf.
Available Tools
The server exposes 17 read-only tools. Required parameters are marked with *. All tools return JSON; search/list tools return the same paged result shape as the REST catalog endpoints (results.current_page, results.data, etc.). On failure, tools return an error object ({"error": "...", "tool": "...", ...}) instead of throwing.
| Tool | What it does | Parameters | Returns |
search_tires |
Full filtered catalog search (the most flexible search) |
width, aspect_ratio, rim_size, make, speed_rating, load_rating, load_range, ply_rating, utqg, warranty_min, model_name, season, terrain, category, run_flat, three_pmsf, mud_and_snow, studdable, sort, page, per_page — all optional |
Paged tire results |
search_tires_by_size |
Search tires by exact size dimensions |
width*, aspect_ratio*, rim_size*; optional make, season, terrain, category, run_flat, three_pmsf, mud_and_snow, studdable, page, per_page |
Paged tire results |
search_by_make |
Search tires from one manufacturer, with optional size/feature filters |
make*; optional width, aspect_ratio, rim_size, speed_rating, season, terrain, category, run_flat, three_pmsf, mud_and_snow, studdable, page, per_page |
Paged tire results |
search_by_item_number |
Exact lookup by item/part number |
item_number* |
Paged results with the matching tire(s) |
get_tire_by_id |
Full spec detail for one tire SKU |
tire_id* |
Tire detail object, or {"found": false} |
compare_tires |
Side-by-side comparison of 2–6 tires |
tire_ids* — array of 2–6 unique IDs |
found_count, missing_ids, tires[] |
check_fitment |
Tire sizes that fit a specific vehicle |
year*, make*, model*; optional trim |
Fitment data for the vehicle |
list_tire_makes |
All tire manufacturers in the catalog |
none |
Array of {id, name, image_url, dot_reg_url} |
browse_tire_patterns |
Browse patterns/models across makes and/or by name search |
optional make, search, page, per_page |
Paged pattern results |
list_tire_patterns_by_make |
All patterns/models for one manufacturer |
make*; optional page, per_page |
Paged pattern results |
get_tire_pattern_by_id |
Pattern detail, including all available sizes |
pattern_id* |
Pattern object with tire_sizes[], or {"found": false} |
search_sizes_in_pattern |
Check whether a pattern comes in a given size |
pattern_id*; optional width, aspect_ratio, rim_size |
has_matches, match_count, matching_sizes[] |
get_facets |
Available filter values (makes, widths, ratios, rims, ratings, etc.) |
optional make |
Facets object from the catalog |
list_rebates |
List manufacturer rebates with optional filters |
optional make, status (Active default, Upcoming, Expired, or all), page, per_page |
Paged rebate results |
get_rebate_details |
Rebate detail: form URL, required documents, deadline, reward |
rebate_id* |
Rebate detail object, or {"found": false} |
get_rebates_for_tire |
All rebates that apply to one tire SKU |
tire_id*; optional is_active (default false) |
rebates[], rebate_count, tire/make/model names |
get_rebates_for_pattern |
All rebates that apply to a pattern (all its sizes) |
pattern_id*; optional is_active (default false) |
rebates[], rebate_count, pattern/make names |
Example Prompts
- “List all tire makes and show me Michelin’s winter patterns” —
list_tire_makes, list_tire_patterns_by_make
- “What fits a 2021 Ford F-150 XLT?” —
check_fitment
- “Are there any active rebates on the Michelin CrossClimate 2?” —
browse_tire_patterns, get_rebates_for_pattern
- “Does the Defender come in 225/65R17?” —
search_sizes_in_pattern
Rate Limits
There is no separate MCP quota. Every tool call is forwarded to the REST API, where the standard limit applies: 100 requests per 60-second sliding window per company (shared across all API keys) under the API tier policy. Most tools translate to a single REST request per call; compare_tires makes one request per tire ID (2–6). If the limit is exceeded, the tool returns an error object with status: 429 — slow down and retry.
Notes
- The data is identical to what the REST API serves — MCP is just a conversation-friendly way to reach it.
- Access is read-only: the assistant can search and view catalog data but cannot modify anything.
- Sign-in sessions renew silently while in use; after ~7 days of inactivity the assistant will ask you to sign in again (see the callout at the top of this page).