Skip to content
⚠️ Staging environment, test only, not production
Sign In
5 Native Integrations · 6 Toolkit Scripts

Connect ESXPress to Your Stack

ESXPress connects to your stack through a REST API with per-account keys for PDF or structured XML intake, signed webhooks and Slack commands for status, email auto-ingest that turns a sent PDF into an .esx reply, and connector scripts for AccuLynx, CompanyCam, QuickBooks, and Zapier. Every endpoint below is live in production today.

⚙️ For software vendors

API-first integration

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.

API-first integration →

Native Integrations

Built into the product, every endpoint below is live and working right now.

🔔✅ Live

ESXPress Webhooks

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).

🔌✅ Live

ESXPress REST API

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 answers with a job you poll, or add &sync=1 for the file in the same response). 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.

💬✅ Live

Slack Bot

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.

📧✅ Live

Email Auto-Ingest

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.

💳✅ Live

Stripe Billing

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.

Integration Toolkit: Shipped Scripts

Standalone connector scripts that push ESX files into each platform's public API. Bring your own credentials, these are not in-app native connectors.

🦅🧰 Toolkit

AccuLynx Connector

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.

📸🧰 Toolkit

CompanyCam Connector

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.

📊🧰 Toolkit

QuickBooks Online Connector

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.

⚡🧰 Toolkit

Zapier

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 ↗
🔔🧰 Toolkit

Universal Webhook Receiver

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.

📘🧰 Toolkit

Integration Guide

README · 8 platforms

Platform comparison matrix, environment variables, connector usage, troubleshooting, and platform-specific notes for HubSpot, Salesforce, EagleView, and JobNimbus.

Via Webhook: No Native Connector

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

HubSpot · Salesforce · EagleView · JobNimbus

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.

💎 Add-on

API & Integrations Add-on, $49/mo

$49/mo add-on on the 25 & 75 plans · Included from the 100 plan up & on legacy Volume+

What you get

  • 🔑 API keys, create / list / revoke (/api/v1/keys), full key shown once, esx_… format, SHA-256 hashed at rest
  • 🔌 Public REST API, upload, status, download endpoints with key auth
  • 🔔 Outbound webhooks, as many URLs as you need, HMAC signing, 3× retry, delivery status
  • 📖 /api/v1/docs, styled API docs + FastAPI OpenAPI (/docs)

Limits

  • ⏱️ 60 requests / minute / account, a tenant's keys share one bucket; over the limit returns HTTP 429
  • 📄 50 MB max per PDF upload
  • 🔒 HTTPS-only webhook targets (SSRF-guarded, PII-safe)
  • 🔄 3 attempts per webhook delivery (5s / 15s / 45s backoff; 4xx not retried)
  • 🚦 Availability: api_keys + webhooks require the 100 plan or above, or the $49/mo API & Integrations add-on

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.

Step-by-Step Guides

1 · Connect via Webhook

Fire conversion.completed payloads to any HTTPS endpoint, your server, Zapier, Make, n8n, or the shipped receiver script.

  1. 1Make sure API & Integrations is active on your plan (from the 100 plan up, or the $49/mo add-on on the 25 / 75 plans).
  2. 2Get an HTTPS endpoint: create a Zapier Webhooks → Catch Hook trigger (URL looks like https://hooks.zapier.com/hooks/catch/…), spin up the shipped receiver (python universal_webhook_receiver.py --port 8080), or point at your own service.
  3. 3Register the URL via POST /api/v1/webhooks/configure. Note: webhook configuration is authenticated with your account session/JWT, while the payload is delivered to your endpoint unauthenticated but optionally HMAC-signed.
  4. 4Convert any PDF. When the conversion reaches ready, every active webhook is POSTed the payload below (up to 3 attempts, 15s timeout each).
  5. 5Verify delivery in GET /api/v1/webhooks, each webhook reports last_fired_at, last_status_code, and last_error.

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: v1

Payload 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.

2 · Use the API

Base URL https://esxpress.org/api/v1/public · Auth via X-API-Key header or Authorization: Bearer

  1. 1Create a key: Dashboard → Settings → API Keys (or POST /api/v1/keys). The full key is shown exactly once, save it. Keys are scoped to your tenant and revocable anytime.
  2. 2Upload one or more PDFs (≤50MB each, batch supported). Each valid file is queued immediately; invalid files are reported in errors without aborting the batch.
  3. 3Poll status until "ready", the response includes the extracted line items, totals, claim number, and carrier.
  4. 4Download the validated .esx file (import validation checked before every serve). If the file went stale (>24h), it is auto-regenerated from stored line items.

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/download

Errors: 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 per account; a tenant's keys share one bucket). Full docs: /api/v1/docs, OpenAPI at /docs.

3 · Slack Bot

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 guide
  1. 1Install the ESXPress Slack app in your workspace (or ask ESXPress support to link your workspace, linking is admin-managed via POST /api/v1/slack/link).
  2. 2Run /esxpress upload https://…/scope.pdf carrier:StateFarm in any channel. The bot downloads the PDF (public URL only, ≤25MB, SSRF-guarded), queues the conversion, and confirms with the job ID.
  3. 3Track it with /esxpress status 42, or browse recent jobs with /esxpress list. /esxpress help shows the guide inline.

Note: 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.

🔍

Live, nothing on this page is aspirational

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.

Ready to Integrate?

Get your API key, configure a webhook, or connect Slack, in minutes.