Skip to content

VacuPump API V1

The VacuPump API is hosted on multiple clusters around the world. When a device goes online it will connect to the lowest latency server. To control the device you must connect to the same cluster as the device. You can find the cluster your device is connected to by checking the cluster property in the /vacupump/connected response.

https://us-east-1.autoblowapi.com
https://us-east-2.autoblowapi.com
https://us-west-1.autoblowapi.com
https://us-west-2.autoblowapi.com
https://ca-central-1.autoblowapi.com
https://ap-southeast-2.autoblowapi.com
https://eu-west-2.autoblowapi.com
https://eu-central-1.autoblowapi.com

Every request below takes the device token in the x-device-token header. Requests with a body use Content-Type: application/json; send requests without a body without a Content-Type header. Most commands respond with the device state; the ones that return something else say so. The examples use the eu-central-1 cluster and YOUR_DEVICE_TOKEN.

The VacuPump only takes commands while its Online screen is open. It connects to its cluster when the user opens that screen and disconnects when they leave it. While it is disconnected, /vacupump/connected returns { "connected": false } and commands fail with 502.

Check if a device is connected and get the cluster it is connected to. This request can be performed on any cluster but for reliability purposes we recommend using https://latency.autoblowapi.com which will connect you to the cluster with the lowest latency. All the other requests can only be performed on the cluster the device is connected to.

Terminal window
curl --request GET \
--url https://latency.autoblowapi.com/vacupump/connected \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{ "connected": true, "cluster": "eu-central-1.autoblowapi.com", "deviceType": "vacupump" }

Get the firmware and hardware version, the device MAC and the capabilities the firmware advertised when it connected. Video sync is only available when the capabilities array contains { "key": "sync_script", "value": "1" } (firmware 1.01 or newer).

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/info \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{
"firmwareStatus": "UP_TO_DATE",
"firmwareVersion": 1.01,
"firmwareBranch": "prod",
"hardwareVersion": "vacupump",
"mac": "aa:bb:cc:dd:ee:ff",
"deviceType": "vacupump",
"capabilities": [{ "key": "sync_script", "value": "1" }]
}

Get the current device state.

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/state \
--header 'x-device-token: YOUR_DEVICE_TOKEN'

Enable or disable periodic state-updated events on the event stream.

namerequiredtypedescription
enabled
(body)
yesboolWhether to stream state updates
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/state-updates \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"enabled": true}'
{ "success": true }

Vacuum values are in kPa and negative, from -60 to 0.

namerequiredtypedescription
targetVacuumKpa
(body)
yesnumberTarget vacuum in kPa (-60 to 0)
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/manual/target \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"targetVacuumKpa": -20}'

Start holding the manual target vacuum. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/manual/start \
--header 'x-device-token: YOUR_DEVICE_TOKEN'

Stop Manual and return to idle. The pump turns the motor off and closes its valves, so it keeps the current vacuum. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/manual/stop \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
namerequiredtypedescription
pumpVacuumKpa
(body)
yesnumberVacuum during the pump phase (-60 to 0)
restVacuumKpa
(body)
yesnumberVacuum during the rest phase (-60 to 0)
holdPumpMs
(body)
yesnumberPump phase duration in ms (0 to 600000)
holdRestMs
(body)
yesnumberRest phase duration in ms (0 to 600000)
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/pulse/config \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"pumpVacuumKpa": -30, "restVacuumKpa": -5, "holdPumpMs": 10000, "holdRestMs": 10000}'

PUT /vacupump/pulse/start, /vacupump/pulse/pause, /vacupump/pulse/stop

Section titled “PUT /vacupump/pulse/start, /vacupump/pulse/pause, /vacupump/pulse/stop”

Start or pause pulsing with the configured values. stop does the same as pause: the pump stays in PULSE_PAUSED and keeps the current vacuum. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/pulse/start \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
namerequiredtypedescription
vacuumTargetKpa
(body)
yesnumberVacuum target in kPa (-60 to 0)
pressureTargetKpa
(body)
yesnumberPressure target in kPa (-60 to 60)
speedPct
(body)
yesnumberStroke speed in percent (10 to 100)
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/stroke/config \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"vacuumTargetKpa": -20, "pressureTargetKpa": 5, "speedPct": 40}'

PUT /vacupump/stroke/start, /vacupump/stroke/pause, /vacupump/stroke/stop

Section titled “PUT /vacupump/stroke/start, /vacupump/stroke/pause, /vacupump/stroke/stop”

Start or pause stroking with the configured values. stop does the same as pause: the pump stays in STROKE_PAUSED and keeps the current vacuum. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/stroke/start \
--header 'x-device-token: YOUR_DEVICE_TOKEN'

Workouts are installed from the Autoblow app and stored on the device in 10 slots.

