Connect Zapier, reporting tools, or your own software to your MG Jobs data. Every request is authenticated with a token from your app: your company sync token (full access) or a tech's personal token (that tech's jobs only). Works identically for every licensed company — your token automatically routes to your own private data.
X-Api-Token: <your token> (header — recommended) …or ?token=<your token> (query string)
Find your token in the desktop app: More → Team accounts (per-tech tokens) or Settings → Sync token (company token).
| Method | URL | What it does |
|---|---|---|
| GET | /api.php?action=jobs | All jobs. Filters: status, technician, date_from, date_to (YYYY-MM-DD) |
| GET | /api.php?action=job&id=JOB-123 | One job with everything on it (payments, comms, signature…) |
| GET | /api.php?action=customers | Customer list with job counts and lifetime value |
| GET | /api.php?action=parts | Stock inventory |
| POST | /api.php?action=create_job | Create a job (JSON body; customerName required) |
| POST | /api.php?action=update_job | Update a job by id. Writable fields: status, technician, date, appointmentTime, price, serviceType, jobDescription, priority, paid |
| POST | /api.php?action=add_note | Append a note to a job's communication log (id + note) |
Tech tokens can only read/update jobs assigned to that tech, and any job they touch stays assigned to them.
Set an Outbound webhook URL in the desktop app under Settings → Integrations (or the web admin).
We POST a JSON body to it as things happen — point it at a Zapier "Catch Hook" or a Make "Custom webhook" and build any
automation on top (text the office, add a row to a sheet, post to Slack…). Each request also carries an
X-MG-Event header.
| Event | Fires when |
|---|---|
job.created | A new job is added (desktop, website form, portal booking, or API) |
job.updated | A job is changed through the API |
job.completed | A job's status becomes Completed |
job.paid | A job is marked paid |
estimate.approved | A customer approves an estimate on their portal |
jobs.synced | A desktop finished a sync (summary counts) |
// example body
{"event":"job.completed","business":"Your Co","at":"2026-07-20T14:03:00-05:00",
"data":{"jobId":"JOB-123","customerName":"Jane Doe","status":"Completed","price":249,"paid":false,"technician":"Mike"}}
> curl -H "X-Api-Token: tt_yourtoken" "https://YOURSITE/api.php?action=jobs&status=Scheduled"
> curl -X POST -H "X-Api-Token: tt_yourtoken" -H "Content-Type: application/json" \
-d '{"customerName":"New Lead","phone":"204-555-0100","serviceType":"Tune-up","date":"2026-08-01","price":99}' \
"https://YOURSITE/api.php?action=create_job"
{"success": true, "count": 12, "jobs": [ … ]} // 200
{"success": false, "error": "Invalid API token"} // 401
Rate limit: 600 requests/hour per IP. Created jobs appear in the desktop app on its next sync
(≤10 min, or instantly on manual sync) with source: "API".
Taking card payments through your own Stripe account? In your Stripe dashboard add a webhook to
https://YOURSITE/stripe-webhook.php?t=YOUR-TENANT-ID (events: checkout.session.completed)
and save your webhook signing secret in the desktop app under Settings → Payments. Paid checkouts mark the job paid
automatically on every device.