PartSouq APIpartsouq.com ↗
Search PartSouq for genuine and aftermarket parts by OEM part number, or resolve a VIN/frame number to vehicle details and catalogue groups.
What is the PartSouq API?
The PartSouq API exposes 2 endpoints covering OEM parts search and vehicle identification. The search_parts endpoint returns every offer card for a given part number — including price, availability, country of origin, and cross-referenced substitutions — while lookup_vehicle resolves a VIN or chassis number to a specific vehicle and its full parts-catalogue group tree.
curl -X GET 'https://api.parse.bot/scraper/e368741f-5f84-4ad7-9ab0-e36bba5a761d/search_parts?part_number=631138H700' \ -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 partsouq-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: PartSouq SDK — search parts by OEM number, resolve a VIN."""
from parse_apis.partsouq_com_api import PartSouq, InputFormatInvalid
client = PartSouq()
# Search for a Nissan fender by OEM part number.
listing = client.parts.search(part_number="631138H700")
print(f"Search: {listing.query} — {len(listing.results)} result(s)")
for part in listing.results:
print(f" {part.part_name} {part.brand} ${part.price} {part.currency} "
f"qty={part.availability_quantity} [{part.stock_type}]")
# Show substitutions (alternative parts) when available.
if listing.substitutions:
print(f"Substitutions: {len(listing.substitutions)}")
for sub in listing.substitutions:
print(f" {sub.part_number} — {sub.part_name} ${sub.price} {sub.currency}")
# Resolve a VIN to a vehicle and its catalogue groups.
try:
catalog = client.vehicles.lookup(vin="JTFJT02P0T5042785")
except InputFormatInvalid as e:
print(f"Invalid VIN format: {e.message}")
raise
if catalog.resolved and catalog.vehicle is not None:
v = catalog.vehicle
print(f"\nVehicle: {v.year} {v.make} {v.model} ({v.body_description})")
print(f" Engine: {v.engine_code} Model code: {v.model_code}")
for key, val in v.details.items():
print(f" {key}: {val}")
# Browse top-level catalogue groups for the resolved vehicle.
for grp in catalog.groups[:5]:
print(f" Group {grp.group_id}: {grp.name} ({grp.diagram_count} diagrams)")
else:
# Multiple candidates — list them.
print(f"Not resolved; {len(catalog.candidates)} candidate(s)")
for c in catalog.candidates:
print(f" {c.year} {c.make} {c.model}")
print("\nexercised: parts.search / vehicles.lookup")
Searches PartSouq by OEM part number and returns every offer card shown on the result page (one row per offer; the same part number may appear several times with different stock type, price, quantity and dispatch time). Each row carries part name, part number, brand/make, country of manufacture (made_in), available quantity, dispatch/processing time text as displayed (one shape is 'Dispatch within 24h'; stock offers show a processing window such as '2-3 days'), price with ISO currency code (prices are quoted in USD unless the site changes its default currency), the compatibility model list, and part_url, the site's canonical page for that part number. substitutions holds the cards under the page's 'Substitutions' heading (alternative part numbers with the same fields) and is an empty array when the site shows none. A part number the site does not know returns success with empty results and substitutions. Single round trip; no pagination (the site shows all offers on one page).
| Param | Type | Description |
|---|---|---|
| part_numberrequired | string | OEM part number as printed by the manufacturer, e.g. 631138H700. Spaces and hyphens are passed to the site unchanged. |
{
"type": "object",
"fields": {
"query": "the part number searched, as sent",
"results": "array of offer rows for the searched part number: part_name, part_number, brand, made_in (country), availability_quantity (integer units in stock), dispatch_time (display text), price (number), currency (ISO code), product_id (site offer id), stock_type ('express' or 'normal'), compatibility (array of model names), part_url",
"search_url": "PartSouq result page URL for this query",
"substitutions": "array of alternative-part offer rows from the Substitutions section, same row shape as results; empty when the site shows none"
},
"sample": {
"data": {
"query": "631138H700",
"results": [
{
"brand": "Nissan",
"price": 282.92,
"made_in": "Japan",
"currency": "USD",
"part_url": "https://partsouq.com/en/search/all?q=631138H700",
"part_name": "FENDER-FRONT,LH",
"product_id": "18256141",
"stock_type": "express",
"part_number": "631138H700",
"compatibility": [
"X-Trail"
],
"dispatch_time": "Dispatch within 24h",
"availability_quantity": 5
},
{
"brand": "Nissan",
"price": 256.67,
"made_in": "Japan",
"currency": "USD",
"part_url": "https://partsouq.com/en/search/all?q=631138H700",
"part_name": "FENDER-FRONT,LH",
"product_id": "1177702",
"stock_type": "normal",
"part_number": "631138H700",
"compatibility": [
"X-Trail"
],
"dispatch_time": "2-3 days",
"availability_quantity": 6
}
],
"search_url": "https://partsouq.com/en/search/all?q=631138H700",
"substitutions": [
{
"brand": "FPI",
"price": 39.47,
"made_in": "China",
"currency": "USD",
"part_url": "https://partsouq.com/en/search/all?q=NSF171LA",
"part_name": "FENDER W/O MIR HLE- LH",
"product_id": "16652156",
"stock_type": "normal",
"part_number": "NSF171LA",
"compatibility": [],
"dispatch_time": "4-5 days",
"availability_quantity": 0
}
]
},
"status": "success"
}
}About the PartSouq API
Parts Search
The search_parts endpoint accepts a single part_number parameter (OEM number as printed by the manufacturer, e.g. 631138H700) and returns two arrays: results, containing every offer row for the searched number, and substitutions, containing alternative-part offers from PartSouq's Substitutions section. Each row in both arrays includes part_name, part_number, brand, made_in (country of manufacture), and availability_quantity. The search_url field gives you the canonical PartSouq result page URL for the query. When the site shows no substitutions, substitutions is an empty array.
Vehicle Lookup & Catalogue Groups
The lookup_vehicle endpoint accepts a vin parameter — either a standard 17-character VIN or a shorter chassis/frame number (5–25 characters, case-insensitive). When the site resolves the input to exactly one vehicle, resolved is true and the vehicle object is populated with make, region, year, model, model_code, engine_code, body_code, and body_description. The groups array contains every catalogue group for that vehicle, each with group_id, name, parent, depth, diagram_count, and url. When the search matches multiple vehicles without resolving to one, resolved is false, groups is empty, and the candidates array lists the ambiguous matches with make, region, year, model, model_code, details, and url.
Data Coverage Notes
PartSouq lists both genuine OEM parts and aftermarket alternatives sourced from sellers across multiple countries; made_in reflects the manufacturing origin of each offer rather than the seller's location. The catalog_url field in lookup_vehicle responses always points to the PartSouq page the lookup landed on, which is useful for deep-linking users into the catalogue.
The PartSouq API is a managed, monitored endpoint for partsouq.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when partsouq.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 partsouq.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?+
- Match an OEM part number to current stock offers and compare availability quantities across suppliers.
- Identify cross-reference substitutions for discontinued or hard-to-find part numbers using the
substitutionsarray. - Resolve a customer's VIN to make, model, year, and engine code before generating a parts quote.
- Walk a vehicle's full catalogue group tree to present structured parts navigation in a repair application.
- Verify country of manufacture for import compliance checks using the
made_infield on each offer row. - Build a VIN-to-parts workflow by chaining
lookup_vehicle(for group discovery) withsearch_parts(for live offers). - Flag ambiguous VIN lookups to users by checking the
candidatesarray whenresolvedis false.
| 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 PartSouq have an official developer API?+
What does `search_parts` return when the same part number has multiple offers?+
results array. A single part number can appear multiple times, differing by stock type, price, quantity, and dispatch time. The substitutions array is a parallel set of rows for alternative part numbers PartSouq associates with your query — same shape, separate array.What happens with `lookup_vehicle` if the VIN matches more than one vehicle?+
resolved is set to false, the vehicle object is absent, and groups is an empty array. The candidates array is populated with each matching vehicle entry including make, region, year, model, model_code, details, and url, so your application can present the options to the user.Does the API return individual part diagrams or exploded-view images?+
lookup_vehicle endpoint returns catalogue groups with a diagram_count field and group url, but does not return the diagram images or the individual part positions within a diagram. You can fork this API on Parse and revise it to add an endpoint that fetches parts and diagrams for a specific group URL.Does `search_parts` return seller ratings or historical price data?+
results rows cover part_name, part_number, brand, made_in, and availability_quantity but do not include seller ratings or price history. You can fork this API on Parse and revise it to capture additional offer fields if they appear on the result page.