Lists all 10 slots; exists is false for an empty slot.

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/workout/list \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{
"items": [
{
"slotIndex": 1,
"exists": true,
"workoutUuid": "5b00d2fe-62da-440b-8405-a6689c4ddec0",
"name": "Quickie",
"description": "Daily maintenance workout for those short on time. 10 minutes long peaking at 6 inHg.",
"durationMs": 600000,
"exerciseCount": 14
}
],
"totalSlots": 10
}
namerequiredtypedescription
slot
(body)
yesnumberSlot to play (1-10)
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/workout/start \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"slot": 1}'

PUT /vacupump/workout/pause, /vacupump/workout/resume

Section titled “PUT /vacupump/workout/pause, /vacupump/workout/resume”

Pause or resume the running workout. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/workout/pause \
--header 'x-device-token: YOUR_DEVICE_TOKEN'

Sync scripts play a video-synchronised sequence of pressure exercises on the device. Unlike the Ultra and Vacuglide, the VacuPump does not play funscripts: a VacuPump sync script is a list of consecutive HOLD, PULSE, STROKE and REST exercises whose start times are the sum of the preceding durations. The firmware documentation calls these sections, which is why the device state reports syncScriptSectionIndex and syncScriptSectionCount.

Video sync requires firmware 1.01 or newer. Check the sync_script capability in /vacupump/info or call /vacupump/sync-script/supported; on older firmware the calls that drive the pump (load-token, upload-exercises, start, stop, offset) fail with 400, and supported returns { "supported": false }.

Scripts are sent to the API as JSON exercises (below). The backend compiles them into the plain-text file the device downloads, shown here for reference. The first line is a header with the format version, the exercise count and the total duration in milliseconds; both must match the exercises exactly. Vacuum is negative kPa.

VACUPUMP_SYNC,1,4,150000
HOLD,30000,-10
PULSE,60000,-10,3000,-30,3000
STROKE,30000,-20,5,40
REST,30000
linedescription
HOLD,duration_ms,vacuum_kpaHold a vacuum target
PULSE,duration_ms,first_kpa,first_ms,second_kpa,second_msAlternate between two vacuum targets; each phase lasts 30 to 600000 ms
STROKE,duration_ms,vacuum_kpa,pressure_kpa,speed_pctStroke between vacuum and pressure targets at 10 to 100 percent speed
REST,duration_msRelease the vacuum

Limits: at most 1,000 exercises, 128 KiB, 24 hours in total, durations above 0, vacuum -60 to 0 kPa, stroke pressure -60 to 60 kPa and at least 0.1 kPa above its vacuum target. Out-of-range values are rejected, not clamped.

The JSON form of the same script, as sent to /vacupump/sync-script/upload-exercises:

[
{ "type": "HOLD", "durationMs": 30000, "vacuumKpa": -10 },
{ "type": "PULSE", "durationMs": 60000, "pulse1Kpa": -10, "pulse1Ms": 3000, "pulse2Kpa": -30, "pulse2Ms": 3000 },
{ "type": "STROKE", "durationMs": 30000, "vacuumTargetKpa": -20, "pressureTargetKpa": 5, "speedPct": 40 },
{ "type": "REST", "durationMs": 30000 }
]

Tells you whether the connected firmware can play sync scripts.

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/supported \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{ "supported": true }

Loads a previously uploaded script by token. The device downloads, validates and installs the script before responding, so allow a request timeout of at least 60 seconds. Loading never starts playback; the device ends in SYNC_PAUSED with the position at zero. If Manual, Pulse, Stroke or a workout is running, loading stops it first and releases the vacuum.

namerequiredtypedescription
scriptToken
(body)
yesstringToken returned by an upload ([A-Za-z0-9_-])
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/load-token \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"scriptToken": "7a93bfc5-4043-4ade-aee5-bec8012b0e12"}'

PUT /vacupump/sync-script/upload-exercises

Section titled “PUT /vacupump/sync-script/upload-exercises”

Stores the exercises under a new token and loads them on the device. The token is returned in the syncScriptToken field of the device state and stays valid for 9 days.

namerequiredtypedescription
exercises
(body)
yesarray1 to 1,000 exercise objects (see script format)
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/upload-exercises \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"exercises": [{"type": "HOLD", "durationMs": 30000, "vacuumKpa": -10}, {"type": "REST", "durationMs": 30000}]}'

Starts, resumes or seeks to a video position. Send it whenever the video starts playing or the user seeks; re-sending the current position to correct drift is fine. A start at or beyond the script duration completes immediately and releases the vacuum.

namerequiredtypedescription
startTimeMs
(body)
yesnumberVideo position in ms
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/start \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"startTimeMs": 24000}'

Pauses playback: freezes the position and releases the vacuum. The script stays loaded, so a later start resumes or seeks without downloading again. No body.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/stop \
--header 'x-device-token: YOUR_DEVICE_TOKEN'

Compensates the network latency between your player and the device. The offset stays set across script loads until the device restarts, so set it once per connection.

namerequiredtypedescription
offsetTimeMs
(body)
yesnumber-10000 to 10000 ms; positive means the device runs ahead of the video
Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/offset \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"offsetTimeMs": 100}'

