ServiceM8’s webhooks tell you something changed. They do not tell you what.
ServiceM8 allows 180 requests a minute and 20,000 a day per app per account, with webhooks on nine record types. Those webhooks carry only a record ID and the changed field names, so every event costs a second call — out of the same budget. There is no payload signature.
What ServiceM8 publishes about its API
Documentation
Yes — developer.servicem8.com is fully readable without a login. ServiceM8 developer docs, fetched 1 September 2026.
Authentication
Two paths. A self-service API key in an X-API-Key header for private integrations, with no developer account needed. OAuth 2.0 for public add-ons, with 60-plus granular scopes and a one-hour access token. ServiceM8 authentication, fetched 1 September 2026.
Token lifetimes
OAuth access token lifetime is 3,600 seconds. Refresh token grant is supported. API keys do not expire. ServiceM8 authentication, fetched 1 September 2026.
Rate limits
180 requests per minute and 20,000 per day, applied per application per account — so two client accounts get a separate allowance each. ServiceM8 response codes, fetched 1 September 2026.
When you exceed one
HTTP 429 with the body "Number of allowed API requests per minute exceeded". No rate-limit headers are documented. ServiceM8 response codes, fetched 1 September 2026.
Pagination
Cursor-based. Start at cursor=-1, take up to 1,000 records per response, and follow the x-next-cursor response header until it stops appearing. ServiceM8 pagination, fetched 1 September 2026.
Webhooks
Yes — job, job activity, job payment, note, task, material, company, attachment and form response. ServiceM8 webhooks, fetched 1 September 2026.
Event verification
A subscribe-time challenge and echo, not a per-payload signature. OAuth apps must complete the challenge; API-key subscriptions are exempt from even that. ServiceM8 webhooks, fetched 1 September 2026.
Retry behaviour
Retried for up to 72 hours before the subscription is cancelled. A 410 unsubscribes immediately, and a 429 throttles that account’s webhooks for 15 minutes. ServiceM8 webhooks, fetched 1 September 2026.
Bulk operations
No batch endpoint or bulk limit is published.
Test environment
No sandbox terms are published.
Data location
ServiceM8 does not publish where the data is stored.
Cost of API access
No separate charge for API access is published.
Every line above is ServiceM8’s own documentation, fetched 1 September 2026, linked so you can check it yourself. 4 of the 13 fields are not published at all — those are marked, and they are the ones that cost you time. The full capability register puts this beside the other eight.
What the ServiceM8 API does and does not allow
Job management for small field-service teams. Australian company, priced by jobs a month rather than by seat.
Everything in the strip above is ServiceM8’s own published documentation, fetched 1 September 2026 and linked to the page it came from. We have not paraphrased it into something friendlier, because the exact wording is what you need when a limit bites at four in the afternoon.
What follows is what those facts mean for a build — the constraints that change a design decision rather than the ones that are merely true. If you want the same treatment for the other eight systems side by side, that is the capability register. If you want to know whether we have built against both sides of a particular pairing, the integration checker answers that specific question.
The thin webhook, and the arithmetic it forces
ServiceM8 tells you a job changed and which fields moved. It does not tell you what they changed to. To know that, you fetch the record — a second HTTP call, against the same 180-a-minute allowance that the webhook did not consume.
For most small trade businesses this never matters. Forty jobs a day generates a trickle. But the pattern that does bite is a bulk edit: someone reprices a hundred jobs, or a scheduled process touches every open job at once, and you receive a hundred events in a few seconds and go out to fetch a hundred records. That is most of a minute’s allowance spent on one person clicking one button.
The design that survives it is a queue with a token bucket in front of the fetch, and deduplication by record ID inside a short window — because five field changes on one job in ten seconds is five events and should be one fetch. None of that is exotic. It is just work that a thicker webhook payload would have made unnecessary.
Deduplicate by record, not by eventCollapse everything for one job inside a short window into a single fetch. On bulk edits this is the difference between comfortable and rate-limited.
Rate-limit your own fetchesA token bucket in front of the follow-up call. The webhook did not cost you budget; the fetch does.
Treat the payload as a hintSince it is unsigned, the only thing you should trust is what the authenticated fetch returns. That is good practice anyway and here it is necessary.
Unsigned events, and what to do about it
ServiceM8 verifies your endpoint once, at subscription time, with a challenge it expects you to echo back. That proves you control the URL on the day you set it up. It proves nothing about any POST that arrives afterwards.
Compare that with Simpro, which signs every payload with an HMAC, or Stripe, which signs and includes a replay-tolerance window. ServiceM8 publishes neither. Anyone who learns or guesses your callback URL can send you events that look real.
This is manageable, and the mitigation is the same thing the thin payload already forces: never act on the contents of the webhook, only on what an authenticated fetch of that record returns. A forged event then costs you one wasted API call rather than a wrong decision. Use an unguessable callback path as well. But it should be said plainly that the platform is not doing this part for you, and most integration pages will not tell you that.
Verify the endpoint once, trust nothing after. The line has to be somewhere.
Rate limits and what breaks at scale
One hundred and eighty requests a minute and twenty thousand a day, and — usefully — applied per application per account rather than per application. Two client accounts get a separate allowance each, so a multi-tenant integration does not have its clients competing with one another. That is a better arrangement than several systems in this register offer and it deserves credit.
Filtering is where ServiceM8 constrains you rather than throttles you. Ten conditions maximum, AND only, no OR, no NOT, no parentheses, and no greater-than-or-equal or less-than-or-equal — only the strict versions. A date range that includes both endpoints is expressed with two strict comparisons and a careful think about boundaries, or with two requests and a merge.
The one that catches people out is not a limit at all. Webhook timestamps are UTC; almost everything else in ServiceM8 is in the account’s local timezone. In Brisbane that is a silent ten-hour error in anything that compares the two, and it will look like a scheduling bug rather than a timezone bug for as long as you let it.
What ServiceM8’s documentation supports — and the caveat on each. Source: ServiceM8 developer documentation, fetched 1 September 2026.
ServiceM8
Read records on demand
●Yes180 a minute, 20,000 a day, per app per account. Cursor pagination up to 1,000 records.
Write records in
●YesStandard REST writes across jobs, contacts, materials and attachments.
Know the moment something changes
◐PartlyNine record types, but the payload carries only the record ID and changed field names.
Verify an event came from them
○NoNo payload signature. A subscribe-time challenge proves the URL once and nothing after.
Recover after an outage
◐PartlyRetried for up to 72 hours, then cancelled. A 429 throttles that account’s webhooks for 15 minutes.
Bulk load history
–Not assessedNo batch endpoint is published. Filtering is capped at 10 AND-only conditions.
Keep data in Australia
–Not assessedServiceM8 is an Australian company but does not publish where the data is stored.
What ServiceM8 does not publish
4 of the thirteen fields we track are simply absent from ServiceM8’s documentation: any bulk or batch limit, what the test environment gives you, where your client’s data physically sits and whether API access itself costs anything.
This is the part of an integration page that competitors leave out, and it is the part that costs money. An undocumented rate limit is not an academic gap — it means the first time you find the ceiling is in production, on someone else’s business, usually on the busiest day of their month.
We are not going to fill these in with figures from a forum thread. Numbers circulate for most of them, and some are probably right, but we cannot show you where they came from and neither can the person who posted them. When we have measured ServiceM8 properly under load, those figures will appear here with the date we measured them and the conditions we measured them under. Not before.
What we have built, and what we have not measured
We have implemented against ServiceM8 in production. That is a real fact and it is also a limited one — it tells you we have solved this system's problems before, and it does not tell you how fast, how reliably, or at what volume.
The honest position is this. Everything on this page above the line is the vendor's published documentation, which we fetched, dated and linked rather than paraphrased. Nothing on this page is a Kindra measurement, because our measured register is not finished and publishing half of it dressed up as all of it would make this page less useful, not more.
What we would do on an engagement is measure the specific things that matter for your build — the endpoints you depend on, at your volume, with your data — and hand you those numbers whether or not they suit us. If they say the integration is harder than we quoted, you get told that too. Start with a Leak Check, or read how we work first if you would rather know the shape of it before talking to anyone.
Objections
Will an automation push us onto a more expensive ServiceM8 plan?
It can, and we will raise it before we build. ServiceM8 prices by jobs per month rather than by seat — 50, 150, 500 or 1,500 depending on the plan, with unlimited users on all of them. That is a genuinely good deal for a growing team, and it means any automation that creates job records is spending a metered resource. If the flow we are discussing would take you across a plan boundary, the extra subscription cost belongs in the quote, not in a surprise.
Isn’t ServiceM8 enough on its own?
Very often, yes — and if it is, we will say so and there is no engagement. ServiceM8 is a mature product that solves the problem it was built for. Integration work is only worth paying for when the cost sits between systems: the same information being typed into ServiceM8 and then into something else, or a decision waiting because two systems disagree. If everything you need lives inside ServiceM8, buy the plan that fits and spend the money elsewhere.
What happens when they change their API?
They will. Three of the nine systems in our register shipped a breaking or cost-changing update in the last twelve months. What matters is not preventing that — nobody can — but whether the integration was built so the change is a contained fix rather than a rebuild, and whether anyone is watching for the deprecation notice. You own the code either way, so you are never stuck with us to get it fixed.
Book a free Leak Check
20 minutes. We find where the money's going. No pitch.