# Supplier Quote Comparison: PDF & JSON | QuoteCheck (`vic0419/supplier-quote-comparison-pdf-json-quotecheck`) Actor

Compare supplier quotes from PDFs or JSON. Detect price, quantity, missing-item and commercial-term differences, calculate like-for-like normalized totals, and return structured JSON with review flags and source evidence for AI agents, procurement workflows and automations.

- **URL**: https://apify.com/vic0419/supplier-quote-comparison-pdf-json-quotecheck.md
- **Developed by:** [Vikram Allmo](https://apify.com/vic0419) (community)
- **Stats:** 2 total users, 1 monthly users, 90.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

## Supplier Quote Comparison: PDF & JSON | QuoteCheck

Compare supplier quotes and return structured price, quantity and exception data for purchasing workflows and AI agents.

### Try a comparison

Use structured JSON for a first run. Leave **Supplier quote file stores** empty, then use the prefilled **Structured supplier quotes** field. When calling the API, send the complete object below.

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

The sample compares ten identical laptops in GBP. Supplier A totals £11,500; Supplier B totals £10,950, a £550 difference.

Expected result excerpt:

```json
{
  "status": "comparable",
  "review_required": false,
  "supplier_totals": {
    "Supplier A": 11500.0,
    "Supplier B": 10950.0
  },
  "totals_comparable": true,
  "lowest_total_supplier": "Supplier B"
}
```

The full result also includes matched items, price differences, decision flags and other comparison fields. The example input and full expected output are in `examples/input.json` and `examples/output.json` in the source repository. This example was verified locally; it is not a claim of a live customer run.

### Compare PDF quotes

Store at least two text-based quote PDFs in Apify Key-Value Stores and select those stores in **Supplier quote file stores**. This mode takes priority over structured JSON when both are supplied.

QuoteCheck extracts embedded text and attempts to identify line items and commercial terms. Scanned PDFs without text are rejected and require OCR before use. Layout support is limited; inspect extraction results before relying on a new document layout.

### What the result contains

- Matched items and suppliers missing from each group.
- Unit-price and quantity differences.
- Supplier totals and a lowest-total supplier when comparison checks pass.
- Like-for-like estimates for differing quantities when sufficient data exists.
- Commercial-term differences and validation warnings.
- `review_required` and `decision_flags` for downstream routing.

### Input and interpretation

Use distinct supplier names, positive quantities and finite, non-negative unit prices. Include an explicit `currency` such as `GBP`, `EUR` or `USD` for every structured quote. Currency conversion is not performed. Numeric-only inputs without currency assume a common currency and disclose that assumption.

Totals that differ from the item arithmetic require review, including legitimate adjustments for tax, shipping or discounts. Resolve warnings before choosing a supplier. `review_required: false` means the implemented checks passed; it does not guarantee complete PDF extraction or commercial equivalence.

Quantity normalization applies each quoted unit price to the largest quoted quantity for that item. It is an estimate, not a binding supplier offer or a volume-discount calculation.

### API and AI-agent workflows

Input: supplier quotes as JSON or text-based PDFs in Apify storage.

Output: structured JSON in the default dataset and the `OUTPUT` key-value record.

Use this operation in supplier quote comparison, RFQ comparison, procurement automation and purchasing workflows. Eligible Actors can be accessed through Apify's existing MCP server; clients must configure their own Apify access. QuoteCheck does not need a separate MCP server.

# 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",
      "currency": "GBP",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1150
        }
      ]
    },
    {
      "supplier": "Supplier B",
      "currency": "GBP",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1095
        }
      ]
    }
  ]
}
```

# 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": "Supplier A",
            "currency": "GBP",
            "items": [
                {
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1150
                }
            ]
        },
        {
            "supplier": "Supplier B",
            "currency": "GBP",
            "items": [
                {
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1095
                }
            ]
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vic0419/supplier-quote-comparison-pdf-json-quotecheck").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": "Supplier A",
            "currency": "GBP",
            "items": [{
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1150,
                }],
        },
        {
            "supplier": "Supplier B",
            "currency": "GBP",
            "items": [{
                    "description": "Dell Latitude 7450",
                    "quantity": 10,
                    "unit_price": 1095,
                }],
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vic0419/supplier-quote-comparison-pdf-json-quotecheck").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": "Supplier A",
      "currency": "GBP",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1150
        }
      ]
    },
    {
      "supplier": "Supplier B",
      "currency": "GBP",
      "items": [
        {
          "description": "Dell Latitude 7450",
          "quantity": 10,
          "unit_price": 1095
        }
      ]
    }
  ]
}' |
apify call vic0419/supplier-quote-comparison-pdf-json-quotecheck --silent --output-dataset

```

## MCP server setup

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

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/UX5jOe5pbWH2hdgMw/openapi.json
