API documentation
One authenticated POST delivers a notification to every device on an account. No SDK required — if it can make an HTTP request, it can send.
Quick start
- 1 Create an account to get your user key — the address messages are sent to.
- 2 Install the iOS app and sign in, so your device can receive notifications.
- 3 Create an application to get an API token, then send:
curl -s https://veloxipush.planthelper.org/1/messages.json \
-F token=YOUR_APP_TOKEN \
-F user=YOUR_USER_KEY \
-F title='Deploy finished' \
-F message='Build 412 is live.'
Authentication
Every request carries two identifiers. They are different things and both are required.
| Field | What it identifies |
|---|---|
token |
Who is sending. Created per application in your dashboard, so a leaked token can be rotated without touching your other integrations. Treat it as a password. |
user |
Who receives. A user key, or a group key to fan out to a whole team. Safe to share with anyone you want to be able to notify you. |
The token may travel as a normal parameter, or as a bearer header if you prefer:
Authorization: Bearer YOUR_APP_TOKEN
Request bodies may be multipart/form-data,
application/x-www-form-urlencoded
or application/json.
Send a message
POST https://veloxipush.planthelper.org/1/messages.json
A successful call returns:
{"status":1,"request":"9f1c3e2a-…"}
The response comes back as soon as the message is stored and queued — delivery happens
immediately afterwards on a worker, so a slow device never slows down your script.
The request id
is also returned in the X-Request-Id
header; quote it if you ever need to ask about a specific delivery.
Parameters
| Name | Required | Description |
|---|---|---|
token |
required | Your application's API token. |
user |
required | A user key or a group key. |
message |
required | The body. Up to 1024 characters. |
title |
optional | Up to 250 characters. Defaults to the application name. |
priority |
optional | -2 to 2. Defaults to 0. See below. |
sound |
optional | One of the sound names below. |
device |
optional | Comma-separated device names, to target instead of all devices. |
url |
optional | A supplementary URL, up to 512 characters. |
url_title |
optional | Link text shown instead of the raw URL. |
timestamp |
optional | Unix timestamp to display instead of the receipt time. |
ttl |
optional | Seconds after which the message disappears. Ignored for emergency. |
html |
optional | Set to 1 to allow a small subset of HTML in the body. |
monospace |
optional | Set to 1 to render in a monospace font. Cannot combine with html. |
attachment |
optional | An image file, up to 5 MB. |
attachment_base64 |
optional | The same image inline. Requires attachment_type. |
retry |
priority 2 | Seconds between re-deliveries. Minimum 30. |
expire |
priority 2 | Seconds before giving up. Maximum 10800. |
callback |
optional | URL called when an emergency message is acknowledged or expires. |
Priority
Stored and synced to the app, but raises no notification at all. Useful for logging a stream of events you want to browse later.
Shows a banner without sound or vibration.
Normal. Banner and sound, unless the recipient is inside their quiet hours.
Delivered as time-sensitive and bypasses quiet hours.
Emergency. Repeats every retry seconds until acknowledged, or until expire passes. Requires both.
Emergency messages and receipts
A priority 2 message keeps arriving until a human deals with it. The send response
includes a receipt token you can poll, and an optional
callback
URL we POST to the moment it is acknowledged or expires.
# Repeats every 60s for up to an hour, until acknowledged.
curl -s https://veloxipush.planthelper.org/1/messages.json \
-F token=YOUR_APP_TOKEN \
-F user=YOUR_USER_KEY \
-F message='Database primary is down.' \
-F priority=2 \
-F retry=60 \
-F expire=3600
# -> {"status":1,"request":"...","receipt":"aBc123..."}
# Poll whether anyone has acknowledged it yet.
curl -s 'https://veloxipush.planthelper.org/1/receipts/RECEIPT.json?token=YOUR_APP_TOKEN'
Receipt endpoints
| GET | /1/receipts/{token}.json |
Whether it has been acknowledged, by whom, and when. |
| POST | /1/receipts/{token}/cancel.json |
Stop retrying without marking it acknowledged — for when the condition cleared on its own. |
A receipt is only visible to the application that created it.
Attachments and links
Attach a JPEG, PNG, GIF or WebP up to 5 MB, and add a URL the notification can open.
curl -s https://veloxipush.planthelper.org/1/messages.json \
-F token=YOUR_APP_TOKEN \
-F user=YOUR_USER_KEY \
-F title='New signup' \
-F message='<b>Ada Lovelace</b> just started a trial.' \
-F html=1 \
-F url='https://dashboard.example.com/users/42' \
-F url_title='Open in dashboard' \
-F sound=cashregister \
-F attachment=@chart.png
Sounds
Pass any of these as sound.
Also available as JSON from
GET https://veloxipush.planthelper.org/1/sounds.json,
which needs no token.
veloxi
VeloxiPush
bike
Bike
bugle
Bugle
cashregister
Cash Register
classical
Classical
cosmic
Cosmic
falling
Falling
gamelan
Gamelan
incoming
Incoming
intermission
Intermission
magic
Magic
mechanical
Mechanical
pianobar
Piano Bar
siren
Siren
spacealarm
Space Alarm
tugboat
Tug Boat
alien
Alien Alarm
climb
Climb
persistent
Persistent
echo
Echo
updown
Up Down
vibrate
Vibrate Only
none
Silent
Validating a key
Confirm a user or group key exists and has a device attached, before wiring it into something that runs unattended.
curl -s https://veloxipush.planthelper.org/1/users/validate.json \
-F token=YOUR_APP_TOKEN \
-F user=YOUR_USER_KEY
Returns the device names the key can address. A key with no active devices is reported as an error rather than accepting messages that would go nowhere.
Limits and quotas
10,000
messages per application, per month
120/min
requests per application
25
devices per account
50
applications per account
1024
characters per message
5 MB
maximum attachment size
Check what is left with
GET https://veloxipush.planthelper.org/1/apps/limits.json?token=…
Errors
Failures return status: 0
and a list of problems in plain language.
{"status":0,"request":"9f1c3e2a-…","errors":["user is invalid"]}
| Status | Meaning |
|---|---|
400 |
A parameter is missing or invalid. The errors array says which. |
402 |
The recipient has no active subscription. For a group send, unsubscribed members are listed in skipped instead. |
403 |
The application has been disabled. |
404 |
No such receipt for this application. |
429 |
Rate limit or monthly quota exhausted. |
Ready to send your first notification?
Accounts include 30 days free, and you do not need a card to start.
Create your account