Integrations
By system: five recipes
The same request each time; only the moment and the event change.
ERP and back office
- 1WhenAn order ships or an invoice is posted.
- 2Send
POST /api/v1/reportswith your invoice template, the record aspayloadand its number asIdempotency-Key, so a retry never makes two. - 3Back
urlandpdf_url. Store them on the record. - 4Listen
report.failed, to flag the record for a person.
CRM
- 1WhenA deal closes or an account review is due.
- 2SendOne request with the account's figures and your one-pager or review template.
- 3BackThe hosted link. Share it with the contacts, one expiring link each.
- 4Listen
report.ready, to write the link onto the account.
Inspection and field apps
- 1WhenThe inspector submits the checklist.
- 2SendThe answers, with photos as https URLs or uploaded first through
POST /api/v1/assets. - 3BackThe link, or
422naming the missing field, so the app can ask the inspector for it. - 4Listen
report.ready, then share it with the customer.
Your own backend
- 1WhenAny event your product already has.
- 2SendThe same request from any language. Pin a version with
template@Nso a publish never changes what production sends. - 3Back
200when the render finished within 2.5 seconds,202while it is still rendering. - 4Listen
report.readyfor the 202 case,report.failedwith the reason.
AI agents
- 1WhenSomeone asks their assistant for a report.
- 2SendThe agent reads the template's contract and calls
create_report, which makes the same request. - 3BackThe link, the PDF and a Markdown version the agent can read.
- 4ListenNothing new: its reports reach your endpoints like any other API report.
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 sayspdf_protected. - Verify a document: anyone can check a PDF at
/verify, from Standard. The page computes the fingerprint in the browser and asksGET /api/verification/check/{sha256}, which is public and rate limited.
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" } } }' 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(); 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"]) {
"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,
…
} 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.supersededEvery delivery is signed in the Standard Webhooks format.
A failed delivery is retried after
- 1 minute
- 5 minutes
- 30 minutes
- 2 hours
- 6 hours
- 12 hours
- 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 referenceEvery delivery carries
webhook-idThe delivery's id, the same on every retrywebhook-timestampWhen it was sent; reject anything more than five minutes offwebhook-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 deliveryEmail 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.
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:
- TXT
_cf-custom-hostname.reports.tollandreese.comThe ownership token the app shows you - TXT
_acme-challenge.reports.tollandreese.comThe certificate validation token the app shows you - CNAME
reports.tollandreese.comhosts.pressfox.app (DNS only: on Cloudflare, grey cloud)
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 toolsclaude 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 minute | Per key | Per workspace |
|---|---|---|
| All requests | 600 | 1,200 |
| Report creations | 120 | 240 |
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
- SlackA message in a channel when a report is ready or fails. Tell us you need Slack
- Microsoft TeamsThe same message, through a Teams workflow. Tell us you need Microsoft Teams
- Google ChatThe same message, to a space. Tell us you need Google Chat
- DiscordThe same message, to a channel. Tell us you need Discord
DeliveryPlanned for Pro and up
- Report emails from your own domainShares sent from reports@ your domain once you verify it. Tell us you need Report emails from your own domain
Storage deliveryPlanned for Standard and up
- S3, R2 and GCSEvery finished PDF copied to your own bucket. Tell us you need S3, R2 and GCS
- Google DriveEvery finished PDF saved to a folder you pick. Tell us you need Google Drive
- OneDrive and SharePointThe same, into Microsoft 365. Tell us you need OneDrive and SharePoint
- DropboxThe same, into a Dropbox folder. Tell us you need Dropbox
Automation platformsTriggers need webhooks (Starter and up)
- ZapierRecipes in the docs first, a native app later. Tell us you need Zapier
- MakeRecipes in the docs first, a native app later. Tell us you need Make
- n8nRecipes in the docs first, a native node later. Tell us you need n8n
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.