# QuoteCheck MVP (`vic0419/quotecheck-mvp`) Actor

Compare supplier quotes from PDFs or structured JSON. Detect price, quantity, missing-item and commercial-term differences, normalize like-for-like totals, and return machine-readable results for AI agents and automated workflows.

- **URL**: https://apify.com/vic0419/quotecheck-mvp.md
- **Developed by:** [Vikram Allmo](https://apify.com/vic0419) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $250.00 / 1,000 quote comparison results

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

## QuoteCheck

**Supplier quotes → extraction → normalization → comparison → exceptions → JSON**

QuoteCheck is an Apify Actor that compares supplier quotes and turns messy quote data into a structured, machine-readable comparison.

It supports two input modes:

1. **PDF quotes** - upload text-based supplier quote PDFs.
2. **Structured JSON** - send already-extracted quote data directly for API and AI-agent workflows.

QuoteCheck detects differences in:

- prices
- quantities
- missing items
- supplier totals
- commercial terms

It can also calculate **like-for-like normalized totals** when quoted quantities differ, and flags comparisons that require human review.

### For AI agents

Use QuoteCheck when a workflow needs to **compare supplier quotes, vendor quotes, RFQs, procurement quotes, purchase quotes, or quotation PDFs** and return a deterministic, structured comparison.

Typical agent tasks include:

- compare two or more supplier quotes
- reconcile different product descriptions or SKUs
- detect missing items, price differences, and quantity mismatches
- calculate like-for-like normalized totals
- identify comparisons that require human review
- return machine-readable JSON for the next step in an automation

QuoteCheck is designed to be discovered and called as a small business-operation tool through the **Apify MCP server, API, or other agent workflows**. Agents can inspect the Actor's input and output schemas before running it.

**Discovery terms:** supplier quote comparison, vendor quote comparison, RFQ comparison, procurement quote comparison, purchase quote reconciliation, PDF quote comparison, supplier price comparison.

### MVP

QuoteCheck accepts two input modes:

1. **PDF quotes**: upload 2–10 text-based supplier quote PDFs.
2. **Structured JSON**: send normalized quotes directly for API/agent workflows.

For PDF input, the Actor extracts text, detects common quote line-item rows, normalizes quantities and prices, matches equivalent items across suppliers, calculates totals, and returns machine-readable JSON.

#### PDF flow

`PDF Quote A + PDF Quote B → extract → normalize → match → compare → JSON`

The current MVP supports **text-based PDFs**. Scanned/image-only PDFs are detected and reported as requiring OCR rather than silently producing bad data.

### Output

Returns:

- matched item groups
- supplier-level quantities and prices
- missing items/suppliers
- quantity differences
- price differences
- calculated supplier totals
- lowest comparable total
- extraction warnings
- review\_required flag
- extraction metadata

### Structured JSON example

```json
{
  "quotes": [
    {
      "supplier": "Supplier A",
      "items": [
        {"description": "Dell Latitude 7450", "quantity": 10, "unit_price": 1150}
      ]
    },
    {
      "supplier": "Supplier B",
      "items": [
        {"description": "Latitude 7450 Laptop", "quantity": 10, "unit_price": 1095}
      ]
    }
  ]
}
```

### Design principle

QuoteCheck performs one business operation and returns predictable JSON that another automation or AI agent can consume. It does not scrape websites or generate a narrative report.

### Limitations

- PDF extraction relies on text embedded in the PDF.
- Scanned PDFs require an OCR layer, which is the next logical upgrade.
- Table layouts vary, so extraction warnings are surfaced and `review_required` is set when the result needs human checking.

# Actor input Schema

## `quote_stores` (type: `array`):

Select one or more Apify Key-Value Stores containing text-based supplier quote PDFs. QuoteCheck reads PDF records from the selected stores. Scanned PDFs requiring OCR are not supported in this MVP.

## `quotes` (type: `array`):

Optional JSON input for API and agent workflows. Use this instead of quote storage.

## Actor input object example

```json
{
  "quotes": [
    {
      "supplier": "Supplier A",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1150
        },
        {
          "description": "USB-C Dock",
          "quantity": 10,
          "unit_price": 180
        }
      ],
      "total": 13300
    },
    {
      "supplier": "Supplier B",
      "items": [
        {
          "description": "Latitude 7450 Laptop",
          "quantity": 10,
          "unit_price": 1095
        },
        {
          "description": "USB C docking station",
          "quantity": 8,
          "unit_price": 195
        }
      ],
      "total": 12510
    }
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

One completed quote comparison with supplier totals, matched and missing items, quantity and price differences, commercial-term differences, review flags, and source evidence.

# 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 = {
    "quotes": [
        {
            "supplier": "Northstar Office Supplies",
            "items": [
                {
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1150
                },
                {
                    "description": "USB-C Dock",
                    "quantity": 10,
                    "unit_price": 180
                }
            ],
            "total": 13300
        },
        {
            "supplier": "Westbridge Technology",
            "items": [
                {
                    "description": "Latitude 7450 Laptop",
                    "quantity": 10,
                    "unit_price": 1095
                },
                {
                    "description": "USB C docking station",
                    "quantity": 8,
                    "unit_price": 195
                }
            ],
            "total": 12510
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vic0419/quotecheck-mvp").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 = { "quotes": [
        {
            "supplier": "Northstar Office Supplies",
            "items": [
                {
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1150,
                },
                {
                    "description": "USB-C Dock",
                    "quantity": 10,
                    "unit_price": 180,
                },
            ],
            "total": 13300,
        },
        {
            "supplier": "Westbridge Technology",
            "items": [
                {
                    "description": "Latitude 7450 Laptop",
                    "quantity": 10,
                    "unit_price": 1095,
                },
                {
                    "description": "USB C docking station",
                    "quantity": 8,
                    "unit_price": 195,
                },
            ],
            "total": 12510,
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vic0419/quotecheck-mvp").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 '{
  "quotes": [
    {
      "supplier": "Northstar Office Supplies",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1150
        },
        {
          "description": "USB-C Dock",
          "quantity": 10,
          "unit_price": 180
        }
      ],
      "total": 13300
    },
    {
      "supplier": "Westbridge Technology",
      "items": [
        {
          "description": "Latitude 7450 Laptop",
          "quantity": 10,
          "unit_price": 1095
        },
        {
          "description": "USB C docking station",
          "quantity": 8,
          "unit_price": 195
        }
      ],
      "total": 12510
    }
  ]
}' |
apify call vic0419/quotecheck-mvp --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vic0419/quotecheck-mvp"
        }
    }
}
```

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/cMygQxx8t1IsI1lLr/builds/K1UUt4zoEp0QAWvh3/openapi.json
