The paperwork API

One REST API for extraction, parsing, fill, forms, and e-signature, for platform teams shipping document workflows, and engineering teams tired of maintaining a parsing stack in-house.

  • 15K free credits
  • No credit card required
  • Flexible plans
The full-flow proof

Intake to signature in three calls

Extract grounded fields, fill the form, send it for signature. Copy it, paste it, run it against the real API.

import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

// 1 - Extract the fields you need, grounded to the source
const data = await client.extract({
  body: {
    file: { url: "https://www.irs.gov/pub/irs-pdf/fw9.pdf" },
    schema: {
      type: "object",
      properties: {
        business_name: { type: ["string", "null"] },
        tax_classification: { type: ["string", "null"] },
      },
    },
    citations: true,
  },
});

// 2 - Fill the template from your source documents
const filled = await client.fill({
  body: {
    template: { url: "https://www.irs.gov/pub/irs-pdf/fw9.pdf", name: "w9.pdf" },
    files: [{ id: "a04d6597-4e34-4a99-94ea-964c289a4c68" }],
    instructions: "Use the legal entity name, not the trade name.",
  },
});

// 3 - Send the result out for signature
const run = await client.sign({
  body: {
    file: { url: filled.output?.file?.url },
    signers: [{ name: "Jane Doe", email: "jane@example.com" }],
    message: "Please sign the completed W-9.",
  },
});
console.log(run.status); // "needs_input" - signers get emailed their links
from cloudraker import (
    V1FillBodyFilesItemId,
    V1FillBodyTemplateName,
    V1SignBodyFileName,
    V1SignBodySignersItem,
)
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

# 1 - Extract the fields you need, grounded to the source
data = client.extract(
    file={"url": "https://www.irs.gov/pub/irs-pdf/fw9.pdf"},
    schema={
        "type": "object",
        "properties": {
            "business_name": {"type": ["string", "null"]},
            "tax_classification": {"type": ["string", "null"]},
        },
    },
    citations=True,
)

# 2 - Fill the template from your source documents
filled = client.fill(
    template=V1FillBodyTemplateName(url="https://www.irs.gov/pub/irs-pdf/fw9.pdf", name="w9.pdf"),
    files=[V1FillBodyFilesItemId(id="a04d6597-4e34-4a99-94ea-964c289a4c68")],
    instructions="Use the legal entity name, not the trade name.",
)

# 3 - Send the result out for signature
run = client.sign(
    file=V1SignBodyFileName(url=filled.output.file.url),
    signers=[V1SignBodySignersItem(name="Jane Doe", email="jane@example.com")],
    message="Please sign the completed W-9.",
)
print(run.status)  # "needs_input" - signers get emailed their links

Every capability is one call away

Real calls from the official SDKs — pip install cloudraker, npm install @cloudraker/api. Call them individually or combine them to build end-to-end paperwork workflows.

import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

// Split a PDF into one file per page
const pages = await client.tools.splitFilePages({
  ref: "file_01JQ8ZKMRT4V6WXYZ0ABCDEF",
});

for (const page of pages.data) {
  console.log(page.id, page.name); // invoice.p1.pdf, invoice.p2.pdf, ...
}
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

# Split a PDF into one file per page
pages = client.tools.split_file_pages(
    ref="file_01JQ8ZKMRT4V6WXYZ0ABCDEF",
)

for page in pages.data:
    print(page.id, page.name)  # invoice.p1.pdf, invoice.p2.pdf, ...
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.parse({
  body: {
    file: { url: "https://www.irs.gov/pub/irs-pdf/fw9.pdf", name: "w9.pdf" },
  },
  output: "inline",
});

console.log(run.output?.markdown); // clean markdown, straight from the PDF
from cloudraker import V1ParseBodyFileName
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.parse(
    file=V1ParseBodyFileName(url="https://www.irs.gov/pub/irs-pdf/fw9.pdf", name="w9.pdf"),
    output="inline",
)

