MyExpertDFW Scrapers

ITEL work orders, Symbility claims, and XactAnalysis

ITEL Symbility XactAnalysis

Property scrapers (Zillow, SDAT, …)

ITEL Work Orders

National Restore portal — fields + PDF attachments

Start ITEL Scraping

Symbility Claims

My Claims — date filter + loss summary

Start Symbility Scraping

XactAnalysis Claims

In-progress claim data, coverages, attachments

Start XactAnalysis Scraping

API Access

All /myexpertdfw/api/ routes require Content-Type: application/json on POST bodies (where applicable). Browser forms (/itel_form, etc.) do not need a token.

Authentication (required)

Set SCRAPER_API_TOKEN in .env. Use one of:

  • Authorization: Bearer <token>
  • X-API-Token: <token>
  • GET only: ?token=<token> on the query string

Loaded token from server env (use in curl below): 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X

Base URL for curls: http://127.0.0.1:8000

ITEL

Endpoints

  • POST /myexpertdfw/api/scrape/itel/ — sync (waits until done)
  • POST /myexpertdfw/api/scrape/itel/async/ — async (returns job_id)
  • GET /myexpertdfw/api/scrape/itel/job/<job_id>/ — poll async job

POST body parameters (JSON)

FieldRequiredDefaultDescription
date or assigned_dateNo*todayWO Assigned Date filter (YYYY-MM-DD)
all or fetch_all_datesNofalseScrape all dates (no date filter)
detail_urlNoScrape one work order by full portal URL
first_onlyNofalseStop after one new work order
forceNofalseRe-scrape if already in SQLite DB
zoho_lead_idNoStored on job record
zoho_webhookNotruePOST results to Zoho Flow when finished

* Provide date, all, or detail_url.

Example JSON body

{
  "date": "2026-05-18",
  "force": false,
  "first_only": false,
  "zoho_webhook": true
}

cURL — sync

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/itel/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{"date":"2026-05-18","force":false,"zoho_webhook":true}'

cURL — async (recommended)

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/itel/async/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{"date":"2026-05-18","force":false,"zoho_webhook":true}'

cURL — poll job (replace 12 with job_id from async response)

curl -X GET 'http://127.0.0.1:8000/myexpertdfw/api/scrape/itel/job/12/?token=7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X'

Symbility

  • POST /myexpertdfw/api/scrape/symbility/ — sync
  • POST /myexpertdfw/api/scrape/symbility/async/ — async
  • GET /myexpertdfw/api/scrape/symbility/status/<id>/ — poll status
  • GET /myexpertdfw/api/cron/symbility/ — cron start (query params)
  • GET /myexpertdfw/api/cron/symbility/wait/<id>/ — cron wait until done

POST body parameters (JSON)

FieldRequiredDefaultDescription
filter_created_fromYes†todayClaim created from (YYYY-MM-DD)
filter_created_toYes†todayClaim created to
loss_summaryNofalseOpen each claim for loss summary (slower)
headedNotrueVisible Chrome window
chromeNotrueUse system Chrome channel
storage_stateNosymbility_auth.jsonPlaywright session file (project root)
page_sizeNo100Rows per page (10, 20, 50, 100)
max_pagesNo200Pagination safety cap
max_loss_summaryNoallLimit loss-summary to first N claims
skip_auto_loginNofalseUse saved session only
manual_loginNofalseWait for manual login in browser
debugNofalseDOM probes + debug screenshots
zoho_webhookNotruePOST to Zoho Flow when done (API/cron)
internal_testNofalseIf true, skips Zoho webhook
zoho_lead_idNoOptional metadata

† If omitted, both dates default to today (server local date).

Cron GET query parameters (no JSON body)

Query paramRequiredDescription
tokenYesSame as SCRAPER_API_TOKEN
from / toNoDate range (YYYY-MM-DD); both required if either set
date_from / date_toNoAliases for from / to
days_backNoDays before today for start date (env: SYMBILITY_CRON_DAYS_BACK)
wait or auto_pollNo1 = block until scrape finishes
zoho_webhookNo0 / 1 — push to Zoho Flow
loss_summary, headed, chromeNoOverride cron defaults (1 / 0)
poll_secondsNoPoll interval on wait URL (default 15)
delay_secondsNoInitial delay before polling on wait URL

Example JSON body

{
  "filter_created_from": "2026-04-01",
  "filter_created_to": "2026-04-10",
  "loss_summary": true,
  "headed": true,
  "chrome": true,
  "storage_state": "symbility_auth.json",
  "zoho_webhook": true
}

cURL — sync

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/symbility/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{"filter_created_from":"2026-04-01","filter_created_to":"2026-04-10","loss_summary":true,"headed":true,"chrome":true,"zoho_webhook":true}'

cURL — async

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/symbility/async/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{"filter_created_from":"2026-04-01","filter_created_to":"2026-04-10","loss_summary":true,"headed":true,"chrome":true}'

cURL — poll status (replace 1 with record id)

curl -X GET 'http://127.0.0.1:8000/myexpertdfw/api/scrape/symbility/status/1/?token=7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X'

cURL — cron (fire-and-forget, today’s range)

curl -X GET 'http://127.0.0.1:8000/myexpertdfw/api/cron/symbility/?token=7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X&from=2026-04-01&to=2026-04-10&zoho_webhook=1'

cURL — cron with wait (blocks until done)

curl -X GET 'http://127.0.0.1:8000/myexpertdfw/api/cron/symbility/?token=7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X&from=2026-04-01&to=2026-04-10&wait=1&zoho_webhook=1'

XactAnalysis

  • POST /myexpertdfw/api/scrape/xactanalysis/ — sync
  • POST /myexpertdfw/api/scrape/xactanalysis/async/ — async
  • GET /myexpertdfw/api/scrape/xactanalysis/status/<id>/ — poll status

POST body parameters (JSON)

FieldRequiredDefaultDescription
emailNoXACT_USER (.env)XactAnalysis login email
passwordNoXACT_PASS (.env)Password
headlessNoignoredAlways visible Chrome
zoho_lead_idNoUpdate Zoho CRM lead after scrape

Web form also accepts date_preset (e.g. today) via form field, not JSON API.

Example JSON body

{
  "email": "",
  "password": "",
  "zoho_lead_id": ""
}

Empty email / password uses XACT_USER and XACT_PASS from .env.

cURL — sync (uses .env credentials)

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/xactanalysis/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{}'

cURL — sync (explicit credentials + Zoho lead)

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/xactanalysis/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{"email":"security@myexpertdfw.com","password":"YOUR_PASSWORD","zoho_lead_id":"1234567890123"}'

cURL — async

curl -X POST 'http://127.0.0.1:8000/myexpertdfw/api/scrape/xactanalysis/async/' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X' \
  -d '{}'

cURL — poll status (replace 5 with job id)

curl -X GET 'http://127.0.0.1:8000/myexpertdfw/api/scrape/xactanalysis/status/5/?token=7n08fuwAhU0eu9m9DKAAXYBsI2osCa7X'