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