Search for parts
Find parts for a part number or a description: the part itself and comparable parts from the same or other makers, each with its product page, datasheet, the specifications that matter for this kind of part, and its stock and lead time at distributors. Answers 202 at once; read GET /v1/search/{id} after 35 seconds, then every 15 seconds, until status is no longer processing: complete with the rows, or failed. Each answer while it runs states the wait in summary and Retry-After. A query that is not about a part is refused with 422.
curl --request POST \
--url https://api.partfinder.dev/v1/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "TPS54331DR"
}
'import requests
url = "https://api.partfinder.dev/v1/search"
payload = { "query": "TPS54331DR" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'TPS54331DR'})
};
fetch('https://api.partfinder.dev/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.partfinder.dev/v1/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'TPS54331DR'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.partfinder.dev/v1/search"
payload := strings.NewReader("{\n \"query\": \"TPS54331DR\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.partfinder.dev/v1/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"TPS54331DR\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partfinder.dev/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"TPS54331DR\"\n}"
response = http.request(request)
puts response.read_body{
"as_of": "2026-10-10T13:19:57.540Z",
"summary": "Searching for \"TPS54331DR\". Poll GET /v1/search/e8413914-cea8-46b0-9c6b-8207a4157fc0 after 35 seconds, then every 15 seconds, until `status` is no longer `processing`.",
"notice": "Informational only. Risk scores, stock levels, lead times and alternate-part suggestions may be incomplete, delayed or inaccurate. Independently verify before making procurement, engineering, compliance, safety or sourcing decisions.",
"id": "e8413914-cea8-46b0-9c6b-8207a4157fc0",
"status": "processing"
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "credits_exhausted",
"summary": "Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.",
"reason": "This request needs 40 credits and 0 are left.",
"billing_url": "https://console.partfinder.dev/settings/billing"
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}Authorizations
An API key created in the PartFinder console at https://console.partfinder.dev, or a customer key created with POST /v1/keys. Send as Authorization: Bearer <key>. Revocation takes effect within approximately one minute.
Headers
Set by your client code, not by a person or a model: generate a new value (a UUID) for each search, and send the same value again only when retrying that same search after a timeout. A retry with the same key returns the search the first call started and starts no second one. A key is recognised only from the same API key that sent it. Optional.
Body
What to search for: a part number, or a description of the part ("3A buck converter 28V", "6205 bearing").
1Response
Accepted. The search has started; a retry with an Idempotency-Key already used returns the search that key started, with its current status.
ISO 8601. How current the data in this response is.
Plain language an agent can relay without re-deriving it.
Informational-use notice. Always present.
Poll GET /v1/search/{id} with it.
processing for a new search. A retry with an Idempotency-Key already used returns the search that key started, with its current status.
processing, complete, failed Was this page helpful?
curl --request POST \
--url https://api.partfinder.dev/v1/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "TPS54331DR"
}
'import requests
url = "https://api.partfinder.dev/v1/search"
payload = { "query": "TPS54331DR" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'TPS54331DR'})
};
fetch('https://api.partfinder.dev/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.partfinder.dev/v1/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'TPS54331DR'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.partfinder.dev/v1/search"
payload := strings.NewReader("{\n \"query\": \"TPS54331DR\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.partfinder.dev/v1/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"TPS54331DR\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partfinder.dev/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"TPS54331DR\"\n}"
response = http.request(request)
puts response.read_body{
"as_of": "2026-10-10T13:19:57.540Z",
"summary": "Searching for \"TPS54331DR\". Poll GET /v1/search/e8413914-cea8-46b0-9c6b-8207a4157fc0 after 35 seconds, then every 15 seconds, until `status` is no longer `processing`.",
"notice": "Informational only. Risk scores, stock levels, lead times and alternate-part suggestions may be incomplete, delayed or inaccurate. Independently verify before making procurement, engineering, compliance, safety or sourcing decisions.",
"id": "e8413914-cea8-46b0-9c6b-8207a4157fc0",
"status": "processing"
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "credits_exhausted",
"summary": "Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.",
"reason": "This request needs 40 credits and 0 are left.",
"billing_url": "https://console.partfinder.dev/settings/billing"
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}{
"error": "authentication_required",
"summary": "<string>",
"reason": "<string>",
"billing_url": "<string>",
"did_you_mean": [
"<string>"
]
}