Integrations

The reporting layer you don't have to build. Anything that can send an HTTPS request can create a report. Your system sends JSON once; Pressfox checks it, lays it out with your template and hands back a link and a PDF. The docs hold the full reference.

By system: five recipes

The same request each time; only the moment and the event change.

Pick a system

ERP and back office

  1. 1WhenAn order ships or an invoice is posted.
  2. 2SendPOST /api/v1/reports with your invoice template, the record as payload and its number as Idempotency-Key, so a retry never makes two.
  3. 3Backurl and pdf_url. Store them on the record.
  4. 4Listenreport.failed, to flag the record for a person.

CRM

  1. 1WhenA deal closes or an account review is due.
  2. 2SendOne request with the account's figures and your one-pager or review template.
  3. 3BackThe hosted link. Share it with the contacts, one expiring link each.
  4. 4Listenreport.ready, to write the link onto the account.

Inspection and field apps

  1. 1WhenThe inspector submits the checklist.
  2. 2SendThe answers, with photos as https URLs or uploaded first through POST /api/v1/assets.
  3. 3BackThe link, or 422 naming the missing field, so the app can ask the inspector for it.
  4. 4Listenreport.ready, then share it with the customer.

Your own backend

  1. 1WhenAny event your product already has.
  2. 2SendThe same request from any language. Pin a version with template@N so a publish never changes what production sends.
  3. 3Back200 when the render finished within 2.5 seconds, 202 while it is still rendering.
  4. 4Listenreport.ready for the 202 case, report.failed with the reason.

AI agents

  1. 1WhenSomeone asks their assistant for a report.
  2. 2SendThe agent reads the template's contract and calls create_report, which makes the same request.
  3. 3BackThe link, the PDF and a Markdown version the agent can read.
  4. 4ListenNothing new: its reports reach your endpoints like any other API report.
POST /api/v1/reports

The request

One call with a template key and your data. The payload is checked against the template first: a refused payload never becomes a report, you get 422 naming the field.

  • Test keys (pf_test_) make watermarked reports that are free and kept 24 hours, so you can wire everything before going live.
  • Idempotency-Key makes a retry return the same report instead of a second one.
  • PDF password (pdf_password) locks the PDF itself with a password your reader knows, from Standard; the answer says pdf_protected.
  • Verify a document: anyone can check a PDF at /verify, from Standard. The page computes the fingerprint in the browser and asks GET /api/verification/check/{sha256}, which is public and rate limited.
Fields, statuses, errors and full examples
Example language
curl
curl https://api.pressfox.io/api/v1/reports \
  -H "Authorization: Bearer pf_test_…" \
  -H "Content-Type: application/json" \
  -d '{ "template": "clinic-visit-summary",
        "payload": { "patient": { "name": "A. Rivera" } } }'
Node
const res = await fetch("https://api.pressfox.io/api/v1/reports", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PRESSFOX_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ template: "clinic-visit-summary", payload: { patient: { name: "A. Rivera" } } }),
});
const { url, pdf_url } = await res.json();
Python
import os, requests

r = requests.post("https://api.pressfox.io/api/v1/reports",
    headers={"Authorization": f"Bearer {os.environ['PRESSFOX_API_KEY']}"},
    json={"template": "clinic-visit-summary", "payload": {"patient": {"name": "A. Rivera"}}})
print(r.json()["url"], r.json()["pdf_url"])
Response200, shortened
{
  "report_id": "rpt_01j9xk7q4",
  "status": "ready",
  "mode": "test",
  "url": "https://app.pressfox.io/report/k7Qm2Zb9…",
  "pdf_url": "https://app.pressfox.io/report/k7Qm2Zb9…/pdf",
  "pages": 2,
  …
}
Starter and up

Webhooks

Events when a report is ready, fails or is replaced by a corrected version. Payloads carry ids, status, labels and links, never report data.

report.readyreport.failedreport.superseded

Every delivery is signed in the Standard Webhooks format.

