PDF Operations Toolkit avatar

PDF Operations Toolkit

Pricing

from $33.50 / 1,000 pdf operations toolkit verdicts

Go to Apify Store
PDF Operations Toolkit

PDF Operations Toolkit

Runs split / merge / reorder / compress / rasterize on supplied PDFs and returns, per operation, a manifest that RECONCILES every input page to an output page (no silent page loss) plus per-artifact SHA-256, a byte-size delta, and warnings.

Pricing

from $33.50 / 1,000 pdf operations toolkit verdicts

Rating

0.0

(0)

Developer

NexGen Watch

NexGen Watch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

πŸ”” PDF Operations Toolkit

Runs split / merge / reorder / compress / rasterize on supplied PDFs and returns, per operation, a manifest that RECONCILES every input page to an output page (no silent page loss) plus per-artifact SHA-256, a byte-size delta, and warnings. Output artifacts are written to the run key-value store.

Output is one pdf_operation_manifest row per result; billing is pay-per-event, the value event being one pdf operations toolkit verdict (a $0.02 start fee per run, then $0.05 per pdf operations toolkit verdict).

πŸ“Š Sample Output

PDF Operations Toolkit sample output β€” a table of real pdf operations toolkit verdict rows (op, input_count, input_refs, input_page_total) from run XQX7oXdZwFqBEfIi2 on build 0.1.7

Real rows from run XQX7oXdZwFqBEfIi2 on build 0.1.7 (2026-09-23), the same input as the Quick start below β€” every value is as the source published it (emails masked, long text shortened):

opinput_countinput_refsinput_page_totaloutput_keysinput
split1["input#1"]1["op-0-split_1_p1-1.pdf"]split(1 input)

The run finished with the status message: 1 operation(s): 1 reconciled+charged, 0 unbilled (rejected/unparseable) | pdf_operation_check charged=1

βœ… What you get

