# PDF Procurement Document Extractor (`kondasviktor/pdf-procurement-document-extractor`) Actor

Find and extract procurement-related PDFs from company websites: certificates, annual/assurance reports, datasheets, and price lists. Ideal for supplier shortlist prep across CEE/EU.

- **URL**: https://apify.com/kondasviktor/pdf-procurement-document-extractor.md
- **Developed by:** [Viktor Kondas](https://apify.com/kondasviktor) (community)
- **Categories:** Automation, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 procurement document saveds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## PDF Procurement Document Extractor

**PDF scraper for procurement docs** — find and extract certificates, annual reports, datasheets, and price lists from company websites across CEE/EU.

Standalone Apify actor for supplier shortlist prep across CEE/EU. Pairs well with the [Google Maps CEE Scraper — Supplier Shortlist](https://apify.com/kondasviktor/google-maps-cee-scraper) and [Website Intelligence + Contact Extractor](https://apify.com/kondasviktor/website-intelligence-contact-extractor) when you already have company websites.

**Optional next step after Maps / Website Intel:** feed `website` URLs into this actor to surface procurement PDFs (ISO certs, reports, datasheets).

### What it does

- Crawls a company site or downloads/investor page for **PDF links**.
- Follows download-like paths (`/downloads`, `/dokumentumok`, `/publications`, `/investor`, `/quality`, …).
- Downloads each PDF (capped) and **extracts text** (no OCR at launch).
- Classifies documents: certificate, assurance/annual report, datasheet, price list, catalog, policy.
- Detects **ISO hints** (9001, 14001, 45001, 27001, …) from filename + text.
- Skips full text extract for oversized PDFs (metadata still saved) so Store QA stays fast.
- Built for **n8n**, **Make**, **Zapier**, and vibe-coder agent workflows.

### Who it's for

1. **Procurement teams** collecting supplier certificates and reports before outreach.
2. **Sales / channel teams** mining price lists and catalogs from brand sites.
3. **Agencies** running document discovery for client shortlists.
4. **Vibe coders** wiring website → PDF evidence into CRM / n8n / Make / Zapier.
5. **Market researchers** auditing public compliance document footprints.

### What this actor is — and is not

This actor helps you **discover and extract public PDF evidence**. It does **not** verify certificate authenticity, accreditation status, or document legal validity.

Use the output for:

- supplier document discovery
- shortlist preparation
- compliance evidence collection

Do **not** use it as the sole basis for vendor qualification or contract award.

### What data you get

| Field | Description |
|-------|-------------|
| `sourceWebsite` | Input website / start URL |
| `pdfUrl`, `fileName`, `documentTitle` | Document identity |
| `documentType` | `certificate`, `assurance_report`, `annual_report`, `datasheet`, `price_list`, `catalog`, `policy`, `other` |
| `isCertificate`, `isPriceList`, `isDatasheet`, `isAnnualReport` | Boolean flags |
| `isoHints` | Detected ISO labels when present |
| `pageCount`, `byteSize` | PDF metadata when extracted |
| `textExcerpt` | Truncated extracted text |
| `foundOnPage` | HTML page where the link was discovered |
| `scrapedAt`, `error` | Provenance / skip or failure notes |

### How to use it

1. **Configure input** — website or downloads URL, max PDFs, extract text, proxy.
2. **Run** on Apify cloud (recommended) or locally with `apify run`.
3. **Download** dataset as JSON, CSV, or Excel from the run page.

### Input presets

#### MOL Group annual & assurance PDFs (Store / QA example)

```json
{
  "websites": ["https://www.molgroup.info/en/investor-relations/annual-reports"],
  "maxDocuments": 3,
  "maxPagesPerSite": 3,
  "extractText": true,
  "maxTextChars": 3000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

Store input **prefill** uses this small cap so Apify automated QA finishes within 5 minutes. For production, raise `maxDocuments` (e.g. 20–100).

Published Store example: [MOL Group annual & assurance PDFs — procurement docs](https://apify.com/kondasviktor/pdf-procurement-document-extractor/examples/mol-group-annual-assurance-pdfs-procurement-docs).

#### After Google Maps / Website Intel

```json
{
  "websites": [
    "https://example-supplier.hu/downloads",
    "https://example-manufacturer.ro/dokumentumok"
  ],
  "maxDocuments": 20,
  "maxPagesPerSite": 8,
  "extractText": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### Link discovery only (no text extract)

```json
{
  "websites": ["https://www.molgroup.info/en/investor-relations/annual-reports"],
  "maxDocuments": 10,
  "extractText": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Output example

```json
{
  "sourceWebsite": "https://www.molgroup.info/en/investor-relations/annual-reports",
  "pdfUrl": "https://molgroup.info/en/show/publications/annual_reports/2025/mol-csrd-limited-assurance-report-eng-2025.pdf",
  "fileName": "mol-csrd-limited-assurance-report-eng-2025.pdf",
  "documentTitle": "mol csrd limited assurance report eng 2025",
  "documentType": "assurance_report",
  "isCertificate": false,
  "isPriceList": false,
  "isDatasheet": false,
  "isAnnualReport": false,
  "isoHints": [],
  "pageCount": 5,
  "byteSize": 387120,
  "textExcerpt": "Limited assurance …",
  "foundOnPage": "https://www.molgroup.info/en/investor-relations/annual-reports",
  "scrapedAt": "2026-07-20T09:30:00.000Z",
  "error": null
}
```

### Proxy, size limits, and blocked sites

| Feature | Support |
|---------|---------|
| **Apify Proxy RESIDENTIAL** | Recommended for bot-walled corporate sites |
| **Browser fallback** | Used when HTML HTTP fails |
| **Oversized PDFs** | Metadata saved; text extract skipped above `maxPdfBytes` (default 2.5 MB) |
| **No OCR** | Scanned image-only PDFs may return empty `textExcerpt` |

**Tips to avoid Store QA timeouts**

- Keep prefill / public-task demos at **`maxDocuments: 3`**.
- Prefer a downloads/investor page with a few mid-size PDFs over a mega catalog portal.
- Raise caps only for paid production runs.

### Secrets and local development

- **Never commit** `apify/pdf-procurement-document-extractor/.env` — it is listed in `.gitignore`.
- **`apify push` excludes** `.env` via `.gitignore` and `.actorignore`.
- **Docker builds exclude** `.env` via `.dockerignore`.
- On Apify cloud, customers configure **Proxy** via input — not from your local `.env`.
- For local runs only, copy `.env.example` → `.env` and add `APIFY_TOKEN` if you call the platform.
- Only `.env.example` (placeholders, no real keys) is in git.

### FAQ

**How is this different from a generic PDF-to-text actor?**\
This actor **discovers** PDFs on company sites and adds **procurement classification flags** (certs, reports, datasheets, ISO hints) — not only raw text dump.

**Does it work outside CEE?**\
Yes. Marketing ICP is CEE/Europe; any public website with PDF links can work.

**Do I need an LLM key?**\
No. Classification is deterministic keyword/heuristic. No Apify AI event fee.

**Why was text skipped on a large annual report?**\
`maxPdfBytes` protects run time. Metadata is still saved; raise the limit for production if you need full text.

**How many PDFs can I get per run?**\
Up to **200** (`maxDocuments`). Prefill/demo stays at **3**.

**How do I extract certificates or price-list PDFs from a supplier site?**\
Pass company `websites` (homepage or downloads/investor page). The Actor discovers PDF links and flags certs, reports, datasheets, and price lists.

### Local development

```bash
cd apify/pdf-procurement-document-extractor
npm install
npm test
npm run build
npm run dry-run
apify run --input-file=INPUT.smoke.json
```

Dry run defaults to MOL Group annual reports with 3 PDFs. Install Playwright Chromium once for local browser fallback: `npx playwright install chromium`.

### Pricing

Pay-per-event: **$5.00 per 1,000 document records** (`document` event @ `$0.005`), minimum charge **$0.10** per run.

Enable **Pay per event + usage** in Apify Console so platform compute/proxy costs are passed through to users.

### Related actors (suite)

| Actor | Role |
|-------|------|
| [Google Maps CEE Scraper — Supplier Shortlist](https://apify.com/kondasviktor/google-maps-cee-scraper) | Discover local suppliers |
| [Website Intelligence + Contact Extractor](https://apify.com/kondasviktor/website-intelligence-contact-extractor) | Enrich websites (contacts, tech, compliance) |
| [Dealer / Distributor Locator Extractor](https://apify.com/kondasviktor/dealer-distributor-locator) | Expand brand locator pages |
| **PDF Procurement Document Extractor** (this Actor) | Find certs / reports / datasheets |
| [Website Change Monitor — Diff Tracker](https://apify.com/kondasviktor/website-change-monitor) | Watch pages for changes |
| [European Fuel Station Prices API (CEE + DACH)](https://apify.com/kondasviktor/cee-dach-fuel-intelligence) | CEE + DACH station fuel prices |

Each Actor runs standalone; use them as an optional suite when chaining discovery → enrichment → monitoring → fuel intelligence.

### Feedback

Open an issue on the actor’s Apify page or contact [Vibe Coder's Life](https://vibecoderslife.com/#contact).

# Actor input Schema

## `websites` (type: `array`):

Company websites or downloads/dokumentumok/investor pages. Prefill is QA-safe (MOL Group annual reports, max 3 PDFs).

## `maxDocuments` (type: `integer`):

Hard cap per run. Prefill stays at 3 so Apify Store QA finishes under 5 minutes. Raise for production (e.g. 20–100).

## `maxPagesPerSite` (type: `integer`):

How many HTML pages to visit while discovering PDF links (start URL + download-like pages).

## `extractText` (type: `boolean`):

Download each PDF and extract text (no OCR). Disable for link discovery only.

## `maxTextChars` (type: `integer`):

Truncate extracted text per PDF to keep runs fast.

## `maxPdfBytes` (type: `integer`):

Still save metadata for large PDFs, but skip full text extract when Content-Length exceeds this (default 2.5 MB).

## `requestTimeoutSecs` (type: `integer`):

HTTP timeout per page or PDF fetch.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy RESIDENTIAL when sites block datacenter IPs.

## Actor input object example

```json
{
  "websites": [
    "https://www.molgroup.info/en/investor-relations/annual-reports"
  ],
  "maxDocuments": 3,
  "maxPagesPerSite": 3,
  "extractText": true,
  "maxTextChars": 3000,
  "maxPdfBytes": 2621440,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `dataset` (type: `string`):

No description

# 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 = {
    "websites": [
        "https://www.molgroup.info/en/investor-relations/annual-reports"
    ],
    "maxDocuments": 3,
    "maxPagesPerSite": 3,
    "extractText": true,
    "maxTextChars": 3000,
    "maxPdfBytes": 2621440
};

// Run the Actor and wait for it to finish
const run = await client.actor("kondasviktor/pdf-procurement-document-extractor").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 = {
    "websites": ["https://www.molgroup.info/en/investor-relations/annual-reports"],
    "maxDocuments": 3,
    "maxPagesPerSite": 3,
    "extractText": True,
    "maxTextChars": 3000,
    "maxPdfBytes": 2621440,
}

# Run the Actor and wait for it to finish
run = client.actor("kondasviktor/pdf-procurement-document-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "websites": [
    "https://www.molgroup.info/en/investor-relations/annual-reports"
  ],
  "maxDocuments": 3,
  "maxPagesPerSite": 3,
  "extractText": true,
  "maxTextChars": 3000,
  "maxPdfBytes": 2621440
}' |
apify call kondasviktor/pdf-procurement-document-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kondasviktor/pdf-procurement-document-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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