MG Jobs API

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.

Authentication

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

Endpoints

MethodURLWhat it does
GET/api.php?action=jobsAll jobs. Filters: status, technician, date_from, date_to (YYYY-MM-DD)
GET/api.php?action=job&id=JOB-123One job with everything on it (payments, comms, signature…)
GET/api.php?action=customersCustomer list with job counts and lifetime value
GET/api.php?action=partsStock inventory
POST/api.php?action=create_jobCreate a job (JSON body; customerName required)
POST/api.php?action=update_jobUpdate a job by id. Writable fields: status, technician, date, appointmentTime, price, serviceType, jobDescription, priority, paid
POST/api.php?action=add_noteAppend 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.

Outbound webhooks (triggers for Zapier / Make)

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.

EventFires when
job.createdA new job is added (desktop, website form, portal booking, or API)
job.updatedA job is changed through the API
job.completedA job's status becomes Completed
job.paidA job is marked paid
estimate.approvedA customer approves an estimate on their portal
jobs.syncedA 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"}}

Examples

> 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"

Responses

{"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".

Stripe webhook (payments)

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.