Part matching
Part & BOM matching
Turn a partial or full part number into a canonical Zenode part. This is the BOM / part-identification workhorse.
parts:read
Match a part
https://api.zenode.ai/v1/parts/matchRequest
1{2 "query": "TL072",3 "manufacturer": "TI",4 "description": "dual jfet op-amp",5 "limit": 106}| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Partial or full part number to match |
manufacturer | string | Optional | Manufacturer hint (free text, e.g. "TI") — improves ranking |
description | string | Optional | Free-text hint to disambiguate an ambiguous MPN |
limit | int | Optional | Max results, default 10, max 50 |
Response
1{2 "query": "TL072",3 "ambiguous": true,4 "results": [5 {6 "part": {7 "mpn": "TL072CP",8 "mpn_slug": "TL072CP",9 "manufacturer": {10 "slug": "texas-instruments-inc",11 "name": "Texas Instruments"12 },13 "description": "...",14 "image": "https://cdn.zenode.ai/...",15 "status": "active",16 "url": "https://zenode.ai/part/texas-instruments-inc/TL072CP"17 },18 "confidence": 88,19 "exact": false20 }21 ],22 "request_id": "req_8f3a..."23}| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Required | Echoes the input query |
ambiguous | bool | Required | true when there is no single clear winner |
results | MatchResult[] | Required | Ranked best-first; empty if no match |
request_id | string | Required | For support / tracing |
Each MatchResult is { part, confidence, exact }:
| Parameter | Type | Required | Description |
|---|---|---|---|
part | PartSummary | Required | See Objects reference |
confidence | int (0–100) | Required | Match confidence; the ranking key |
exact | bool | Required | true when the query resolves to exactly this orderable part |
Try it
Partial or full part number
Manufacturer hint (optional)
Disambiguation hint (optional)
Max results (default 10, max 50)
1{2 "query": "TL072",3 "limit": 104}curl -X POST "https://ix.zenode.ai/zenode-api/v1/parts/match" \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -H "Content-Type: application/json" \ -d '{ "query": "TL072", "limit": 10}'Confidence, exact, and ambiguous
confidence (0–100) is a calibrated probability that the result is the part you meant — the
candidate scores normalized into a distribution (a softmax with a built-in "no match" alternative).
Because that alternative holds back some probability, the confidences in a response need not sum to
100: the remainder is the chance that none of the results is right. Two close matches split the
mass (each lands well under 100 → ambiguous); a clean exact match takes almost all of it. exact and
ambiguous remain the hard signals to branch on:
- Unambiguous exact match —
ambiguousisfalseand exactly one result hasexact: true, ranked first with highconfidence. Safe to auto-acceptresults[0]. - Ambiguous — the input matches a family or several plausible parts.
ambiguousistrue, every result hasexact: false, andconfidenceis spread across them. Surface a chooser, or tighten withmanufacturer/description. - No match —
resultsis empty andambiguousisfalse.
confidence is a within-response probability; don't compare a confidence value across
different queries as if it were an absolute score.
Input handling
- Empty query — a missing or empty
queryis a 400Bad Requestinvalid_requestfor the single endpoint; in a batch it's a per-lineerror(the rest of the batch still runs). - Gibberish / no plausible part — a well-formed but unmatchable
queryreturnsresults: []withambiguous: false(not an error). - Very broad query — a query that matches many parts returns the top-ranked, bounded set
(
limit, max 50) withambiguous: true; narrow it withmanufacturer/description.
Match a BOM (batch)
Resolve many lines in one request. Each line is matched independently, so one bad line never fails the batch.
https://api.zenode.ai/v1/parts/match/batchRequest
1{2 "queries": [3 {4 "id": "line-1",5 "query": "TL072CP",6 "manufacturer": "TI"7 },8 {9 "id": "line-2",10 "query": "GRM188R71C104KA01",11 "description": "0603 100nF X7R"12 }13 ],14 "limit": 515}| Parameter | Type | Required | Description |
|---|---|---|---|
queries | BatchQuery[] | Required | 1–250 lines. Order is preserved in the response |
limit | int | Optional | Per-line max results, default 5, max 50 |
Each BatchQuery has the single-match fields plus an optional client-supplied id, echoed back
so you can re-join results to your own rows. Over 250 lines returns a top-level 400Bad Request.
Response
One entry per input line, in the same order — each with the same ambiguous / results shape, or a
per-line error:
1{2"results": [3 { "id": "line-1", "query": "TL072CP", "ambiguous": false, "results": [ /* MatchResult */ ], "error": null },4 { "id": "line-3", "query": "", "ambiguous": false, "results": [], "error": { "type": "invalid_request", "message": "Field 'query' is required.", "param": "query" } }5],6"request_id": "req_5c40..."7}A 200OK is returned even when individual lines fail — inspect each line's error. See
Errors.
Each line counts as one match request against your usage — a 250-line batch costs 250. See Rate limits & usage.
Try it
Per-line max results (default 5, max 50)
1{2 "limit": 5,3 "queries": [4 {5 "id": "line-1",6 "query": "TL072CP",7 "manufacturer": "TI"8 },9 {10 "id": "line-2",11 "query": "GRM188R71C104KA01",12 "description": "0603 100nF X7R"13 }14 ]15}curl -X POST "https://ix.zenode.ai/zenode-api/v1/parts/match/batch" \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -H "Content-Type: application/json" \ -d '{ "limit": 5, "queries": [ { "id": "line-1", "query": "TL072CP", "manufacturer": "TI" }, { "id": "line-2", "query": "GRM188R71C104KA01", "description": "0603 100nF X7R" } ]}'Next
- Manufacturers — resolve a manufacturer name to a slug
- Part Catalog search — discovery by query + filters