Skip to main content

Build an incremental Results sync

Design a repeatable Results feed that handles late uploads, later changes, paging and Checklist revisions without duplicating records.

Written by Logan Bowlby

Overview

An incremental sync copies newly received and changed Results into your reporting system. Use it after the initial export so each run processes a smaller period.

This guide describes a pattern for your integration to implement. Mobaro provides the API; your service owns the schedule, saved checkpoints and destination records. Start with pulling Results via the API for authentication and the response format.

At a glance

Who can do this

Integration developers; Organization › Administrate is required to create the API key.

Where

Configuration › API › API Keys; your integration service

Works on

Public API

Availability

Contact your CSM

💡 Why this matters: A repeatable sync keeps late uploads and later edits visible without creating a second reporting record for the same Result.


Prepare the destination

1. Use a dedicated read-only key

Store the key in your integration’s server-side secret storage and send it in the X-Api-Key header. Keys have organization-wide access. See API access scope.

2. Choose the record identity

Use the Mobaro Result id as your destination key. Update an existing record when that ID appears again. Store the original response or the fields you need, including checklistId, checklistRevision, received and updated.

3. Backfill existing Results

Read the required history through GET /api/customers/results. Use explicit filters and ordering, page through the results and confirm that records reached the destination before recording your first checkpoint.


Use two time windows

For recurring runs, process new arrivals and later changes separately. Keep the same scope filters across runs.

Feed

Filters and order

New arrivals, including late uploads

ReceivedAfter, ReceivedBefore; OrderBy=received

Changes to existing Results

UpdatedAfter, UpdatedBefore; OrderBy=updated

Do not use completion time alone for arrival detection: a device can upload work after it was answered. Do not assume every newly received Result already has an updated timestamp. Merge both feeds by Result ID.

Choose a fixed upper time boundary for each run. Start the next window slightly before its saved checkpoint so boundary records are read again. The API’s Before and After comparisons are exclusive. Overlap and ID-based updates are deliberate parts of this design. Use ISO 8601 timestamps with a time zone.


Page and save reliably

1. Read the whole window

Set Limit=20 and start at Offset=0. Increase the offset by the returned amount. Stop when the page is empty or the accumulated offset reaches total. Results requests allow at most 20 records per page.

2. Persist before advancing

Save each page durably. Only advance that feed’s checkpoint after the entire window succeeds. If a run fails, retry its window and update records by ID again. Use backoff for rate limits and temporary failures.

3. Reconcile periodically

Offset paging is not a frozen snapshot. Records can change while a run is in progress, and equal timestamps are not a unique sort key. Add periodic overlapping re-reads or a broader reconciliation appropriate to your reporting needs. Do not treat one successful page loop as proof that an active dataset was copied exactly once.


Keep meaning and deletions current

To label answers, request the Checklist revision recorded on that Result, with includeContent=true. Match answer question IDs to element IDs, including elements inside groups. Cache content by both Checklist ID and revision; using today’s Checklist can mislabel old answers. See question text and Checklist revisions.

A filtered Results list is not a deletion feed. If your destination must remove deleted records, design a separate deletion process using webhook events and reconciliation. Handle duplicate events and the possibility that a deleted record can no longer be fetched.


Best practices

  • Keep separate checkpoints for received and updated feeds.

  • Log window boundaries, page counts and failures without logging API keys.

  • Test retries, equal timestamps, a late upload and a changed Result before relying on the feed.


Frequently asked questions

How do I get Mobaro data into our reporting tools automatically?

Run an API integration on your side or use an appropriate connector workflow. See pulling Results for the starting options; this guide adds the repeatable sync design.

How do I turn the question IDs into question text?

Fetch the Checklist with includeContent=true and the Result’s checklistRevision, then match element IDs. See the question mapping example.

How do I get a test environment for API development?

Ask your CSM or Support to confirm an appropriate test organization. An API key connects to its organization; creating a key does not itself create a sandbox.

Did this answer your question?