Unified submission API for form data, metadata, attachments, and review state

What high-level problem are you trying to solve?

Our app currently has to reconstruct each submission from multiple ODK endpoints. For one submission we currently need to fetch the main payload, XML-derived operational fields, submission metadata, review comments, attachment inventory, and attachment binaries
separately. That makes sync slower, more fragile, and harder to recover when one call fails.

So we therefore have multiple celery queues and chaijning and logging and backfilling in place.

We actually need to keep versioned copies of data that are linked to downstram data that is generated basedd on these collcedt ODK data.

A unified submission bundle would reduce client complexity, cut round trips, and make retry and backfill behavior much simpler.

Current APIs our app has to call

ODK API What it is used for Fields / data used
Submission list / delta check endpoint Detect changed or missing submissions and run gap checks Submission IDs, timestamps for change detection
OData submission payload endpoint Fetch the actual form answers All form response fields
Submission XML endpoint Fetch operational form metadata FormVersion, DeviceID
Submission metadata endpoint Fetch submission-level operational metadata SubmitterID, instanceID, fallback review metadata
Review comments endpoint Fetch ODK review comments Comment text, reviewer notes, review status
Attachment list endpoint Discover attachment inventory Filename, presence/absence, attachment metadata
Attachment download endpoint Fetch binary attachment files File bytes, content type, ETag / cache metadata
Attachment conditional request / ETag handling Skip unchanged files safely ETag, If-None-Match response handling

Any ideas on how ODK could help you solve it?

A single submission bundle endpoint would be ideal, or a primary submission endpoint with opt-in includes for related data.

The bundle should ideally include:

  • form response payload
  • submission metadata
  • review state and review comments
  • attachment inventory and hashes / ETags
  • form version and device metadata
  • stable submission identity fields

If one endpoint is not feasible, a documented aggregate contract across the existing endpoints would still help a lot.

  • simpler client code
  • fewer network round trips
  • easier retry and backfill logic
  • less risk of partial sync state
  • clearer contract for downstream systems
  • better performance for large batches

A practical shape could be

  • GET /submissions/{id}/bundle
  • or a form-scoped endpoint that supports paging and includes related data:
    • GET /forms/{formId}/submissions?include=metadata,attachments,comments

If a single endpoint is not desirable, a documented aggregate response contract would still be very useful.

Upload any helpful links, sketches, and videos

Our current Sync dashhboard -

Thanks

Vivek