Skip to content
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 $9/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, $9/mo

$9/mo add-on on the 25, 50 & 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 or XML 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 $9/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 $9/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 scope. 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.