Send a message in a request for quote
Answer the supplier, or send a reminder, in the same email thread as the request for quote. The text is sent as written, under the requester’s name.
curl --request POST \
--url https://api.partfinder.dev/v1/rfq/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"body": "Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp"
}
'import requests
url = "https://api.partfinder.dev/v1/rfq/{id}/messages"
payload = { "body": "Hi Tom,
Thank you. Can you ship to Singapore, and does the price hold for 1,000 units?
Best regards,
Jane Smith
Acme Corp" }
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({
body: JSON.stringify('Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp')
})
};
fetch('https://api.partfinder.dev/v1/rfq/{id}/messages', 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/rfq/{id}/messages",
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([
'body' => 'Hi Tom,
Thank you. Can you ship to Singapore, and does the price hold for 1,000 units?
Best regards,
Jane Smith
Acme Corp'
]),
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/rfq/{id}/messages"
payload := strings.NewReader("{\n \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\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/rfq/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partfinder.dev/v1/rfq/{id}/messages")
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 \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\n}"
response = http.request(request)
puts response.read_body{
"as_of": "2026-10-07T09:20:44.903Z",
"summary": "Sent to sales@supplier.example in the same thread. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.",
"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.",
"rfq": {
"id": "5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e",
"status": "replied",
"supplier": {
"email": "sales@supplier.example",
"name": "Example Supplier",
"contact_name": "Tom Lee"
},
"requester": {
"company": "Acme Corp",
"contact_name": "Jane Smith",
"title": "Procurement Manager"
},
"parts": [
{
"mpn": "TPS54331DR",
"manufacturer": "Texas Instruments",
"quantity": 500
}
],
"needed_by": "2026-11-30",
"notify_email": null,
"created_at": "2026-10-05T16:02:09.913Z",
"first_reply_at": "2026-10-06T14:27:40.551Z",
"follow_up_count": 1,
"replies_received": 1,
"quotes_received": 1,
"messages": [
{
"id": "9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a",
"direction": "outbound",
"subject": "Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp",
"sent_at": "2026-10-05T16:02:11.307Z",
"attachments": [],
"reply_kind": null,
"quote": null
},
{
"id": "2c8b6e1f-7d3a-4e9b-a1c5-6f0d2e4b8a73",
"direction": "inbound",
"subject": "Re: Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Jane,\n\nWe can offer TPS54331DR at $1.85 each for 500 units, 6 weeks lead time, MOQ 250. Quote valid for 30 days.\n\nBest regards,\nTom Lee\nExample Supplier",
"sent_at": "2026-10-06T14:27:40.551Z",
"attachments": [],
"reply_kind": "quote",
"quote": {
"unit_price": {
"value": 1.85,
"words": "$1.85 each",
"reason": null
},
"currency": {
"value": null,
"words": "$1.85 each",
"reason": "The reply gives \"$\" without saying which dollar."
},
"quantity": {
"value": 500,
"words": "500 units",
"reason": null
},
"lead_time_days": {
"value": 42,
"words": "6 weeks",
"reason": null
},
"moq": {
"value": 250,
"words": "MOQ 250",
"reason": null
}
}
},
{
"id": "7a1e9d3c-5b2f-4c8a-9e6d-3f1b0c2a4d58",
"direction": "outbound",
"subject": "Re: Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp",
"sent_at": "2026-10-07T09:20:44.512Z",
"attachments": [],
"reply_kind": null,
"quote": null
}
]
}
}{
"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 1 credit 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>"
]
}{
"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 message, and send the same value again only when retrying that same message after a timeout. A retry with the same key on the same request for quote sends nothing and returns the request for quote with the message the first call sent. A key is recognised only from the same API key that sent it. Optional.
Path Parameters
The request for quote id.
Body
Response
Sent. The body is the request for quote with the new message last.
Was this page helpful?
curl --request POST \
--url https://api.partfinder.dev/v1/rfq/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"body": "Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp"
}
'import requests
url = "https://api.partfinder.dev/v1/rfq/{id}/messages"
payload = { "body": "Hi Tom,
Thank you. Can you ship to Singapore, and does the price hold for 1,000 units?
Best regards,
Jane Smith
Acme Corp" }
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({
body: JSON.stringify('Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp')
})
};
fetch('https://api.partfinder.dev/v1/rfq/{id}/messages', 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/rfq/{id}/messages",
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([
'body' => 'Hi Tom,
Thank you. Can you ship to Singapore, and does the price hold for 1,000 units?
Best regards,
Jane Smith
Acme Corp'
]),
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/rfq/{id}/messages"
payload := strings.NewReader("{\n \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\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/rfq/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partfinder.dev/v1/rfq/{id}/messages")
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 \"body\": \"Hi Tom,\\n\\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\\n\\nBest regards,\\nJane Smith\\nAcme Corp\"\n}"
response = http.request(request)
puts response.read_body{
"as_of": "2026-10-07T09:20:44.903Z",
"summary": "Sent to sales@supplier.example in the same thread. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.",
"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.",
"rfq": {
"id": "5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e",
"status": "replied",
"supplier": {
"email": "sales@supplier.example",
"name": "Example Supplier",
"contact_name": "Tom Lee"
},
"requester": {
"company": "Acme Corp",
"contact_name": "Jane Smith",
"title": "Procurement Manager"
},
"parts": [
{
"mpn": "TPS54331DR",
"manufacturer": "Texas Instruments",
"quantity": 500
}
],
"needed_by": "2026-11-30",
"notify_email": null,
"created_at": "2026-10-05T16:02:09.913Z",
"first_reply_at": "2026-10-06T14:27:40.551Z",
"follow_up_count": 1,
"replies_received": 1,
"quotes_received": 1,
"messages": [
{
"id": "9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a",
"direction": "outbound",
"subject": "Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp",
"sent_at": "2026-10-05T16:02:11.307Z",
"attachments": [],
"reply_kind": null,
"quote": null
},
{
"id": "2c8b6e1f-7d3a-4e9b-a1c5-6f0d2e4b8a73",
"direction": "inbound",
"subject": "Re: Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Jane,\n\nWe can offer TPS54331DR at $1.85 each for 500 units, 6 weeks lead time, MOQ 250. Quote valid for 30 days.\n\nBest regards,\nTom Lee\nExample Supplier",
"sent_at": "2026-10-06T14:27:40.551Z",
"attachments": [],
"reply_kind": "quote",
"quote": {
"unit_price": {
"value": 1.85,
"words": "$1.85 each",
"reason": null
},
"currency": {
"value": null,
"words": "$1.85 each",
"reason": "The reply gives \"$\" without saying which dollar."
},
"quantity": {
"value": 500,
"words": "500 units",
"reason": null
},
"lead_time_days": {
"value": 42,
"words": "6 weeks",
"reason": null
},
"moq": {
"value": 250,
"words": "MOQ 250",
"reason": null
}
}
},
{
"id": "7a1e9d3c-5b2f-4c8a-9e6d-3f1b0c2a4d58",
"direction": "outbound",
"subject": "Re: Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nThank you. Can you ship to Singapore, and does the price hold for 1,000 units?\n\nBest regards,\nJane Smith\nAcme Corp",
"sent_at": "2026-10-07T09:20:44.512Z",
"attachments": [],
"reply_kind": null,
"quote": null
}
]
}
}{
"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 1 credit 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>"
]
}{
"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>"
]
}