# RFQ to Quote Matcher (`ksoffice/rfq-to-quote-matcher`) Actor

Turn customer requests for quotation (PDF, Excel, CSV or e-mail text) into a priced quotation draft from your own price list. Every line is either matched with your article and price or sent to review with the reason - it never guesses.

- **URL**: https://apify.com/ksoffice/rfq-to-quote-matcher.md
- **Developed by:** [KSoffice Automation](https://apify.com/ksoffice) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 quotation lines

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## RFQ to Quote Matcher

**Turn a customer's request for quotation into a priced quotation draft from your own price list — in seconds, and without guessing.**

Paste the e-mail or link the PDF/Excel the customer sent, link your price list, and get back:

- every requested line **matched to your article with your price**, or
- **sent to review with the reason** — ambiguous article, unit mismatch, typo with no safe match, article you don't stock — plus the closest suggestions.

A ready-to-edit `QUOTATION.xlsx` (sheet *Quotation* + sheet *Needs review*) is saved with every run.

### Example

Input — an e-mail with no article numbers:

```
- 8 pcs residual current device 63A 4-pole 30mA type A
- 16 pcs miniature circuit breaker B16
- 3 pcs cable drum trolley, steel, 400mm
```

Output:

| Line | Status | Article | Unit price | Why |
|---|---|---|---|---|
| 1 | matched | RCD-63-4P-30 | 98.40 | description, clear winner — not collapsed to the 40A variant |
| 2 | **review** | — | — | ambiguous: MCB-B16-1P and MCB-B16-3P score the same; both offered |
| 3 | **review** | — | — | no plausible catalogue article — nothing invented |

### Why "review" is a feature

A line in review costs a person thirty seconds. A line matched to the wrong article is a wrong price in a quotation that has already gone out. Every match has to clear an absolute score **and** a margin over the runner-up; a tie is a question, not a winner.

Tested on three RFQ layouts (clean table, dirty table with typos and lowercase codes, free-text e-mail) against a 44-article catalogue: **32 of 32 lines parsed, 28 priced, 4 sent to review, 0 wrong articles.**

### Input

| Field | What to put there |
|---|---|
| RFQ documents | Links to PDF (with a text layer), XLSX or CSV files |
| RFQ e-mail text | Paste e-mail bodies, one RFQ per entry |
| Price list | Link to your CSV/XLSX, or paste CSV |
| Currency | Label only, e.g. EUR |
| Column overrides | Only if auto-detection picks the wrong column |

Price-list headers are recognised in English, German, Ukrainian and Russian (`code / Artikelnummer / артикул`, `description / Bezeichnung / найменування`, `unit / Einheit / од.`, `price / Einzelpreis / ціна`). Comma, semicolon or tab separated; decimal comma or point.

### Output

**Dataset** — one row per requested line:
`document, line, status, requested_code, requested_description, qty, requested_unit, matched_code, matched_description, unit, unit_price, line_total, currency, confidence, reason, candidates, source_text`

**Key-value store**

- `QUOTATION.xlsx` — priced lines + review sheet with suggestions
- `SUMMARY` — totals per document and overall

### Pricing

Pay per event: a small fee per document processed and per line written. You only pay for lines actually delivered; if your spending limit is reached, the run stops cleanly.

### Limits (v0.1)

- Scanned PDFs (images without a text layer) are not supported yet — use the e-mail text, Excel export or a text PDF.
- Matching is deterministic (no LLM), so it never invents an article — and it won't understand a description that shares no words with your catalogue.
- Your price list and documents are processed only within your run and are not stored anywhere else.

### Use it from n8n, Make or an AI agent

Call the Actor via the Apify API or the Apify MCP server, pass the RFQ text from the incoming e-mail, and send the `QUOTATION.xlsx` link back to your sales inbox.

# Actor input Schema

## `rfqFiles` (type: `array`):

Links to the customer's request-for-quotation files: PDF with a text layer, XLSX or CSV. Scanned PDFs are not supported yet.

## `rfqTexts` (type: `array`):

Paste e-mail bodies here, one RFQ per entry. Free-text lines like "20 pcs LED panel 600x600 30W" work without article codes.

## `catalogueUrl` (type: `string`):

Link to your catalogue as CSV or XLSX. Needs at least an article-code column and a price column; description and unit columns make matching much better. Headers in English, German, Ukrainian and Russian are recognised.

## `catalogueCsv` (type: `string`):

Alternative to the URL. Comma, semicolon or tab separated, header row first.

## `currency` (type: `string`):

Currency of the prices in your list. Used for labels only — no conversion.

## `codeColumn` (type: `string`):

Only if auto-detection picks the wrong column.

## `descriptionColumn` (type: `string`):

Only if auto-detection picks the wrong column.

## `unitColumn` (type: `string`):

Only if auto-detection picks the wrong column.

## `priceColumn` (type: `string`):

Only if auto-detection picks the wrong column.

## Actor input object example

```json
{
  "rfqTexts": [
    "Hello,\nwe need a quotation for the following material for a small workshop fit-out.\nNo item numbers on our side, sorry - descriptions only.\n- 320 m installation cable NYM-J 5G2.5 mm2 grey\n- 45 pcs surface Schuko socket 16A IP44 grey\n- 30 pcs surface switch 1-pole 10A IP44 grey\n- 8 pcs residual current device 63A 4-pole 30mA type A\n- 16 pcs miniature circuit breaker B16\n- 12 pcs wall enclosure IP66 600x400x200 grey\n- 200 pcs cable gland M20 IP68 plastic grey\n- 60 m single core H07V-K 1x10 mm2 black\n- 5 pcs current transformer 100/5A class 1\n- 20 pcs LED panel 600x600 30W 4000K UGR19\n- 90 pcs terminal block screw 4mm2 grey\n- 3 pcs cable drum trolley, steel, 400mm\nBest regards\nRita Hollenbach"
  ],
  "catalogueCsv": "code,description,unit,unit_price_eur,manufacturer\nCBL-NYY-J-5G2.5,\"Power cable NYY-J 5G2.5 mm² black\",m,3.85,Lapp\nCBL-NYY-J-5G4,\"Power cable NYY-J 5G4 mm² black\",m,5.90,Lapp\nCBL-NYY-J-3G1.5,\"Power cable NYY-J 3G1.5 mm² black\",m,1.72,Lapp\nCBL-NYM-J-3G1.5,\"Installation cable NYM-J 3G1.5 mm² grey\",m,1.05,Lapp\nCBL-NYM-J-5G2.5,\"Installation cable NYM-J 5G2.5 mm² grey\",m,2.68,Lapp\nCBL-H07V-K-1X6,\"Single core H07V-K 1x6 mm² green/yellow\",m,1.24,Helukabel\nCBL-H07V-K-1X10,\"Single core H07V-K 1x10 mm² black\",m,2.05,Helukabel\nMCB-B16-1P,\"Miniature circuit breaker B16 1-pole 6kA\",pc,6.40,Hager\nMCB-B16-3P,\"Miniature circuit breaker B16 3-pole 6kA\",pc,19.80,Hager\nMCB-C16-1P,\"Miniature circuit breaker C16 1-pole 6kA\",pc,6.95,Hager\nMCB-B10-1P,\"Miniature circuit breaker B10 1-pole 6kA\",pc,6.20,Hager\nMCB-B32-3P,\"Miniature circuit breaker B32 3-pole 6kA\",pc,23.40,Hager\nRCD-40-2P-30,\"Residual current device 40A 2-pole 30mA type A\",pc,48.50,Hager\nRCD-40-4P-30,\"Residual current device 40A 4-pole 30mA type A\",pc,76.20,Hager\nRCD-63-4P-30,\"Residual current device 63A 4-pole 30mA type A\",pc,98.40,Hager\nCON-9A-230,\"Contactor 9A 3-pole coil 230VAC 1NO\",pc,28.90,Schneider\nCON-12A-230,\"Contactor 12A 3-pole coil 230VAC 1NO\",pc,34.10,Schneider\nCON-18A-230,\"Contactor 18A 3-pole coil 230VAC 1NO\",pc,46.70,Schneider\nCON-25A-24,\"Contactor 25A 3-pole coil 24VDC 1NO\",pc,61.30,Schneider\nOLR-6-10,\"Thermal overload relay 6-10A\",pc,32.80,Schneider\nOLR-9-13,\"Thermal overload relay 9-13A\",pc,34.50,Schneider\nENC-IP65-300,\"Wall enclosure IP65 300x200x150 grey\",pc,42.00,Rittal\nENC-IP65-400,\"Wall enclosure IP65 400x300x200 grey\",pc,64.50,Rittal\nENC-IP66-600,\"Wall enclosure IP66 600x400x200 grey\",pc,118.00,Rittal\nDIN-RAIL-35,\"DIN rail TS35 perforated 2m\",pc,4.60,Rittal\nTB-2.5-GY,\"Terminal block screw 2.5mm² grey\",pc,0.62,Phoenix\nTB-4-GY,\"Terminal block screw 4mm² grey\",pc,0.88,Phoenix\nTB-2.5-BU,\"Terminal block screw 2.5mm² blue\",pc,0.66,Phoenix\nCGL-M20,\"Cable gland M20 IP68 plastic grey\",pc,0.74,Lapp\nCGL-M25,\"Cable gland M25 IP68 plastic grey\",pc,0.95,Lapp\nCGL-M32,\"Cable gland M32 IP68 plastic grey\",pc,1.48,Lapp\nSOC-CEE-16-5P,\"CEE socket 16A 5-pole 400V IP44 surface\",pc,14.20,Mennekes\nSOC-CEE-32-5P,\"CEE socket 32A 5-pole 400V IP44 surface\",pc,26.80,Mennekes\nPLG-CEE-16-5P,\"CEE plug 16A 5-pole 400V IP44\",pc,11.90,Mennekes\nLED-PAN-600-40,\"LED panel 600x600 40W 4000K UGR19\",pc,38.90,Ledvance\nLED-PAN-600-30,\"LED panel 600x600 30W 4000K UGR19\",pc,34.20,Ledvance\nLED-BAT-1500-50,\"LED batten 1500mm 50W 4000K IP65\",pc,29.60,Ledvance\nSW-1P-IP44,\"Surface switch 1-pole 10A IP44 grey\",pc,5.30,Gira\nSOC-SCHUKO-IP44,\"Surface Schuko socket 16A IP44 grey\",pc,6.80,Gira\nPSU-24-5,\"DIN rail power supply 24VDC 5A 120W\",pc,74.50,Mean Well\nPSU-24-10,\"DIN rail power supply 24VDC 10A 240W\",pc,118.00,Mean Well\nSPD-T2-4P,\"Surge protection device type 2 4-pole\",pc,89.00,Dehn\nCT-100-5,\"Current transformer 100/5A class 1\",pc,21.40,Janitza\nML-CU-12X2,\"Copper busbar 12x2mm 1m\",pc,9.80,Rittal\n",
  "currency": "EUR"
}
```

# Actor output Schema

## `quotationLines` (type: `string`):

One row per requested line: matched with your article and price, or sent to review with the reason.

## `quotationXlsx` (type: `string`):

Ready-to-edit Excel file with sheets Quotation and Needs review.

## `summary` (type: `string`):

Totals per document and overall.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "rfqTexts": [
        "Hello,\nwe need a quotation for the following material for a small workshop fit-out.\nNo item numbers on our side, sorry - descriptions only.\n- 320 m installation cable NYM-J 5G2.5 mm2 grey\n- 45 pcs surface Schuko socket 16A IP44 grey\n- 30 pcs surface switch 1-pole 10A IP44 grey\n- 8 pcs residual current device 63A 4-pole 30mA type A\n- 16 pcs miniature circuit breaker B16\n- 12 pcs wall enclosure IP66 600x400x200 grey\n- 200 pcs cable gland M20 IP68 plastic grey\n- 60 m single core H07V-K 1x10 mm2 black\n- 5 pcs current transformer 100/5A class 1\n- 20 pcs LED panel 600x600 30W 4000K UGR19\n- 90 pcs terminal block screw 4mm2 grey\n- 3 pcs cable drum trolley, steel, 400mm\nBest regards\nRita Hollenbach"
    ],
    "catalogueCsv": `code,description,unit,unit_price_eur,manufacturer
CBL-NYY-J-5G2.5,"Power cable NYY-J 5G2.5 mm² black",m,3.85,Lapp
CBL-NYY-J-5G4,"Power cable NYY-J 5G4 mm² black",m,5.90,Lapp
CBL-NYY-J-3G1.5,"Power cable NYY-J 3G1.5 mm² black",m,1.72,Lapp
CBL-NYM-J-3G1.5,"Installation cable NYM-J 3G1.5 mm² grey",m,1.05,Lapp
CBL-NYM-J-5G2.5,"Installation cable NYM-J 5G2.5 mm² grey",m,2.68,Lapp
CBL-H07V-K-1X6,"Single core H07V-K 1x6 mm² green/yellow",m,1.24,Helukabel
CBL-H07V-K-1X10,"Single core H07V-K 1x10 mm² black",m,2.05,Helukabel
MCB-B16-1P,"Miniature circuit breaker B16 1-pole 6kA",pc,6.40,Hager
MCB-B16-3P,"Miniature circuit breaker B16 3-pole 6kA",pc,19.80,Hager
MCB-C16-1P,"Miniature circuit breaker C16 1-pole 6kA",pc,6.95,Hager
MCB-B10-1P,"Miniature circuit breaker B10 1-pole 6kA",pc,6.20,Hager
MCB-B32-3P,"Miniature circuit breaker B32 3-pole 6kA",pc,23.40,Hager
RCD-40-2P-30,"Residual current device 40A 2-pole 30mA type A",pc,48.50,Hager
RCD-40-4P-30,"Residual current device 40A 4-pole 30mA type A",pc,76.20,Hager
RCD-63-4P-30,"Residual current device 63A 4-pole 30mA type A",pc,98.40,Hager
CON-9A-230,"Contactor 9A 3-pole coil 230VAC 1NO",pc,28.90,Schneider
CON-12A-230,"Contactor 12A 3-pole coil 230VAC 1NO",pc,34.10,Schneider
CON-18A-230,"Contactor 18A 3-pole coil 230VAC 1NO",pc,46.70,Schneider
CON-25A-24,"Contactor 25A 3-pole coil 24VDC 1NO",pc,61.30,Schneider
OLR-6-10,"Thermal overload relay 6-10A",pc,32.80,Schneider
OLR-9-13,"Thermal overload relay 9-13A",pc,34.50,Schneider
ENC-IP65-300,"Wall enclosure IP65 300x200x150 grey",pc,42.00,Rittal
ENC-IP65-400,"Wall enclosure IP65 400x300x200 grey",pc,64.50,Rittal
ENC-IP66-600,"Wall enclosure IP66 600x400x200 grey",pc,118.00,Rittal
DIN-RAIL-35,"DIN rail TS35 perforated 2m",pc,4.60,Rittal
TB-2.5-GY,"Terminal block screw 2.5mm² grey",pc,0.62,Phoenix
TB-4-GY,"Terminal block screw 4mm² grey",pc,0.88,Phoenix
TB-2.5-BU,"Terminal block screw 2.5mm² blue",pc,0.66,Phoenix
CGL-M20,"Cable gland M20 IP68 plastic grey",pc,0.74,Lapp
CGL-M25,"Cable gland M25 IP68 plastic grey",pc,0.95,Lapp
CGL-M32,"Cable gland M32 IP68 plastic grey",pc,1.48,Lapp
SOC-CEE-16-5P,"CEE socket 16A 5-pole 400V IP44 surface",pc,14.20,Mennekes
SOC-CEE-32-5P,"CEE socket 32A 5-pole 400V IP44 surface",pc,26.80,Mennekes
PLG-CEE-16-5P,"CEE plug 16A 5-pole 400V IP44",pc,11.90,Mennekes
LED-PAN-600-40,"LED panel 600x600 40W 4000K UGR19",pc,38.90,Ledvance
LED-PAN-600-30,"LED panel 600x600 30W 4000K UGR19",pc,34.20,Ledvance
LED-BAT-1500-50,"LED batten 1500mm 50W 4000K IP65",pc,29.60,Ledvance
SW-1P-IP44,"Surface switch 1-pole 10A IP44 grey",pc,5.30,Gira
SOC-SCHUKO-IP44,"Surface Schuko socket 16A IP44 grey",pc,6.80,Gira
PSU-24-5,"DIN rail power supply 24VDC 5A 120W",pc,74.50,Mean Well
PSU-24-10,"DIN rail power supply 24VDC 10A 240W",pc,118.00,Mean Well
SPD-T2-4P,"Surge protection device type 2 4-pole",pc,89.00,Dehn
CT-100-5,"Current transformer 100/5A class 1",pc,21.40,Janitza
ML-CU-12X2,"Copper busbar 12x2mm 1m",pc,9.80,Rittal`
};

