Calendar & Accounting Sync API for Google Calendar, Outlook & QuickBooks | FieldCamp
FieldCamp's calendar sync API lets you trigger Google Calendar, Outlook and QuickBooks syncs and pull incremental changes from one place.
The FieldCamp calendar sync API gives integrators a programmatic way to trigger Google Calendar, Outlook and QuickBooks syncs and to read incremental Google Calendar changes. Use it whenever a dispatcher action, a webhook from an upstream system, or a user-facing "Refresh now" button needs to push or pull data faster than the default polling cadence. This reference covers the four supported endpoints, their request and response shapes, and the error codes you need to handle in production code.
If you're new to the FieldCamp API, start with the API quickstart and Authentication before invoking integration endpoints. For the full API reference index and the in-app setup behind these connections, see Apps and integrations: all FieldCamp connections.
What the calendar sync API does
The integration sync endpoints are designed for one job: bring a connected third-party system into agreement with FieldCamp on demand. Four routes are available:
POST /api/v1/integrations/google-calendar/sync— trigger a Google Calendar sync.GET /api/v1/integrations/google-calendar/sync— pull the incremental changes since the last successful run.GET /api/v1/integrations/google-calendar/status— read the current connection and sync state.POST /api/v1/integrations/outlook-calendar/sync— trigger an Outlook calendar sync.POST /api/v1/integrations/quickbooks/sync— trigger a bidirectional QuickBooks Online sync.
All of these endpoints assume the integration has already been connected in the FieldCamp web app under Integrations. If the connection is missing or the OAuth token has expired, FieldCamp returns the standard INTEGRATION_NOT_CONNECTED error described in Errors.
Most production integrations should rely on FieldCamp's scheduled background sync. Reserve manual triggers for user-initiated actions ("Refresh now") or webhook-driven flows. To know exactly when to fire a sync, subscribe to FieldCamp events using Webhooks.
Authentication and headers
Every calendar sync API call uses the same bearer-token authentication as the rest of the FieldCamp API. Mutating endpoints (the POST triggers) should be sent with an idempotency key so retries are safe.
Generate an API key
Create or rotate a key in your FieldCamp workspace. Step-by-step setup is covered in Authentication, and the underlying API keys resource lets you script key rotation.
Add headers to every call
Include Authorization: Bearer <token>. These triggers take no request body, so Content-Type and an Idempotency-Key are unnecessary — nothing on the v1 surface reads an idempotency header today (see Idempotency).
Respect rate limits
Sync triggers count toward your account's request quota. See Rate limits for current ceilings and recommended backoff.
Handle the connection error
If an integration is not connected, FieldCamp returns INTEGRATION_NOT_CONNECTED. Send the user back to Connect Google Calendar and Outlook to FieldCamp or Connect QuickBooks, Xero and Wave to FieldCamp before retrying.
Trigger a Google Calendar sync
POST /api/v1/integrations/google-calendar/sync enqueues a sync between FieldCamp visits and the connected Google Calendar account. It is the API equivalent of clicking "Sync now" in the integration settings — the same control surfaced in Calendar sync and preferences.
Use this trigger after any action that changes a visit time or assignee — for example, a dispatcher reschedule, an AI Dispatcher suggestion being accepted, or a route optimization run. A typical request looks like:
POST /api/v1/integrations/google-calendar/sync HTTP/1.1
Host: api.fieldcamp.ai
Authorization: Bearer <api_key>This trigger takes no request body and no parameters — there is no mode, and no Idempotency-Key is read (see Idempotency). The sync window comes from the token FieldCamp stores from the last run, so every call is effectively incremental.
It runs synchronously and returns the counts, not a job you poll:
{
"success": true,
"data": { "created": 4, "updated": 12, "deleted": 0, "errors": 0 }
}Pair the trigger call with Live team tracking so dispatch, the technician's phone calendar, and Google Calendar all reflect the same source of truth within seconds.
Pull incremental Google Calendar changes
GET /api/v1/integrations/google-calendar/sync returns the events that have changed in Google Calendar since the last successful incremental sync. This is the right endpoint when you want to mirror Google-side changes into your own system without rebuilding the entire calendar.
GET /api/v1/integrations/google-calendar/sync?since=2026-05-29T13:00:00Z HTTP/1.1
Host: api.fieldcamp.ai
Authorization: Bearer <api_key>The response is a paginated list of change records, each with an action (created, updated, or deleted), the FieldCamp visit ID where applicable, and the Google event ID. Use the returned next_cursor for any subsequent page. Combine the data you get back with the Visits API to keep your own scheduling view in lockstep with FieldCamp's calendar.
Read Google Calendar status
GET /api/v1/integrations/google-calendar/status tells you whether the connection is healthy and when the last sync ran. Call it before triggering a sync so you can short-circuit if the integration is disconnected.
{
"success": true,
"data": {
"connected": true,
"email": "dispatch@example.com",
"lastSyncAt": "2026-05-29T14:05:11Z",
"calendarId": "primary"
}
}Those four fields are the whole response. There is no scheduled-sync time, no active job id and no errors array — a sync either succeeds and returns its counts, or fails with an error envelope.
When connected is false, treat it the same as receiving INTEGRATION_NOT_CONNECTED on a trigger call — guide the user back into the integration settings to reconnect.
Trigger an Outlook calendar sync
POST /api/v1/integrations/outlook-calendar/sync mirrors the Google Calendar trigger pattern for Microsoft 365 / Outlook calendars. It is especially useful for service businesses whose field crews live in Outlook. After scheduling jobs through the Job Tray and dispatch workflow, call this endpoint to push fresh visit details to each technician's mailbox.
POST /api/v1/integrations/outlook-calendar/sync HTTP/1.1
Host: api.fieldcamp.ai
Authorization: Bearer <api_key>Like the Google trigger it takes no body and no mode, runs synchronously, and returns counts rather than a job descriptor. An unconnected integration returns INTEGRATION_NOT_CONNECTED.
Trigger a QuickBooks sync
POST /api/v1/integrations/quickbooks/sync confirms your QuickBooks connection and acknowledges the request:
{ "success": true, "data": { "message": "QuickBooks sync triggered", "status": "queued" } }This endpoint is an acknowledgement, not the sync
It verifies that a QuickBooks integration exists and returns the response above.
It does not itself move any data, and status: "queued" is a fixed string rather
than a job you can poll — there is no job id and no status endpoint to follow up on.
The actual sync — clients as customers, invoices posting, payment status reconciling, and taxes mapping to your QuickBooks tax codes — runs in FieldCamp's QuickBooks service on its own schedule, outside this API. If you need a caller-triggered sync you can observe, tell us; today this call is best treated as a connectivity check.
POST /api/v1/integrations/quickbooks/sync HTTP/1.1
Host: api.fieldcamp.ai
Authorization: Bearer <api_key>The scope body this page used to show is not read
The QuickBooks trigger takes no request body. An earlier version of this page showed
a { "scope": "all" } payload; sending it is harmless but has no effect.
{
"scope": "all"
}The real QuickBooks work — walking customers, items, invoices and payments — runs in
FieldCamp's QuickBooks service on its own schedule. This call returns immediately
either way, so there is nothing to poll and no 409 from a repeat trigger. Avoid
calling it in a tight loop all the same; it counts against your rate limit.
Error handling
Sync endpoints use the standard FieldCamp error envelope documented in Errors. Two responses deserve special attention:
INTEGRATION_NOT_CONNECTED— the requested integration is missing, never authorized, or its OAuth token has been revoked. Surface the user to the setup flow in Apps and integrations: all FieldCamp connections.429 Too Many Requests— you have exceeded the per-key rate limit. See Rate limits. These endpoints do not return409; a repeat trigger is accepted rather than rejected as a conflict.
Wrap sync triggers in idempotency keys so retries never duplicate work.
Subscribe to FieldCamp events so your code knows exactly when to fire a sync.
Best practices for production
A few patterns that hold up well in real deployments:
- Trigger on user intent, not on a timer. Let scheduled jobs rely on FieldCamp's built-in cadence and reserve manual triggers for "Refresh now" buttons or webhook handlers — subscribe via webhook events to know when source data changed.
- Read the counts the trigger returns. The calendar triggers run synchronously and hand back
created,updated,deletedanderrors, so you do not need to poll — a non-zeroerrorsis your signal to investigate. Use the status endpoint to check the connection is healthy before you trigger. - Batch related changes. If your code adjusts ten visits in a row, trigger one calendar sync at the end instead of one per visit.
- Log the counts. Keeping a record of what each run created, updated and deleted makes drift easy to spot before users notice. There is no job id to log — these calls are not queued jobs.
Troubleshooting
If a sync returns an error or never completes, work through these checks before opening a support ticket. End users can follow a similar flow in Troubleshooting common issues and fixes.
- Call the status endpoint. If
connectedisfalse, reconnect the integration first. - Check that the user who owns the OAuth grant still has access in Google, Microsoft, or Intuit.
- Treat
409as "a sync is already running" — wait, then poll status. - Read the
errorsarray on the status response; codes there map to entries in Errors. - As a last resort, disconnect and reconnect to mint fresh OAuth tokens.
FAQs
Do I need to call the trigger endpoint at all? No. FieldCamp runs scheduled background syncs on a regular cadence. The trigger endpoints exist for the moments when waiting is not acceptable — user-initiated refreshes or webhook-driven flows.
What happens if I call the trigger while one is already running?
You'll get a 409 Conflict. Poll the status endpoint until the active job clears, then retry. Idempotency keys do not bypass this guard.
How do I know if a customer has connected QuickBooks?
Call GET /api/v1/integrations/google-calendar/status for calendars and the analogous status route for accounting. If connected is false, point the user at Connect QuickBooks, Xero and Wave to FieldCamp.
Can I run a full Google Calendar sync from the API?
No. The trigger takes no parameters, so there is no full-versus-incremental choice — every call syncs from the point the last one reached. If you need a rebuild, disconnect and reconnect the calendar in Settings, which resets the stored sync point. (Historically this page described a "mode": "full" body; no such parameter exists — sending one is ignored because the route reads no body at all.) Anything further-time connections, recovery after a long disconnect, or suspected drift.
Where do I see the changelog for these endpoints? Endpoint additions, deprecations, and field changes are recorded in the API changelog.
Endpoints
These are the customer-callable integration endpoints. POST /api/v1/integrations/google-calendar/webhook also exists but is Google's push-notification receiver — it is unauthenticated by design and is not something your integration calls.
/api/v1/integrations/google-calendar/statusAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X GET "https://example.com/api/v1/integrations/google-calendar/status"{}/api/v1/integrations/google-calendar/syncAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X GET "https://example.com/api/v1/integrations/google-calendar/sync"{}/api/v1/integrations/google-calendar/syncAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X POST "https://example.com/api/v1/integrations/google-calendar/sync"{}/api/v1/integrations/outlook-calendar/syncAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X GET "https://example.com/api/v1/integrations/outlook-calendar/sync"{}/api/v1/integrations/outlook-calendar/syncAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X POST "https://example.com/api/v1/integrations/outlook-calendar/sync"{}/api/v1/integrations/quickbooks/syncAuthorization
BearerAuth JWT from POST /api/auth/login (response.data.token). Tokens do not expire.
In: header
Response Body
application/json
application/json
curl -X POST "https://example.com/api/v1/integrations/quickbooks/sync"{}Related articles
- Apps and integrations: all FieldCamp connections
- Connect Google Calendar and Outlook to FieldCamp
- Connect QuickBooks, Xero and Wave to FieldCamp
- Calendar sync and preferences
- API quickstart
- Authentication
- API keys resource
- Idempotency
- Rate limits
- Webhooks
- Webhook events catalog
- Errors
- Visits API
- API changelog
Managing FieldCamp API keys: create, scope, and rotate
Create, scope, rotate, and revoke FieldCamp API keys with /api/v1/api-keys to give every integration its own credentials.
Invoices | FieldCamp API
Use the FieldCamp Invoices API to create, list, update, void, and collect on v1 invoices with line items, discounts, markup, and Stripe payment links.