Each row is flat JSON with these fields (from the dataset schema and the sample run; a field the source does not publish for a given row is null):

  • op (string/null) β€” e.g. split
  • input_count (integer/string/null) β€” e.g. 1
  • input_refs (string/null) β€” e.g. ["input#1"]
  • input_page_total (integer/string/null) β€” e.g. 1
  • input_sha256s (string/null) β€” e.g. ["6e715f3379ddd76474e028a15c79cb7d46bbd2023b628e430cd90ff9fcbb32b4"]
  • output_count (integer/string/null) β€” e.g. 1
  • output_keys (string/null) β€” e.g. ["op-0-split_1_p1-1.pdf"]
  • output_page_total (integer/string/null) β€” e.g. 1
  • output_sha256s (string/null) β€” e.g. ["6b9397f4030c7338c8eb8c21e360f6924853d17c59fa84ff63cb5721ee851ad9"]
  • page_map (string/null) β€” e.g. [{"output":"split_1_p1-1.pdf","output_page":1,"input_ref":"input#1","input_page"
  • pages_reconciled (boolean/null) β€” e.g. True
  • size_delta_bytes (integer/string/null) β€” e.g. 195
  • active_content_flags (string/null) β€” null in every sample row
  • warnings (string/null) β€” null in every sample row
  • faults (string/null) β€” null in every sample row
  • record_type (string) β€” e.g. pdf_operation_manifest
  • source (string/null) β€” e.g. buyer-supplied PDFs (base64 / data: URL / key-value-store keys)
  • outcome (string/null) β€” e.g. answer
  • input (string/null) β€” e.g. split(1 input)
  • outcome_reason (string/null) β€” null in every sample row
  • observed_at (string/null) β€” null in every sample row
  • terminal (string/null) β€” null in every sample row

Output & billing

One row per operation. An operation bills once if it completes AND its page map fully reconciles input pages to output (no silent loss). A guard rejection (oversized / encrypted / corrupted / bad op) or an operation that would drop pages is delivered as an unbilled rejected status. Push-then-charge: every row is delivered before its charge, so a billing hiccup can only ever undercharge.

βš™οΈ Sample inputs

1. Quick start β€” the Store example (this is what the sample above came from)

{
"operations": [
{
"op": "split",
"inputs": [
"data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PgplbmRvYmoKMiAwIG9iago8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PgplbmRvYmoKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA2MTIgNzkyXS9SZXNvdXJjZXM8PD4+Pj4KZW5kb2JqCnhyZWYKMCA0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDU0IDAwMDAwIG4gCjAwMDAwMDAxMDUgMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDQvUm9vdCAxIDAgUj4+CnN0YXJ0eHJlZgoxODQKJSVFT0Y="
],
"params": {
"ranges": [
[
1,
1
]
]
}
}
],
"maxBytes": 52428800,
"maxPages": 1000,
"rasterizeDpi": 150,
"userAgent": "Mozilla/5.0 (compatible; NexGenWatchBot/1.0; +https://apify.com/nexgenwatch)"
}

The sample run charged exactly: 2 Γ— $0.02 apify-actor-start + 1 Γ— $0.05 pdf_operation_check = $0.09 on the Free tier β€” every delivered row was billed.

2. A smaller, narrowed run

{
"operations": [
{
"op": "split",
"inputs": [
"data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PgplbmRvYmoKMiAwIG9iago8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PgplbmRvYmoKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA2MTIgNzkyXS9SZXNvdXJjZXM8PD4+Pj4KZW5kb2JqCnhyZWYKMCA0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDU0IDAwMDAwIG4gCjAwMDAwMDAxMDUgMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDQvUm9vdCAxIDAgUj4+CnN0YXJ0eHJlZgoxODQKJSVFT0Y="
],
"params": {
"ranges": [
[
1,
1
]
]
}
}
],
"maxBytes": 52428800,
"maxPages": 1000,
"rasterizeDpi": 150,
"userAgent": "Mozilla/5.0 (compatible; NexGenWatchBot/1.0; +https://apify.com/nexgenwatch)"
}

A bounded run for checking the field shape before scheduling. userAgent narrows what the source is asked for.

3. A full-size run

{
"operations": [
{
"op": "split",
"inputs": [
"data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PgplbmRvYmoKMiAwIG9iago8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PgplbmRvYmoKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL01lZGlhQm94WzAgMCA2MTIgNzkyXS9SZXNvdXJjZXM8PD4+Pj4KZW5kb2JqCnhyZWYKMCA0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDU0IDAwMDAwIG4gCjAwMDAwMDAxMDUgMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDQvUm9vdCAxIDAgUj4+CnN0YXJ0eHJlZgoxODQKJSVFT0Y="
],
"params": {
"ranges": [
[
1,
1
]
]
}
}
],
"maxBytes": 52428800,
"maxPages": 1000,
"rasterizeDpi": 150,
"userAgent": "Mozilla/5.0 (compatible; NexGenWatchBot/1.0; +https://apify.com/nexgenwatch)"
}

The same input run on a schedule; each run is billed only for what it delivers.

🧾 JSON sample record

One real record from run XQX7oXdZwFqBEfIi2, exactly as it lands in the dataset (emails masked, long text shortened):

{
"op": "split",
"input_count": 1,
"input_refs": "[\"input#1\"]",
"input_page_total": 1,
"input_sha256s": "[\"6e715f3379ddd76474e028a15c79cb7d46bbd2023b628e430cd90ff9fcbb32b4\"]",
"output_count": 1,
"output_keys": "[\"op-0-split_1_p1-1.pdf\"]",
"output_page_total": 1,
"output_sha256s": "[\"6b9397f4030c7338c8eb8c21e360f6924853d17c59fa84ff63cb5721ee851ad9\"]",
"page_map": "[{\"output\":\"split_1_p1-1.pdf\",\"output_page\":1,\"input_ref\":\"input#1\",\"input_page\":1}]",
"pages_reconciled": true,
"size_delta_bytes": 195,
"active_content_flags": null,
"warnings": null,
"faults": null,
"record_type": "pdf_operation_manifest",
"source": "buyer-supplied PDFs (base64 / data: URL / key-value-store keys)",
"outcome": "answer",
"input": "split(1 input)",
"outcome_reason": null
}

πŸ”§ How it works

Transport. Plain HTTPS from the Apify platform, no proxy. robots.txt is read first and a disallowed path is never fetched. Every request carries an identified contact User-Agent.

Terminal states. A run ends NORMAL, CAPPED (your cap was reached), PARTIAL (something was withheld and the message says what), GENUINE_EMPTY (the source was read and truly had nothing in scope) or BLOCKED (the source refused or changed shape β€” the run FAILS loud and bills nothing). A zero-row run is never reported as a silent success.

Charging. Each pdf operations toolkit verdict is charged at the moment it is pushed (pdf_operation_check); a row that fails to charge is not delivered, so the dataset count always equals the charged count.

What you submit

operations β€” pdf operations. Each operation is an object: {op, inputs, params}. op is split | merge | reorder | compress | rasterize. inputs is a list of PDFs, each a base64 string (optionally a data: URL) or a key naming an entry in the run key-value store. Every completed operation emits a manifest that RECONCILES input pages to output pages (no silent page loss), with per-artifact SHA-256, byte-size delta, and warnings; output artifacts are written to the run key-value store. Untrusted-file guards: byte-size and page ceilings, a decompression-bomb guard, encrypted/corrupted inputs rejected loudly, and embedded JavaScript / auto-actions reported as warnings, never executed. One charge per completed, reconciled operation.

Untrusted-file guards

Every input PDF is treated as untrusted: a per-file byte-size cap and a page cap reject oversized inputs before work, a decompression-bomb guard applies, encrypted and corrupted PDFs are rejected loudly, and embedded JavaScript / auto-actions (/JavaScript, /JS, /OpenAction, /Launch, /AA) are reported as warnings, never executed.

Why this and not the obvious alternative

split / merge / reorder / compress / rasterize with a page-map that reconciles every input page to an output page (no silent loss) plus per-artifact hashes and a size-delta ledger β€” an evidence-grade PDF operations toolkit, not a black-box converter.

What is not done. No login, no cookie or CAPTCHA bypass, no private or personal-account data, no browser automation.

πŸ’° Pricing example

EventFreeBronzeSilverGold
Actor Start (apify-actor-start)$0.02$0.02$0.02$0.02
PDF Operations Toolkit verdict (pdf_operation_check)$0.05$0.04$0.04$0.03

Worked at the live Free-tier price:

  • 1 pdf operations toolkit verdicts: $0.02 start + 1 Γ— $0.05 = $0.07
  • 25 pdf operations toolkit verdicts: $0.02 start + 25 Γ— $0.05 = $1.27
  • 100 pdf operations toolkit verdicts: $0.02 start + 100 Γ— $0.05 = $5.02

A run that delivers zero rows charges the $0.02 start fee only. A BLOCKED run (source refused) fails loud and charges no value event. The start fee is charged once per GB of run memory; the default run memory is 4096 MB.

Yield on the sample run: 1 operation(s): 1 reconciled+charged, 0 unbilled (rejected/unparseable) | pdf_operation_check charged=1.

This actor reads public data only. It collects only what the source publishes to any visitor, keeps to the source's robots rules (checked on every run), identifies itself with a contact User-Agent, and does not access accounts, private data or anything behind authentication. Use the output in line with the source's terms and your local law; the intended use is B2B research and monitoring.

❓ FAQ

Q: Do I need an API key or a login?
A: No. the input schema has no key field and the actor carries no secrets.

Q: Why did my run return 0 rows?
A: Read the run's status message. GENUINE_EMPTY means the source was read and had nothing in scope for your input; BLOCKED means the source refused and the run failed without billing a value event β€” retry later or narrow the input. A zero-row run bills the start fee only.

Q: How fresh is the data?
A: Every run reads the source live at run time; nothing is cached between runs. Put it on a schedule for a continuous feed.

Q: What formats can I export?
A: The dataset downloads as JSON, CSV, Excel, XML or RSS from the run's Dataset tab or the Apify API, and any run can push to a webhook or integration.

Q: How is this different from the other NexGen Watch actors actors?
A: Same output shape and billing model; this one covers PDF Operations Toolkit. The siblings under Related Actors cover the other sources or slices β€” run several on one schedule for a combined feed.

Q: Are there rate limits?
A: The actor paces itself against the source and honours its robots rules; there is no per-buyer limit beyond your Apify plan's concurrency.

πŸ†˜ Troubleshooting

  • Run FAILED with BLOCKED β†’ the source refused the request or changed its page shape β†’ nothing was billed beyond the start fee; retry after a while, and if it persists open an Issue with the run id.
  • Fewer rows than expected β†’ the source had fewer items in scope β†’ widen the input.
  • Input validation error on start β†’ a field is outside the schema's allowed values β†’ start from the Quick start block and change one field at a time.
  • Run TIMED-OUT β†’ a very wide request on a slow day β†’ raise the run timeout in Run options or narrow the input; what was delivered before the timeout is still in the dataset.
  • OpenAlex Topic Taxonomy β€” same family, different source
  • Open Library Book Edition Master β€” same family, different source
  • Oregon Active Businesses Master β€” One structured registryrecord per record from the official public source, logged-out. Public, robots-honoured
  • Philadelphia L&I Business Licenses β€” One structured registryrecord per record from the official public source, logged-out. Public, robots-honoured
  • Poland KRS Company Registry β€” One structured registryrecord per record from the keyless api-krs.ms.gov.pl current-extract JSON (OdpisAktualny), logged-out. Public, logged-out, rob…
  • Poland VAT Whitelist Verifier β€” One verdict per queried identifier against Poland's official Ministry of Finance VAT whitelist (Wykaz podatnikΓ³w VAT) β€” ACTIVE / EXEMPT / NOT_ACTIVE…
  • 🏒 About NexGenData β€” NexGen Watch is NexGenData's fleet of 256 public monitoring and lookup actors built on official sources, pay-per-result. Browse the catalog at apify.com/nexgenwatch.

⭐ Found this useful?

If this actor saved you a manual check, a quick review on the Apify Store helps other teams find it. Feature request or a source that changed? Open it from the Issues tab β€” every one is read.