> ## Documentation Index
> Fetch the complete documentation index at: https://docs.partfinder.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The PartFinder API is served at https://api.partfinder.dev. Authenticate with `Authorization: Bearer $PARTFINDER_API_KEY`; create an account at https://console.partfinder.dev/sign-up and pick pay as you go or a monthly or yearly plan (see https://partfinder.dev/pricing), then create a key. Pay as you go starts with 100 free credits, once per person and per company.
> Install the PartFinder agent skill with `npx skills add https://docs.partfinder.dev` (skill file: https://docs.partfinder.dev/skill.md).
> The OpenAPI document at https://api.partfinder.dev/v1/openapi.json is the source of truth for request and response schemas.
> What each call costs and current plans: https://api.partfinder.dev/llms.txt.

# Requests for quote

> Email a request for quote to a supplier, read their replies with the quote laid out, and answer in the same email thread.

Send a request for quote to a supplier you name. It goes out as an ordinary email under your requester's
name; the supplier replies as they would to anyone. Their replies come back to the request for quote,
with the price, lead time and minimum order read out beside the supplier's own words.

## Send one

```python Python theme={null}
import os
import uuid

import requests

response = requests.post(
    "https://api.partfinder.dev/v1/rfq",
    headers={
        "Authorization": f"Bearer {os.environ['PARTFINDER_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "supplier": {"email": "sales@supplier.example", "name": "Example Supplier"},
        "requester": {"company": "Acme Corp", "contact_name": "Jane Smith"},
        "parts": [{"mpn": "TPS54331DR", "quantity": 500}],
        "needed_by": "2026-11-30",
    },
)
print(response.json())
```

```javascript JavaScript theme={null}
const response = await fetch("https://api.partfinder.dev/v1/rfq", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PARTFINDER_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
  },
  body: JSON.stringify({
    supplier: { email: "sales@supplier.example", name: "Example Supplier" },
    requester: { company: "Acme Corp", contact_name: "Jane Smith" },
    parts: [{ mpn: "TPS54331DR", quantity: 500 }],
    needed_by: "2026-11-30",
  }),
});
console.log(await response.json());
```

```bash cURL theme={null}
curl https://api.partfinder.dev/v1/rfq \
  -X POST \
  -H "Authorization: Bearer $PARTFINDER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "supplier": { "email": "sales@supplier.example", "name": "Example Supplier" },
    "requester": { "company": "Acme Corp", "contact_name": "Jane Smith" },
    "parts": [{ "mpn": "TPS54331DR", "quantity": 500 }],
    "needed_by": "2026-11-30"
  }'
```

* **This sends a real email.** Every address and name must come from your user. If your user did not
  give one, ask them; never guess a supplier's address.
* Leave out `message` and the email is written for you from the parts, quantities and date. Send
  `message` only with text your user wrote.
* `notify_email` is the address told when the supplier replies. With a key made for one of your
  customers ([Serving your own customers](https://docs.partfinder.dev/authentication.md#serving-your-own-customers)) it is required.
* Send the same `Idempotency-Key` again only to retry a request that timed out: you get the first
  request for quote back and no second email goes out.

The answer is `201` with the request for quote, its `id` and the message sent. The full shape is in
[Send a request for quote](https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote.md).

## Read the replies

[`GET /v1/rfq/{id}`](https://docs.partfinder.dev/api-reference/rfqs/get-a-request-for-quote) returns the email thread, oldest first.
`status` reads `replied` once the supplier has answered. A supplier reply carries what they wrote and the
quote it states:

```json theme={null}
{
  "direction": "inbound",
  "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",
  "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 }
  }
}
```

Trimmed for length: `id`, `subject`, `sent_at` and `attachments`.

* A field the reply does not state is `null`, with `reason` saying so. Nothing is filled in by guessing.
* `words` is the supplier's own wording for each value: show it to your user beside the number.
* `reply_kind` is `question` when the supplier asks something before quoting, and `decline` when they
  will not quote.

Poll `GET /v1/rfq/{id}`, or have [webhooks](https://docs.partfinder.dev/webhooks.md) tell you when a reply arrives.

## Answer in the thread

```python Python theme={null}
import os
import uuid

import requests

response = requests.post(
    f"https://api.partfinder.dev/v1/rfq/{os.environ['RFQ_ID']}/messages",
    headers={
        "Authorization": f"Bearer {os.environ['PARTFINDER_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={"body": "Thank you. Does the price hold for 1,000 units?"},
)
print(response.json())
```

```javascript JavaScript theme={null}
const response = await fetch(`https://api.partfinder.dev/v1/rfq/${process.env.RFQ_ID}/messages`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PARTFINDER_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
  },
  body: JSON.stringify({ body: "Thank you. Does the price hold for 1,000 units?" }),
});
console.log(await response.json());
```

```bash cURL theme={null}
curl https://api.partfinder.dev/v1/rfq/$RFQ_ID/messages \
  -X POST \
  -H "Authorization: Bearer $PARTFINDER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "body": "Thank you. Does the price hold for 1,000 units?" }'
```

The text is sent as written, under the requester's name, as the next email in the same conversation. Use
it to answer a supplier's question or to send a reminder.

## When a message is not sent

A `409` means the supplier opted out or their address bounced; a `422` means your own text was refused,
with `summary` saying what to change. Nothing is sent in either case. The codes are in
[Errors](https://docs.partfinder.dev/errors.md#error-codes).

## List and delete

[`GET /v1/rfq`](https://docs.partfinder.dev/api-reference/rfqs/list-your-requests-for-quote) lists your requests for quote, newest
first, one page at a time: pass `next_cursor` back as `cursor` for the next page.
[`DELETE /v1/rfq/{id}`](https://docs.partfinder.dev/api-reference/rfqs/delete-a-request-for-quote) removes one and its whole thread.
A reply the supplier sends after that is not kept, and the supplier is not told.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.