Every integration on this page is verified against the ESXPress codebase — real endpoints, real payloads, real limits. No vaporware.
Built into the ESXPress backend — every endpoint below is verified in app/api/v1/. Active 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. 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-verified requests, Block Kit responses. Workspace linking is managed by ESXPress.
Subscriptions · Checkout · Portal
Payment backbone: /api/v1/billing/create-checkout, /prices, /webhook, /status, /portal. Signature-verified inbound webhook receiver at /api/v1/billing/webhook upgrades tenants on checkout.session.completed.
Standalone, repo-shipped connectors in scripts/integrations/ 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
acculynx_connector.py — list jobs and upload the generated ESX file as a job document via api.acculynx.com/v1. Run it after conversion; pair with a webhook to automate the trigger.
Script · REST v2 · Token
companycam_connector.py — list projects, create projects, and upload photos to api.companycam.com/v2. Requires a CompanyCam Pro/Premium/Elite plan for API access.
Script · OAuth 2.0
quickbooks_connector.py — OAuth 2.0 attachment upload to invoices/estimates in QuickBooks Online via quickbooks.api.intuit.com/v3.
Template · Catch Hook
zapier_template.json 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
universal_webhook_receiver.py — drop-in HTTP server that receives webhook payloads, logs them to JSON, and can forward to another endpoint (e.g. a Zapier hook). Ideal test endpoint or relay.
README · 8 platforms
scripts/integrations/README.md — 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 middleware.
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
How it bills: checkout runs through Stripe with the api_addon price (STRIPE_PRICE_API_ADDON_MONTHLY). 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_VERIFIED.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 verified (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 under scripts/integrations/. 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.