VacuPump API V1
Selecting A Cluster
Section titled “Selecting A Cluster”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.comhttps://us-east-2.autoblowapi.comhttps://us-west-1.autoblowapi.comhttps://us-west-2.autoblowapi.comhttps://ca-central-1.autoblowapi.comhttps://ap-southeast-2.autoblowapi.comhttps://eu-west-2.autoblowapi.comhttps://eu-central-1.autoblowapi.comEvery 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.
Online Mode
Section titled “Online Mode”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.
Basic Requests
Section titled “Basic Requests”GET /vacupump/connected
Section titled “GET /vacupump/connected”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.
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 /vacupump/info
Section titled “GET /vacupump/info”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).
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 /vacupump/state
Section titled “GET /vacupump/state”Get the current device state.
curl --request GET \ --url https://eu-central-1.autoblowapi.com/vacupump/state \ --header 'x-device-token: YOUR_DEVICE_TOKEN'PUT /vacupump/state-updates
Section titled “PUT /vacupump/state-updates”Enable or disable periodic state-updated events on the event stream.
| name | required | type | description |
|---|---|---|---|
| enabled (body) | yes | bool | Whether to stream state updates |
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 }Manual Commands
Section titled “Manual Commands”Vacuum values are in kPa and negative, from -60 to 0.
PUT /vacupump/manual/target
Section titled “PUT /vacupump/manual/target”| name | required | type | description |
|---|---|---|---|
| targetVacuumKpa (body) | yes | number | Target vacuum in kPa (-60 to 0) |
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}'PUT /vacupump/manual/start
Section titled “PUT /vacupump/manual/start”Start holding the manual target vacuum. No body.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/manual/start \ --header 'x-device-token: YOUR_DEVICE_TOKEN'PUT /vacupump/manual/stop
Section titled “PUT /vacupump/manual/stop”Stop Manual and return to idle. The pump turns the motor off and closes its valves, so it keeps the current vacuum. No body.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/manual/stop \ --header 'x-device-token: YOUR_DEVICE_TOKEN'Pulse Commands
Section titled “Pulse Commands”PUT /vacupump/pulse/config
Section titled “PUT /vacupump/pulse/config”| name | required | type | description |
|---|---|---|---|
| pumpVacuumKpa (body) | yes | number | Vacuum during the pump phase (-60 to 0) |
| restVacuumKpa (body) | yes | number | Vacuum during the rest phase (-60 to 0) |
| holdPumpMs (body) | yes | number | Pump phase duration in ms (0 to 600000) |
| holdRestMs (body) | yes | number | Rest phase duration in ms (0 to 600000) |
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.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/pulse/start \ --header 'x-device-token: YOUR_DEVICE_TOKEN'Stroke Commands
Section titled “Stroke Commands”PUT /vacupump/stroke/config
Section titled “PUT /vacupump/stroke/config”| name | required | type | description |
|---|---|---|---|
| vacuumTargetKpa (body) | yes | number | Vacuum target in kPa (-60 to 0) |
| pressureTargetKpa (body) | yes | number | Pressure target in kPa (-60 to 60) |
| speedPct (body) | yes | number | Stroke speed in percent (10 to 100) |
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.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/stroke/start \ --header 'x-device-token: YOUR_DEVICE_TOKEN'Workout Commands
Section titled “Workout Commands”Workouts are installed from the Autoblow app and stored on the device in 10 slots.
GET /vacupump/workout/list
Section titled “GET /vacupump/workout/list”Lists all 10 slots; exists is false for an empty slot.
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}PUT /vacupump/workout/start
Section titled “PUT /vacupump/workout/start”| name | required | type | description |
|---|---|---|---|
| slot (body) | yes | number | Slot to play (1-10) |
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.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/workout/pause \ --header 'x-device-token: YOUR_DEVICE_TOKEN'Sync Script Commands
Section titled “Sync Script Commands”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 }.
Script format
Section titled “Script format”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,150000HOLD,30000,-10PULSE,60000,-10,3000,-30,3000STROKE,30000,-20,5,40REST,30000| line | description |
|---|---|
HOLD,duration_ms,vacuum_kpa | Hold a vacuum target |
PULSE,duration_ms,first_kpa,first_ms,second_kpa,second_ms | Alternate between two vacuum targets; each phase lasts 30 to 600000 ms |
STROKE,duration_ms,vacuum_kpa,pressure_kpa,speed_pct | Stroke between vacuum and pressure targets at 10 to 100 percent speed |
REST,duration_ms | Release 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 }]GET /vacupump/sync-script/supported
Section titled “GET /vacupump/sync-script/supported”Tells you whether the connected firmware can play sync scripts.
curl --request GET \ --url https://eu-central-1.autoblowapi.com/vacupump/sync-script/supported \ --header 'x-device-token: YOUR_DEVICE_TOKEN'{ "supported": true }PUT /vacupump/sync-script/load-token
Section titled “PUT /vacupump/sync-script/load-token”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.
| name | required | type | description |
|---|---|---|---|
| scriptToken (body) | yes | string | Token returned by an upload ([A-Za-z0-9_-]) |
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.
| name | required | type | description |
|---|---|---|---|
| exercises (body) | yes | array | 1 to 1,000 exercise objects (see script format) |
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}]}'PUT /vacupump/sync-script/start
Section titled “PUT /vacupump/sync-script/start”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.
| name | required | type | description |
|---|---|---|---|
| startTimeMs (body) | yes | number | Video position in ms |
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}'PUT /vacupump/sync-script/stop
Section titled “PUT /vacupump/sync-script/stop”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.
curl --request PUT \ --url https://eu-central-1.autoblowapi.com/vacupump/sync-script/stop \ --header 'x-device-token: YOUR_DEVICE_TOKEN'PUT /vacupump/sync-script/offset
Section titled “PUT /vacupump/sync-script/offset”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.
| name | required | type | description |
|---|---|---|---|
| offsetTimeMs (body) | yes | number | -10000 to 10000 ms; positive means the device runs ahead of the video |
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}'GET /vacupump/sync-script/info/:token
Section titled “GET /vacupump/sync-script/info/:token”Returns a stored script. Responds 404 when the token is unknown or expired.
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 } ]}Settings
Section titled “Settings”GET /vacupump/settings, PUT /vacupump/settings
Section titled “GET /vacupump/settings, PUT /vacupump/settings”| name | required | type | description |
|---|---|---|---|
| units (body) | yes | number | 0 imperial, 1 metric |
| lcdBrightnessLevel (body) | yes | number | Display brightness (1 to 10) |
The body is only for PUT. Both respond with the settings.
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 }Firmware
Section titled “Firmware”GET /vacupump/firmware/update-info
Section titled “GET /vacupump/firmware/update-info”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.
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." } }Device Events
Section titled “Device Events”GET /events/stream?deviceToken=...
Section titled “GET /events/stream?deviceToken=...”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.
curl --no-buffer \ --url 'https://eu-central-1.autoblowapi.com/events/stream?deviceToken=YOUR_DEVICE_TOKEN'event: state-updateddata: {"deviceToken":"YOUR_DEVICE_TOKEN","payload":{"type":"state-updated","data":{"state":{"operationalMode":"IDLE","currentVacuumKpa":-0.4, ...}}}}Device State
Section titled “Device State”| name | type | description |
|---|---|---|
| operationalMode | enum: IDLE, MANUAL, WORKOUTS, WORKOUTS_PAUSED, PULSE, PULSE_PAUSED, STROKE, STROKE_PAUSED, SYNC_PLAYING, SYNC_PAUSED, EMERGENCY_STOP, FIRMWARE_UPDATING | The current operational mode |
| targetVacuumKpa | number | Target vacuum in kPa |
| currentVacuumKpa | number | Measured vacuum in kPa |
| manualElapsedMs | number | Time spent in manual mode |
| pulsePumpVacuumKpa, pulseRestVacuumKpa, pulseHoldPumpMs, pulseHoldRestMs, pulseDirection, pulseTimerMs | number / bool | Pulse configuration and phase |
| strokeVacuumTargetKpa, strokePressureTargetKpa, strokeSpeedPct, strokeDirection | number / bool | Stroke configuration and direction |
| workoutExerciseIndex, workoutExerciseElapsedMs, workoutExerciseRemainingMs, workoutElapsedMs, workoutRemainingMs | number | Running workout progress |
| syncScriptToken | string | Token of the loaded sync script |
| syncScriptLoaded | bool | Whether a sync script is installed |
| syncScriptPositionMs | number | Current video position of the script |
| syncScriptDurationMs | number | Total script duration |
| syncScriptSectionIndex | number | Zero-based active exercise; equal to syncScriptSectionCount when finished |
| syncScriptSectionCount | number | Number of exercises in the script |
| syncScriptOffsetMs | number | Applied 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}Rate Limiting
Section titled “Rate Limiting”Requests are limited per device token. A 429 response means the limit was hit; wait before retrying.