A failed delivery is retried after

  1. 1 minute
  2. 5 minutes
  3. 30 minutes
  4. 2 hours
  5. 6 hours
  6. 12 hours
  7. 24 hours

An endpoint failing for 3 days without a single success is disabled; an owner or admin can enable it again once it is fixed, with the same URL and secret.

Webhook reference

Every delivery carries

  • webhook-idThe delivery's id, the same on every retry
  • webhook-timestampWhen it was sent; reject anything more than five minutes off
  • webhook-signatureAn HMAC-SHA256 of the id, timestamp and raw body, with your endpoint's secret

Any Standard Webhooks library can check it. The docs have a verify function to copy.

Verify a delivery

Email shares and your own domain

Email shares Every plan

Send a ready report to up to 50 people. Each gets their own email and their own link, which can be revoked for that person alone.

  • Links expire when you choose: 24 hours to 30 days, or with the report.
  • No tracking pixel in the email.
Share by email

Custom domains

Report links on a subdomain of yours, such as reports.tollandreese.com (not a bare domain). Standard and up: 1 on Standard, 25 on Pro. A pressfox.app subdomain comes with Standard. You add three records:

  1. TXT_cf-custom-hostname.reports.tollandreese.comThe ownership token the app shows you
  2. TXT_acme-challenge.reports.tollandreese.comThe certificate validation token the app shows you
  3. CNAMEreports.tollandreese.comhosts.pressfox.app (DNS only: on Cloudflare, grey cloud)
Every plan

AI agents over MCP

Claude and other MCP clients connect two ways, with the same tools. By URL: you sign in to Pressfox and approve the assistant for one workspace, in test or live mode. Locally: a small package runs on your machine with an API key.

It can

  • Find templates
  • Create reports
  • Read and share them

It cannot

  • Delete reports
  • Change templates
  • Manage members, keys or billing

Disconnect it any time in Settings, Security.

In preview: write to hello@pressfox.io and we turn it on for your workspace.

MCP setup and tools
Claude Code, by URL
claude mcp add --transport http pressfox \
  https://mcp.pressfox.io/mcp

Other clients, and the local package with an API key: MCP setup.

Without code

  • Fill in a form in the app. A member types the data and gets the same report. Webhooks still fire, marked "source": "dashboard".
  • The Playground. Pick a template, edit the payload with live checks, and see the hosted page, the PDF and the exact request as curl, Node or Python. Test reports only.

Rate limits

A minutePer keyPer workspace
All requests6001,200
Report creations120240

Over a limit: 429 rate_limited with Retry-After in seconds. Need more? Write to us.

Every integration, and what is coming

5 available, 12 coming. Plans for what is coming are our intention, not a promise. Tell us what you need, and it moves up.

Available today

  • REST APICreate, read, list and share reports; read templates and their contracts; upload images.Free renders watermarked live reports. Build and connectEvery plan How it works
  • Signed webhooksreport.ready, report.failed and report.superseded, signed in the Standard Webhooks format, retried for a day. Build and connectStarter and up How it works
  • MCP for AI agentsClaude and other assistants find templates, create reports and read them.In preview: write to us and we turn it on for your workspace. Build and connectEvery plan How it works
  • Email sharesUp to 50 recipients per share, each with their own expiring link. DeliveryEvery plan How it works
  • Custom domainsReport links on reports.yourcompany.com. A pressfox.app subdomain from Standard. DeliveryStandard and up: 1 on Standard, 25 on Pro How it works

Coming

Chat notificationsPlanned for Standard and up

DeliveryPlanned for Pro and up

Storage deliveryPlanned for Standard and up

Automation platformsTriggers need webhooks (Starter and up)

What it does not do

  • It does not pull data from your systems. You send it.
  • No native Zapier, Make or n8n apps, no chat messages and no delivery to storage yet.
  • No official SDKs yet: the request is plain JSON over HTTPS.
  • Webhook payloads carry links, not report data, and signing secrets do not rotate yet.
  • Custom domains must be a subdomain, not a bare domain.

Missing something?

Tell us the system and what should happen. Requests decide what we build next.