The native endpoints below are running in production today — real endpoints, real payloads, real limits.
Building Xactimate ESX conversion into your own product? The API-first page covers per-account API keys, upload/status/download endpoints, webhooks, rate limits, and white-label options — everything a software vendor needs to embed or resell conversion.
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. 100 plan or above (or the $49/mo API & Integrations add-on).
API Key · 60 req/min · OpenAPI docs
Send scopes programmatically. Structured XML goes first-class: scope XML (Xactimate's or any other system's) or ScopeJSON v1 posts to /api/v1/public/convert/structured with no OCR in the path (?build=1 returns the finished .esx). PDF batches upload with the same status polling and ESX download. Auth via X-API-Key header or Bearer token. Keys are created in Dashboard → Settings → API Keys and shown exactly once; access requires the 100 plan or above, 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, 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 the 25 & 75 plans · Included from the 100 plan up & on legacy Volume+
Billing runs through Stripe at the published API add-on price. Plans from the 100 tier up, and legacy 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 (100 plan or above, or API add-on)
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
# Preferred for accuracy: structured XML intake — send scope XML (Xactimate's or any other system's), no OCR in the path
curl -X POST https://esxpress.org/api/v1/public/convert/structured?build=1 \
-H "X-API-Key: esx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/xml" \
--data-binary @scope.xml
# PDF intake (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 "files=@scope.pdf" \
-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/downloadErrors: 401 missing/invalid/revoked key · 400 not a PDF · 413 too large (50 MB max) · 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.