# Supplier PDF to CSV: customer quick start

Turn supplier price-list PDFs into SKU and price records for catalog review and import.

**[Open Supplier Price List to CSV on Apify](https://apify.com/cory8484/my-actor)**

## Try the fictional demo

Open the Actor, choose JSON input and submit `{}`. Keep the positive maximum run charge at $0.25 or lower. The built-in demo has no product-row charge; your Apify account limits apply.

The validated demo returns three products and one separate review record. Selected product fields are shown below; this table is an excerpt, not the complete export schema.

| SKU | Description | Price | Currency |
| --- | --- | ---: | --- |
| BOLT-001 | Stainless bolt box 50 | 12.50 | USD |
| WASH-002 | Flat washer pack 100 | 8.75 | USD |
| NUT-003 | Locknut pack 100 | 15.00 | USD |

These are fictional products, not a customer's catalog or a claim of universal extraction accuracy.

## Convert your supplier catalog

Use a direct public HTTPS PDF that you have permission to process. The PDF must contain text and tables with visible borders and recognizable SKU, description and price headers. Scanned or borderless PDFs are unsupported.

Paste this JSON, replacing the illustrative URL with your actual PDF link:

```json
{
  "pdfUrls": ["https://your-supplier.example/catalog.pdf"],
  "currency": "USD",
  "numberFormat": "decimal-dot",
  "maxPages": 10,
  "maxRows": 125
}
```

Set maximum run charge to **$0.25**. At the current $0.002 product-row price, that permits at most 125 charged rows. Review rows also count toward `maxRows`, so the number of delivered products can be smaller. A successful run can contain partial output when a limit is reached.

For several catalogs, put up to five URLs in `pdfUrls`. Use either `pdfUrl` or `pdfUrls`, not both. The row limit is shared across the batch. Repeated URLs and identical document bytes are skipped within that run; separate runs process and may charge for the same document again.

## Collect and review the output

After the run succeeds, open its Storage tab:

- **Dataset:** delivered product records, available as JSON or an export.
- **PRODUCTS.csv:** the delivered records with spreadsheet formula protection and document identifiers.
- **REVIEW:** ambiguous or incomplete records that need your attention, with no product-row charge.
- **DOCUMENTS:** batch document outcomes, including failed downloads.
- **SUMMARY:** output counts and whether the budget stopped delivery.

Check the reports before importing. Keep SKU columns as text to preserve leading zeros. This is normalized supplier data; map it to the columns required by your destination system before importing. No Shopify store connection or automatic inventory write is included.

## Copy-and-paste API workflow

Use these requests in your server or an automation tool's HTTP steps. Store your own Apify token in its protected credential field and send it as a Bearer header. Never put your token in a public link. These are request templates; replace the indicated values.

### 1. Start one run

```http
POST https://api.apify.com/v2/actors/cory8484~my-actor/runs?build=latest&maxTotalChargeUsd=0.25&timeout=120&memory=1024
Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json

{"pdfUrls":["https://your-supplier.example/catalog.pdf"],"currency":"USD","numberFormat":"decimal-dot","maxPages":10,"maxRows":125}
```

For the fictional demo, send `{}` as the body instead. Save the returned `data.id` immediately. Disable automatic retries on this POST: if the response is lost, check your Apify runs before submitting again to avoid duplicate paid runs.

### 2. Wait for completion

```http
GET https://api.apify.com/v2/actor-runs/RUN_ID
Authorization: Bearer YOUR_APIFY_TOKEN
```

Replace `RUN_ID` with the saved `data.id`. While the status is nonterminal, check this same run about every 10 seconds. Continue to export only when `data.status` is `SUCCEEDED`. Stop on `FAILED`, `TIMED-OUT` or `ABORTED` and inspect the run. If your workflow times out, keep the ID and resume checking it; do not start another run automatically.

### 3. Download the CSV

Take `data.defaultKeyValueStoreId` from that completed run:

```http
GET https://api.apify.com/v2/key-value-stores/STORE_ID/records/PRODUCTS.csv
Authorization: Bearer YOUR_APIFY_TOKEN
```

Replace `STORE_ID` with that run's store ID and save the response as a CSV file. In the Console, inspect SUMMARY, REVIEW and DOCUMENTS before relying on a scheduled import.

The start/poll/export flow follows Apify's [Run Actor](https://docs.apify.com/api/v2/actors-runs-post), [Get run](https://docs.apify.com/api/v2/actor-run-get), and [Get record](https://docs.apify.com/api/v2/key-value-store-record-get) APIs. Templates were checked against those interfaces and the live Actor's input schema; no extra live run was started to produce this guide.

## Make it recurring

After reviewing a successful conversion, put the same flow behind your automation platform's schedule or supplier-update trigger. Track the supplier document version so unchanged files do not trigger another run unnecessarily. Start with a single supplier and review the first imports before increasing the volume.

Keep the $0.25 run limit until you intentionally choose a larger budget. For example, 1,000 delivered rows have a $2 product-row charge at the current listing price; a $0.25 run cannot deliver all 1,000. Your separate platform/account limits also apply.

## Supported scope and pricing

Up to five PDFs, 10 MiB per PDF, and up to 20 pages per document. The input schema caps candidate rows at 5,000 across the batch. Select the currency stated by the supplier; a dollar sign alone does not determine USD. Decimal dot and decimal comma are explicit options.

Price checked September 14, 2026: **$2 per 1,000 delivered product rows**. Review records, failed documents and the built-in demo have no product-row charge. Verify the [live pricing](https://apify.com/cory8484/my-actor) before use.