print(run.output.markdown)  # clean markdown, straight from the PDF
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.extract({
  body: {
    file: { url: "https://example.com/inbound-document.pdf" },
    schema: {
      type: "object",
      properties: {
        document_type: {
          type: ["string", "null"],
          enum: ["invoice", "contract", "receipt", "tax_form", null],
        },
      },
    },
  },
});

console.log(run.output?.value);
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.extract(
    file={"url": "https://example.com/inbound-document.pdf"},
    schema={
        "type": "object",
        "properties": {
            "document_type": {
                "type": ["string", "null"],
                "enum": ["invoice", "contract", "receipt", "tax_form", None],
            }
        },
    },
)

print(run.output.value)
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.extract({
  body: {
    file: { url: "https://www.irs.gov/pub/irs-pdf/fw9.pdf" },
    schema: {
      type: "object",
      properties: {
        business_name: { type: ["string", "null"] },
        tax_classification: { type: ["string", "null"] },
      },
    },
    citations: true,
  },
});
console.log(run.output?.value);
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.extract(
    file={"url": "https://www.irs.gov/pub/irs-pdf/fw9.pdf"},
    schema={
        "type": "object",
        "properties": {
            "business_name": {"type": ["string", "null"]},
            "tax_classification": {"type": ["string", "null"]},
        },
    },
    citations=True,
)
print(run.output.value)
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.redact({
  body: {
    file: { url: "https://example.com/w9.pdf" },
    categories: ["ssn", "ein"],
    mode: "targeted",
  },
});

console.log(run.output.files[0].url); // the redacted PDF
from cloudraker import V1RedactBodyFileName
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.redact(
    file=V1RedactBodyFileName(url="https://example.com/w9.pdf"),
    categories=["ssn", "ein"],
    mode="targeted",
)

print(run.output.files[0].url)  # the redacted PDF
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.fill({
  body: {
    template: { url: "https://www.irs.gov/pub/irs-pdf/fw9.pdf", name: "w9.pdf" },
    files: [{ id: "a04d6597-4e34-4a99-94ea-964c289a4c68" }],
    instructions: "Use the legal entity name, not the trade name.",
  },
});

console.log(run.status, run.output?.file?.url);
from cloudraker import V1FillBodyFilesItemId, V1FillBodyTemplateName
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.fill(
    template=V1FillBodyTemplateName(url="https://www.irs.gov/pub/irs-pdf/fw9.pdf", name="w9.pdf"),
    files=[V1FillBodyFilesItemId(id="a04d6597-4e34-4a99-94ea-964c289a4c68")],
    instructions="Use the legal entity name, not the trade name.",
)

print(run.status, run.output.file.url)
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

await client.compose.create({
  template: "invoice",
  data: { customer: "Acme Manufacturing Co.", number: "0042", total: 1240 },
});
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

client.compose.create(
    template="invoice",
    data={"customer": "Acme Manufacturing Co.", "number": "0042", "total": 1240},
)
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

// Convert a registered Word doc into a PDF
const pdf = await client.tools.convertFileToPdf({ ref: "msa.docx" });

console.log(pdf.id);
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

# Convert a registered Word doc into a PDF
pdf = client.tools.convert_file_to_pdf(ref="msa.docx")

print(pdf.id)
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const merged = await client.tools.stitchFiles({
  files: ["contract-part1.pdf", "contract-part2.pdf"],
});

console.log(merged.id, merged.name); // contract-part1.merged.pdf
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

merged = client.tools.stitch_files(
    files=["contract-part1.pdf", "contract-part2.pdf"],
)

print(merged.id, merged.name)  # contract-part1.merged.pdf
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

// Open a redlining session on a Word document (tracked changes)
const session = await client.tools.redlineFile({
  ref: "msa.docx", // file id or file name in your corpus
  body: { ttl: 86400 }, // session lifetime in seconds
});

console.log(session.id); // e.g. "rdl_01K9Z6P2R4"
from cloudraker.client import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