// Run the Actor and wait for it to finish
const run = await client.actor("ksoffice/rfq-to-quote-matcher").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "rfqTexts": ["""Hello,
we need a quotation for the following material for a small workshop fit-out.
No item numbers on our side, sorry - descriptions only.
- 320 m installation cable NYM-J 5G2.5 mm2 grey
- 45 pcs surface Schuko socket 16A IP44 grey
- 30 pcs surface switch 1-pole 10A IP44 grey
- 8 pcs residual current device 63A 4-pole 30mA type A
- 16 pcs miniature circuit breaker B16
- 12 pcs wall enclosure IP66 600x400x200 grey
- 200 pcs cable gland M20 IP68 plastic grey
- 60 m single core H07V-K 1x10 mm2 black
- 5 pcs current transformer 100/5A class 1
- 20 pcs LED panel 600x600 30W 4000K UGR19
- 90 pcs terminal block screw 4mm2 grey
- 3 pcs cable drum trolley, steel, 400mm
Best regards
Rita Hollenbach"""],
    "catalogueCsv": """code,description,unit,unit_price_eur,manufacturer
CBL-NYY-J-5G2.5,\"Power cable NYY-J 5G2.5 mm² black\",m,3.85,Lapp
CBL-NYY-J-5G4,\"Power cable NYY-J 5G4 mm² black\",m,5.90,Lapp
CBL-NYY-J-3G1.5,\"Power cable NYY-J 3G1.5 mm² black\",m,1.72,Lapp
CBL-NYM-J-3G1.5,\"Installation cable NYM-J 3G1.5 mm² grey\",m,1.05,Lapp
CBL-NYM-J-5G2.5,\"Installation cable NYM-J 5G2.5 mm² grey\",m,2.68,Lapp
CBL-H07V-K-1X6,\"Single core H07V-K 1x6 mm² green/yellow\",m,1.24,Helukabel
CBL-H07V-K-1X10,\"Single core H07V-K 1x10 mm² black\",m,2.05,Helukabel
MCB-B16-1P,\"Miniature circuit breaker B16 1-pole 6kA\",pc,6.40,Hager
MCB-B16-3P,\"Miniature circuit breaker B16 3-pole 6kA\",pc,19.80,Hager
MCB-C16-1P,\"Miniature circuit breaker C16 1-pole 6kA\",pc,6.95,Hager
MCB-B10-1P,\"Miniature circuit breaker B10 1-pole 6kA\",pc,6.20,Hager
MCB-B32-3P,\"Miniature circuit breaker B32 3-pole 6kA\",pc,23.40,Hager
RCD-40-2P-30,\"Residual current device 40A 2-pole 30mA type A\",pc,48.50,Hager
RCD-40-4P-30,\"Residual current device 40A 4-pole 30mA type A\",pc,76.20,Hager
RCD-63-4P-30,\"Residual current device 63A 4-pole 30mA type A\",pc,98.40,Hager
CON-9A-230,\"Contactor 9A 3-pole coil 230VAC 1NO\",pc,28.90,Schneider
CON-12A-230,\"Contactor 12A 3-pole coil 230VAC 1NO\",pc,34.10,Schneider
CON-18A-230,\"Contactor 18A 3-pole coil 230VAC 1NO\",pc,46.70,Schneider
CON-25A-24,\"Contactor 25A 3-pole coil 24VDC 1NO\",pc,61.30,Schneider
OLR-6-10,\"Thermal overload relay 6-10A\",pc,32.80,Schneider
OLR-9-13,\"Thermal overload relay 9-13A\",pc,34.50,Schneider
ENC-IP65-300,\"Wall enclosure IP65 300x200x150 grey\",pc,42.00,Rittal
ENC-IP65-400,\"Wall enclosure IP65 400x300x200 grey\",pc,64.50,Rittal
ENC-IP66-600,\"Wall enclosure IP66 600x400x200 grey\",pc,118.00,Rittal
DIN-RAIL-35,\"DIN rail TS35 perforated 2m\",pc,4.60,Rittal
TB-2.5-GY,\"Terminal block screw 2.5mm² grey\",pc,0.62,Phoenix
TB-4-GY,\"Terminal block screw 4mm² grey\",pc,0.88,Phoenix
TB-2.5-BU,\"Terminal block screw 2.5mm² blue\",pc,0.66,Phoenix
CGL-M20,\"Cable gland M20 IP68 plastic grey\",pc,0.74,Lapp
CGL-M25,\"Cable gland M25 IP68 plastic grey\",pc,0.95,Lapp
CGL-M32,\"Cable gland M32 IP68 plastic grey\",pc,1.48,Lapp
SOC-CEE-16-5P,\"CEE socket 16A 5-pole 400V IP44 surface\",pc,14.20,Mennekes
SOC-CEE-32-5P,\"CEE socket 32A 5-pole 400V IP44 surface\",pc,26.80,Mennekes
PLG-CEE-16-5P,\"CEE plug 16A 5-pole 400V IP44\",pc,11.90,Mennekes
LED-PAN-600-40,\"LED panel 600x600 40W 4000K UGR19\",pc,38.90,Ledvance
LED-PAN-600-30,\"LED panel 600x600 30W 4000K UGR19\",pc,34.20,Ledvance
LED-BAT-1500-50,\"LED batten 1500mm 50W 4000K IP65\",pc,29.60,Ledvance
SW-1P-IP44,\"Surface switch 1-pole 10A IP44 grey\",pc,5.30,Gira
SOC-SCHUKO-IP44,\"Surface Schuko socket 16A IP44 grey\",pc,6.80,Gira
PSU-24-5,\"DIN rail power supply 24VDC 5A 120W\",pc,74.50,Mean Well
PSU-24-10,\"DIN rail power supply 24VDC 10A 240W\",pc,118.00,Mean Well
SPD-T2-4P,\"Surge protection device type 2 4-pole\",pc,89.00,Dehn
CT-100-5,\"Current transformer 100/5A class 1\",pc,21.40,Janitza
ML-CU-12X2,\"Copper busbar 12x2mm 1m\",pc,9.80,Rittal
""",
}

