Developers / Field reference
Everything you can send to SyncroFit
Every option a partner app can put in a workout handoff — the full set of circuit and exercise fields, their types, defaults, and allowed values. Send as many or as few as you like; only a handful are required.
This page is generated from the integration contract (v2, updated 2026-07-23) — the same machine-readable file the iOS app is verified against, so it can never drift from what SyncroFit actually accepts. Fetch that JSON directly if you want to validate against it in your build.
Circuit fields
The top-level workout object (PartnerJSONCircuit). A circuit needs a name and at least one exercise; everything else is optional.
| Field | Type | Description |
|---|---|---|
idrecommended | string? | the partner's OWN circuit id. Echoed back verbatim as circuit.id on every webhook event. Send your share token / routine id so feedback correlates. |
namerequired | string | No additional description |
description | string? | No additional description |
from | { name: string, organization: string }? | creator attribution |
restBetweenExercises | int? | seconds between exercises |
webhookrecommended | string? HTTPS | SyncroFit POSTs import/completion events to THIS url. Per-circuit, not global. REQUIRED for any feedback to flow. Gated by the user's Share-with-partners consent. |
mode | string? | intervals | forTime | amrap | emom (default: intervals) |
amrapMinutes | int? | AMRAP cap, default 12, clamped 1..60 (only when mode=amrap) |
emomMinutes | int? | EMOM cap, default 12, clamped 1..60 (only when mode=emom) |
setOrder | string? | circuit | straightSets (default: circuit). circuit = interleave one set of each exercise per round, then repeat (classic circuit training, current default behavior). straightSets = finish all sets of exercise 1, then all sets of exercise 2, etc. Only meaningful when every exercise's mode is intervals (or omitted) — mixed-mode circuits (any forTime/amrap/emom present) always run sequentially regardless of this field. |
exercisesrequired | PartnerJSONExercise[] | No additional description |
Exercise fields
Each entry in a circuit's exercises array (PartnerJSONExercise).
| Field | Type | Description |
|---|---|---|
namerequired | string | No additional description |
notes | string? | No additional description |
setsrequired | int | No additional description |
repsrequired | int | No additional description |
actionTimerequired | int | seconds of work per rep |
restTimerequired | int | seconds rest between reps within a set (ignored when reps==1) |
betweenSetRest | int? | extra rest after each set (default 0) |
actionImageURL | string? HTTPS jpg/png/gif | work-phase background, downloaded on import, <=10MB |
restImageURL | string? HTTPS | rest/between-set background |
coachVoiceURL | string? HTTPS m4a/mp3 | plays when the exercise becomes active, <=10MB |
requiredEquipment | string[]? | gates SyncroFit's /workouts equipment filter. Use equipmentTaxonomy values. |
optionalEquipment | string[]? | nice-to-have; surfaced but never gates the filter |
mode | string? | per-exercise mode override (default: intervals) |
Equipment values
The canonical names for requiredEquipment and optionalEquipment. Map your app's equipment to these so a workout is found by SyncroFit's /workouts equipment filter.
- No equipment
- Dumbbells
- Kettlebell
- Barbell
- Resistance bands
- Pull-up bar
- Yoga mat
- Bench
- Stability ball
- Medicine ball
- Jump rope
- Foam roller
- TRX / suspension
- Boxing gloves
- Treadmill
- Stationary bike
- Rowing machine
Link formats
How the circuit reaches SyncroFit. All resolve to the same parser — the first two (a URL-encoded circuit) are preferred.
run-scheme-jsonpreferredsyncrofit://run?circuit=<urlencoded PartnerJSONCircuit>run-universal-jsonpreferredhttps://www.mysyncrofit.com/run?circuit=<urlencoded PartnerJSONCircuit>run-inline-paramssyncrofit://run?name=&action=&rest=&sets=&reps=&actionImage=&coachVoice=&id=&webhook=minimal, no JSON
run-remotesyncrofit://run?from=https://partner.example/circuit.jsonSyncroFit fetches the PartnerJSONCircuit from this URL
legacy-importdeprecatedintervaltimer://import-circuit?data=<base64 GroupShareCodec>app-to-app share; does NOT carry a webhook — no feedback. Prefer run-scheme-json.
Building the handoff
This page is the field catalog. For worked examples of assembling a link, the webhook payloads, and the import-dedup rules, see the developer guide →