# Open a redlining session on a Word document (tracked changes)
session = client.tools.redline_file(
    ref="msa.docx",   # file id or file name in your corpus
    ttl=86400,        # session lifetime in seconds
)

print(session.id)  # e.g. "rdl_01K9Z6P2R4"
import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.sign({
  body: {
    file: { url: "https://example.com/msa.pdf" },
    signers: [{ name: "Jane Doe", email: "jane@example.com" }],
    message: "Please sign the master services agreement.",
  },
});
console.log(run.status); // "needs_input" — signers get emailed their links
from cloudraker.client import CloudRaker
from cloudraker import V1SignBodySignersItem, V1SignBodyFileName

client = CloudRaker(token="YOUR_API_KEY")

run = client.sign(
    file=V1SignBodyFileName(url="https://example.com/msa.pdf"),
    signers=[
        V1SignBodySignersItem(name="Jane Doe", email="jane@example.com"),
    ],
    message="Please sign the master services agreement.",
)
print(run.status)  # "needs_input" — signers get emailed their links
Built for enterprise

Ship it past your security team.

Deploy it your way, prove it to the people who have to sign off, and never lose sight of what's running underneath.

Data residency
Choose the region your documents are processed and stored in. By region, not by default.
Bring your own model
Use your own provider keys, pick a preferred model, or run our selection. The API contract stays the same either way.
Deploy anywhere
Our cloud, your cloud, or on-prem — the same endpoints and the same responses in all three.
Every run traced
Capability, duration, credits, status, approvals, and error code, recorded on every single request.
Tenant isolation
Observability is admin-only and organization-scoped. One tenant per token, and the data never crosses over.
SOC 2 Type II
Report on request, with SSO/SAML and full audit and compliance reporting available on Enterprise.
Resources

Everything you need to build

  1. 01

    Developer guide

    Build on CloudRaker. Authenticate, process documents, and automate your workflows over the API.

  2. 02

    API reference

    The CloudRaker gateway API: spaces, files, actions, workflows, objects, and knowledge graphs. One tenant per token.

  3. 03

    Use Cases

    See how CloudRaker automates paperwork across real business processes, from data extraction and document review to forms, signatures, and end-to-end workflows.

  4. 04

    Changelog

    Follow the latest CloudRaker updates, from new capabilities and improvements to fixes and platform changes.

  5. 05

    Blog

    Research, comparisons, news, and insights on paperwork automation, AI, and the technologies shaping how businesses work.

Plans that fit every need.

Free

For developers exploring paperwork automation.

$0
15,000 free credits / month
  • 15,000 credits/mo, no card required
  • All capabilities for 2 weeks
  • 25 requests/min · best effort concurrency
  • Cancel anytime, no contract
  • Email support

Starter

For teams running paperwork workflows.

$30 /mo
30,000 credits / month
  • 30,000 credits/mo + metered overage
  • All capabilities included, with usage limits
  • 25 requests/min · best effort concurrency
  • Month-to-month, 30-day cancellation
  • Email support

Pro

For businesses running multiple workflows.

$500 /mo
500,000 credits / month
  • 500,000 credits/mo + metered overage
  • 100 requests/min, 5× concurrency
  • Month-to-month, 30-day cancellation
  • SOC 2 Type II report on request
  • Guided onboarding + Slack support

Enterprise

For advanced automation needs.

Custom
Custom allocation
  • Volume pricing/multi-year contract
  • Custom rate limits, SLA & data residency
  • Self-hosted or VPC deployment option
  • SSO/SAML + full audit/compliance reporting
  • Dedicated onboarding
Other ways in

The API isn't the only way in.

Same capabilities underneath. Pick whichever surface fits how you work.

Workspace
Run and review the work in CloudRaker itself, with queues, approvals, and history for the whole team.
See the workspace
Get started

Get your API access. No sales call.

Self-serve signup, a working response in a couple minutes, and you're building. No credit card to start. No commitment to keep building.