Every integration listed here is running in production today — real endpoints, real payloads, real limits.
Built into the product — every endpoint below is live and working right now.
HTTP POST · Configurable · HTTPS only
Fire conversion-complete payloads to any HTTPS URL. Configure via POST /api/v1/webhooks/configure with an optional HMAC secret. 3 retries (5s/15s/45s backoff), delivery status tracked per webhook. Enterprise plan (or the $49/mo API & Integrations add-on).
API Key · 60 req/min · OpenAPI docs
Upload PDFs, poll conversion status, download ESX files — all programmatically. Auth via X-API-Key header or Bearer token. Keys are created in Dashboard → Settings → API Keys and shown exactly once; access requires the Enterprise plan or the API & Integrations add-on. Docs at /api/v1/docs.
Slash Command · /esxpress
Type /esxpress upload <pdf-url> in Slack to convert a scope from a public PDF URL, /esxpress status <id> to check progress, /esxpress list for recent jobs. HMAC-authenticated requests, Block Kit responses. Workspace linking is managed by ESXPress.
Email a PDF · Auto-convert · Reply with .esx
Generate an inbound email address for your account, email a scope PDF to it, and ESXPress converts it and replies with the .esx file attached. Addresses are token-based, delivery is handled by Mailgun or SendGrid, and each conversion counts against your plan quota like any upload.
Subscriptions · Checkout · Portal
Payment backbone: /api/v1/billing/create-checkout, /prices, /webhook, /status, /portal. Signature-checked inbound webhook receiver at /api/v1/billing/webhook upgrades tenants on checkout.session.completed.
Standalone connector scripts that push ESX files into each platform's public API. Bring your own credentials — these are not in-app native connectors.
Script · REST v1 · Bearer / X-API-Key
List jobs and upload the generated ESX file as a job document via AccuLynx's REST API. Run it after conversion, or pair it with a webhook to automate the trigger.
Script · REST v2 · Token
List projects, create projects, and upload photos via CompanyCam's REST API. Requires a CompanyCam Pro/Premium/Elite plan for API access.
Script · OAuth 2.0
OAuth 2.0 attachment upload to invoices and estimates in QuickBooks Online, using the platform's standard OAuth 2.0 flow.
Template · Catch Hook
Ships the payload schema and step-by-step Catch Hook setup. Point a webhook at your hooks.zapier.com URL and ESXPress fires conversion.completed into any Zap.
API Docs ↗Python stdlib · Zero dependencies
A drop-in HTTP server that receives webhook payloads, logs them to JSON, and can forward them to another endpoint — a Zapier hook or your own service. Useful as a test endpoint or relay.
README · 8 platforms
Platform comparison matrix, environment variables, connector usage, troubleshooting, and platform-specific notes for HubSpot, Salesforce, EagleView, and JobNimbus.
These platforms have public APIs but no ESXPress connector ships in the app. Connect them the universal way: configure a webhook, then route conversion.completed payloads into the platform — via Zapier, the shipped receiver script, or your own code.
Via Webhook + Integration Guide
HubSpot Private Apps (files/v3), Salesforce Attachment/ContentVersion objects, EagleView's developer portal, and JobNimbus's customer-gated API are all documented in the integration guide. No in-app connector exists — the webhook delivers the payload, you route it.
$49/mo add-on on Starter & Professional · Included with Enterprise & Volume
Billing runs through Stripe at the published API add-on price. Enterprise and Volume plans include API access and webhooks with no add-on.
Fire conversion.completed payloads to any HTTPS endpoint — your server, Zapier, Make, n8n, or the shipped receiver script.
Register a webhook
# Configure a webhook (Enterprise plan / API add-on required)
curl -X POST https://esxpress.org/api/v1/webhooks/configure \
-H "Authorization: Bearer <your-jwt>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/",
"secret": "your-hmac-secret",
"is_active": true
}'
# Manage: GET /api/v1/webhooks · PATCH /api/v1/webhooks/{id} · DELETE /api/v1/webhooks/{id}
# HTTPS only — cleartext http:// is rejected (payloads contain PII).
# When a secret is set, every delivery carries:
# X-Webhook-Signature: sha256=<hmac-hex>
# X-Webhook-Timestamp: <unix-epoch>
# X-Webhook-Signature-Version: v1Payload delivered on every conversion (event: conversion.completed)
{
"event": "conversion.completed",
"tenant_id": 1,
"tenant_name": "Acme Roofing",
"tenant_slug": "acme",
"conversion_id": 42,
"filename": "scope.pdf",
"esx_filename": "42_SAMPLE.esx",
"esx_download_url": "https://esxpress.org/api/v1/public/convert/42/download",
"esx_ready": true,
"status": "ready",
"total_line_items": 24,
"total_rcv": 15234.56,
"carrier_name": "StateFarm",
"claim_number": "22-ABC-1234",
"insured_name": "John Doe",
"property_address": "123 Main St",
"timestamp": "2026-08-07T01:32:00Z",
"source": "esxpress"
}Signed delivery: when you set a secret, receivers can verify X-Webhook-Signature: sha256=… over the raw body with X-Webhook-Timestamp(reject |now − ts| > 300s for anti-replay). Event headers also include X-ESXPress-Event, X-ESXPress-Conversion-ID, and X-ESXPress-Tenant-ID.
Base URL https://esxpress.org/api/v1/public · Auth via X-API-Key header or Authorization: Bearer
End-to-end with curl
# Upload a PDF (multipart; up to 50MB per file, batch supported) curl -X POST https://esxpress.org/api/v1/public/convert/upload \ -H "X-API-Key: esx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -F "[email protected]" \ -F "carrier=StateFarm" # → { "ok": true, "jobs": [ { "filename": "scope.pdf", "task_id": "...", "conversion_id": 42 } ], ... } # Poll status until "ready" curl -H "X-API-Key: esx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ https://esxpress.org/api/v1/public/convert/42/status # Download the ESX file curl -OJ -H "X-API-Key: esx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ https://esxpress.org/api/v1/public/convert/42/download
Errors: 401 missing/invalid/revoked key · 400 not a PDF / too large · 404 conversion not found · 409 ESX failed validation · 410 stale file, re-upload · 429 rate limit (60 req/min/key). Full docs: /api/v1/docs — OpenAPI at /docs.
Endpoint POST /api/v1/slack/command — receives the /esxpress slash command, HMAC-SHA256 authenticated (5-minute timestamp window), workspace → tenant mapping maintained by ESXPress. Conversions run async; responses are Slack Block Kit.
Commands
Commands What it does
──────────────────────────────────────────────────────────────
/esxpress upload <pdf-url> Convert a scope from a PUBLIC PDF URL
(optional: carrier:StateFarm)
/esxpress status <job-id> Check conversion status
/esxpress list [N] List recent conversions (default 5)
/esxpress help Show usage guideNote: uploads are URL-based, not file drops — the bot fetches a public PDF link you paste. There is no Microsoft Teams connector in the codebase.
AccuLynx, CompanyCam, QuickBooks, Zapier, and the universal receiver ship as standalone scripts. HubSpot, Salesforce, EagleView, and JobNimbus are covered by the integration guide and connect via webhooks — no native connector ships. There are no native connectors for any third-party CRM or accounting platform inside the app itself, and no Teams/Procore/ BuilderTrend/Xactimate Cloud connectors exist.
Get your API key, configure a webhook, or connect Slack — in minutes.