# Run the Actor and wait for it to finish
run = client.actor("ksoffice/rfq-to-quote-matcher").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "rfqTexts": [
    "Hello,\\nwe need a quotation for the following material for a small workshop fit-out.\\nNo item numbers on our side, sorry - descriptions only.\\n- 320 m installation cable NYM-J 5G2.5 mm2 grey\\n- 45 pcs surface Schuko socket 16A IP44 grey\\n- 30 pcs surface switch 1-pole 10A IP44 grey\\n- 8 pcs residual current device 63A 4-pole 30mA type A\\n- 16 pcs miniature circuit breaker B16\\n- 12 pcs wall enclosure IP66 600x400x200 grey\\n- 200 pcs cable gland M20 IP68 plastic grey\\n- 60 m single core H07V-K 1x10 mm2 black\\n- 5 pcs current transformer 100/5A class 1\\n- 20 pcs LED panel 600x600 30W 4000K UGR19\\n- 90 pcs terminal block screw 4mm2 grey\\n- 3 pcs cable drum trolley, steel, 400mm\\nBest regards\\nRita Hollenbach"
  ],
  "catalogueCsv": "code,description,unit,unit_price_eur,manufacturer\\nCBL-NYY-J-5G2.5,\\"Power cable NYY-J 5G2.5 mm² black\\",m,3.85,Lapp\\nCBL-NYY-J-5G4,\\"Power cable NYY-J 5G4 mm² black\\",m,5.90,Lapp\\nCBL-NYY-J-3G1.5,\\"Power cable NYY-J 3G1.5 mm² black\\",m,1.72,Lapp\\nCBL-NYM-J-3G1.5,\\"Installation cable NYM-J 3G1.5 mm² grey\\",m,1.05,Lapp\\nCBL-NYM-J-5G2.5,\\"Installation cable NYM-J 5G2.5 mm² grey\\",m,2.68,Lapp\\nCBL-H07V-K-1X6,\\"Single core H07V-K 1x6 mm² green/yellow\\",m,1.24,Helukabel\\nCBL-H07V-K-1X10,\\"Single core H07V-K 1x10 mm² black\\",m,2.05,Helukabel\\nMCB-B16-1P,\\"Miniature circuit breaker B16 1-pole 6kA\\",pc,6.40,Hager\\nMCB-B16-3P,\\"Miniature circuit breaker B16 3-pole 6kA\\",pc,19.80,Hager\\nMCB-C16-1P,\\"Miniature circuit breaker C16 1-pole 6kA\\",pc,6.95,Hager\\nMCB-B10-1P,\\"Miniature circuit breaker B10 1-pole 6kA\\",pc,6.20,Hager\\nMCB-B32-3P,\\"Miniature circuit breaker B32 3-pole 6kA\\",pc,23.40,Hager\\nRCD-40-2P-30,\\"Residual current device 40A 2-pole 30mA type A\\",pc,48.50,Hager\\nRCD-40-4P-30,\\"Residual current device 40A 4-pole 30mA type A\\",pc,76.20,Hager\\nRCD-63-4P-30,\\"Residual current device 63A 4-pole 30mA type A\\",pc,98.40,Hager\\nCON-9A-230,\\"Contactor 9A 3-pole coil 230VAC 1NO\\",pc,28.90,Schneider\\nCON-12A-230,\\"Contactor 12A 3-pole coil 230VAC 1NO\\",pc,34.10,Schneider\\nCON-18A-230,\\"Contactor 18A 3-pole coil 230VAC 1NO\\",pc,46.70,Schneider\\nCON-25A-24,\\"Contactor 25A 3-pole coil 24VDC 1NO\\",pc,61.30,Schneider\\nOLR-6-10,\\"Thermal overload relay 6-10A\\",pc,32.80,Schneider\\nOLR-9-13,\\"Thermal overload relay 9-13A\\",pc,34.50,Schneider\\nENC-IP65-300,\\"Wall enclosure IP65 300x200x150 grey\\",pc,42.00,Rittal\\nENC-IP65-400,\\"Wall enclosure IP65 400x300x200 grey\\",pc,64.50,Rittal\\nENC-IP66-600,\\"Wall enclosure IP66 600x400x200 grey\\",pc,118.00,Rittal\\nDIN-RAIL-35,\\"DIN rail TS35 perforated 2m\\",pc,4.60,Rittal\\nTB-2.5-GY,\\"Terminal block screw 2.5mm² grey\\",pc,0.62,Phoenix\\nTB-4-GY,\\"Terminal block screw 4mm² grey\\",pc,0.88,Phoenix\\nTB-2.5-BU,\\"Terminal block screw 2.5mm² blue\\",pc,0.66,Phoenix\\nCGL-M20,\\"Cable gland M20 IP68 plastic grey\\",pc,0.74,Lapp\\nCGL-M25,\\"Cable gland M25 IP68 plastic grey\\",pc,0.95,Lapp\\nCGL-M32,\\"Cable gland M32 IP68 plastic grey\\",pc,1.48,Lapp\\nSOC-CEE-16-5P,\\"CEE socket 16A 5-pole 400V IP44 surface\\",pc,14.20,Mennekes\\nSOC-CEE-32-5P,\\"CEE socket 32A 5-pole 400V IP44 surface\\",pc,26.80,Mennekes\\nPLG-CEE-16-5P,\\"CEE plug 16A 5-pole 400V IP44\\",pc,11.90,Mennekes\\nLED-PAN-600-40,\\"LED panel 600x600 40W 4000K UGR19\\",pc,38.90,Ledvance\\nLED-PAN-600-30,\\"LED panel 600x600 30W 4000K UGR19\\",pc,34.20,Ledvance\\nLED-BAT-1500-50,\\"LED batten 1500mm 50W 4000K IP65\\",pc,29.60,Ledvance\\nSW-1P-IP44,\\"Surface switch 1-pole 10A IP44 grey\\",pc,5.30,Gira\\nSOC-SCHUKO-IP44,\\"Surface Schuko socket 16A IP44 grey\\",pc,6.80,Gira\\nPSU-24-5,\\"DIN rail power supply 24VDC 5A 120W\\",pc,74.50,Mean Well\\nPSU-24-10,\\"DIN rail power supply 24VDC 10A 240W\\",pc,118.00,Mean Well\\nSPD-T2-4P,\\"Surge protection device type 2 4-pole\\",pc,89.00,Dehn\\nCT-100-5,\\"Current transformer 100/5A class 1\\",pc,21.40,Janitza\\nML-CU-12X2,\\"Copper busbar 12x2mm 1m\\",pc,9.80,Rittal\\n"
}' |
apify call ksoffice/rfq-to-quote-matcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ksoffice/rfq-to-quote-matcher"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HUL7Q0q9iRTUcKDj2/builds/k40uxbqMICTdF5iOT/openapi.json
