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)
| Field | Required | Default | Description |
|---|---|---|---|
date or assigned_date | No* | today | WO Assigned Date filter (YYYY-MM-DD) |
all or fetch_all_dates | No | false | Scrape all dates (no date filter) |
detail_url | No | — | Scrape one work order by full portal URL |
first_only | No | false | Stop after one new work order |
force | No | false | Re-scrape if already in SQLite DB |
zoho_lead_id | No | — | Stored on job record |
zoho_webhook | No | true | POST 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)
| Field | Required | Default | Description |
|---|---|---|---|
filter_created_from | Yes† | today | Claim created from (YYYY-MM-DD) |
filter_created_to | Yes† | today | Claim created to |
loss_summary | No | false | Open each claim for loss summary (slower) |
headed | No | true | Visible Chrome window |
chrome | No | true | Use system Chrome channel |
storage_state | No | symbility_auth.json | Playwright session file (project root) |
page_size | No | 100 | Rows per page (10, 20, 50, 100) |
max_pages | No | 200 | Pagination safety cap |
max_loss_summary | No | all | Limit loss-summary to first N claims |
skip_auto_login | No | false | Use saved session only |
manual_login | No | false | Wait for manual login in browser |
debug | No | false | DOM probes + debug screenshots |
zoho_webhook | No | true | POST to Zoho Flow when done (API/cron) |
internal_test | No | false | If true, skips Zoho webhook |
zoho_lead_id | No | — | Optional metadata |
† If omitted, both dates default to today (server local date).
Cron GET query parameters (no JSON body)
| Query param | Required | Description |
|---|---|---|
token | Yes | Same as SCRAPER_API_TOKEN |
from / to | No | Date range (YYYY-MM-DD); both required if either set |
date_from / date_to | No | Aliases for from / to |
days_back | No | Days before today for start date (env: SYMBILITY_CRON_DAYS_BACK) |
wait or auto_poll | No | 1 = block until scrape finishes |
zoho_webhook | No | 0 / 1 — push to Zoho Flow |
loss_summary, headed, chrome | No | Override cron defaults (1 / 0) |
poll_seconds | No | Poll interval on wait URL (default 15) |
delay_seconds | No | Initial 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)
| Field | Required | Default | Description |
|---|---|---|---|
email | No | XACT_USER (.env) | XactAnalysis login email |
password | No | XACT_PASS (.env) | Password |
headless | No | ignored | Always visible Chrome |
zoho_lead_id | No | — | Update 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'