Returns a stored script. Responds 404 when the token is unknown or expired.

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/sync-script/info/7a93bfc5-4043-4ade-aee5-bec8012b0e12 \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{
"token": "7a93bfc5-4043-4ade-aee5-bec8012b0e12",
"durationMs": 60000,
"exerciseCount": 2,
"exercises": [
{ "type": "HOLD", "durationMs": 30000, "vacuumKpa": -10 },
{ "type": "REST", "durationMs": 30000 }
]
}

GET /vacupump/settings, PUT /vacupump/settings

Section titled “GET /vacupump/settings, PUT /vacupump/settings”
namerequiredtypedescription
units
(body)
yesnumber0 imperial, 1 metric
lcdBrightnessLevel
(body)
yesnumberDisplay brightness (1 to 10)

The body is only for PUT. Both respond with the settings.

Terminal window
curl --request PUT \
--url https://eu-central-1.autoblowapi.com/vacupump/settings \
--header 'Content-Type: application/json' \
--header 'x-device-token: YOUR_DEVICE_TOKEN' \
--data '{"units": 1, "lcdBrightnessLevel": 10}'
{ "units": 1, "lcdBrightnessLevel": 10 }

Returns the newest firmware release this device would be offered. Responds 400 when the device is already up to date. Updates are installed from the Autoblow app.

Terminal window
curl --request GET \
--url https://eu-central-1.autoblowapi.com/vacupump/firmware/update-info \
--header 'x-device-token: YOUR_DEVICE_TOKEN'
{ "branch": "prod", "firmwareVersion": 1.02, "hardwareVersion": "vacupump" }

When the device is up to date:

{ "error": { "code": "Error", "message": "No firmware update version found for this device." } }

Server-sent events. After enabling /vacupump/state-updates the device emits state-updated events whose payload.data.state is the device state. While a sync script plays, syncScriptPositionMs and syncScriptSectionIndex advance with the video.

Terminal window
curl --no-buffer \
--url 'https://eu-central-1.autoblowapi.com/events/stream?deviceToken=YOUR_DEVICE_TOKEN'
event: state-updated
data: {"deviceToken":"YOUR_DEVICE_TOKEN","payload":{"type":"state-updated","data":{"state":{"operationalMode":"IDLE","currentVacuumKpa":-0.4, ...}}}}
nametypedescription
operationalModeenum: IDLE, MANUAL, WORKOUTS, WORKOUTS_PAUSED, PULSE, PULSE_PAUSED, STROKE, STROKE_PAUSED, SYNC_PLAYING, SYNC_PAUSED, EMERGENCY_STOP, FIRMWARE_UPDATINGThe current operational mode
targetVacuumKpanumberTarget vacuum in kPa
currentVacuumKpanumberMeasured vacuum in kPa
manualElapsedMsnumberTime spent in manual mode
pulsePumpVacuumKpa, pulseRestVacuumKpa, pulseHoldPumpMs, pulseHoldRestMs, pulseDirection, pulseTimerMsnumber / boolPulse configuration and phase
strokeVacuumTargetKpa, strokePressureTargetKpa, strokeSpeedPct, strokeDirectionnumber / boolStroke configuration and direction
workoutExerciseIndex, workoutExerciseElapsedMs, workoutExerciseRemainingMs, workoutElapsedMs, workoutRemainingMsnumberRunning workout progress
syncScriptTokenstringToken of the loaded sync script
syncScriptLoadedboolWhether a sync script is installed
syncScriptPositionMsnumberCurrent video position of the script
syncScriptDurationMsnumberTotal script duration
syncScriptSectionIndexnumberZero-based active exercise; equal to syncScriptSectionCount when finished
syncScriptSectionCountnumberNumber of exercises in the script
syncScriptOffsetMsnumberApplied sync offset in ms

Example (Manual holding -20 kPa):

{
"operationalMode": "MANUAL",
"targetVacuumKpa": -20,
"currentVacuumKpa": -19.6,
"manualElapsedMs": 12400,
"pulsePumpVacuumKpa": -30,
"pulseRestVacuumKpa": -5,
"pulseHoldPumpMs": 10000,
"pulseHoldRestMs": 10000,
"pulseDirection": false,
"pulseTimerMs": 10000,
"strokeVacuumTargetKpa": -20,
"strokePressureTargetKpa": 5,
"strokeSpeedPct": 40,
"strokeDirection": false,
"workoutExerciseIndex": 0,
"workoutExerciseElapsedMs": 0,
"workoutExerciseRemainingMs": 0,
"workoutElapsedMs": 0,
"workoutRemainingMs": 0,
"syncScriptToken": "",
"syncScriptLoaded": false,
"syncScriptPositionMs": 0,
"syncScriptDurationMs": 0,
"syncScriptSectionIndex": 0,
"syncScriptSectionCount": 0,
"syncScriptOffsetMs": 100
}

Requests are limited per device token. A 429 response means the limit was hit; wait before retrying.