Appio helps businesses add widgets and notifications to their products—without building or maintaining mobile apps, hiring developers, or dealing with app stores.
Learn more about Appio, try our interactive demo, or explore our case studies.
We also offer no-code integrations.
Found an issue or have feedback? Let us know!
Before getting started, you'll need to create an account and obtain your service_id.
There are two integration options for Appio—both functionally identical.
Preview
Install code
<script src="https://cdn.appio.so/v1/appio.js"></script>
<script>
const appio = Appio("svc_00dddddd000000ccccccssssss")
function mobileApp() {
appio.open({
user: "docs-appio-so:[email protected]"
})
}
</script>
<a href="#" onclick="mobileApp()">Mobile APP</a>
Preview
Install code
<script src="https://cdn.appio.so/v1/appio.js"></script>
<a
data-appio="on"
data-service="svc_00dddddd000000ccccccssssss"
data-user="docs-appio-so:[email protected]"
href="#"
>
Mobile APP
</a>
All commands in this documentation are live and ready for testing.
NOTE:
Data is automatically reset every 15 minutes.
This will deactivate the "Appio Docs" service on your device.
All API requests must include an authentication token.
Each registered service is issued a unique authentication token.
You can validate your token by calling the testing endpoint:
Request
curl https://api.appio.so/hi \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
👋
Path
GET /v1/services/{id}
Request
curl -X GET https://api.appio.so/v1/services/svc_00dddddd000000ccccccssssss \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "svc_00dddddd000000ccccccssssss",
"title": "Appio Docs",
"description": "Try out the functionality of Appio by downloading the app.",
"logo_url": "https://cdn.appio.so/app/docs.appio.so/logo.png",
"banner_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg",
"url": "https://docs.appio.so/"
}
Path
PATCH /v1/services/{id}
Request
curl -X PATCH https://api.appio.so/v1/services/svc_00dddddd000000ccccccssssss \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"title":"New service title"}'
Request body
{
"title": "New service title"
}
Response
HTTP Code: 200
{
"id": "svc_00dddddd000000ccccccssssss"
}
Path
GET /v1/devices
Request
curl -X GET https://api.appio.so/v1/devices \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "dvc_01jmpmh9fvxgyym44sqanjr9hs",
"user_id": "docs-appio-so:[email protected]",
"name": "iPhone 13",
"platform": "ios",
"os_version": "18.3",
"model": "iPhone",
"device_token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"notifications_enabled": true,
"device_identifier": "iPhone14,5",
"marketing_name": "iPhone 13"
},
...
]
Path
GET /v1/devices/{id}
Request
curl -X GET https://api.appio.so/v1/devices/dvc_01jmpmh9fvxgyym44sqanjr9hs \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "dvc_01jmpmh9fvxgyym44sqanjr9hs",
"user_id": "docs-appio-so:[email protected]",
"name": "iPhone 13",
"platform": "ios",
"os_version": "18.3",
"model": "iPhone",
"device_token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"notifications_enabled": true,
"device_identifier": "iPhone14,5",
"marketing_name": "iPhone 13"
}
Deactivate a device when it should no longer receive notifications or when its associated user has been deactivated.
Path
DELETE /v1/devices/{id}
Request
curl -X DELETE https://api.appio.so/v1/devices/dvc_01jmpmh9fvxgyym44sqanjr9hs \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "dvc_01jmpmh9fvxgyym44sqanjr9hs"
}
Deactivate all of a user’s devices when they should no longer receive notifications or when the user has been deactivated.
Path
DELETE /v1/devices?user_id={user_id}
Request
curl -X DELETE https://api.appio.so/v1/devices?user_id=docs-appio-so%3Ahi%40appio.so \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "dvc_01jmpmh9fvxgyym44sqanjr9hs"
},
...
]
If both device_id and user_id are provided, only device_id is used.
Path
GET /v1/notifications
Request
curl -X GET https://api.appio.so/v1/notifications \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v",
"service_id": "svc_00dddddd000000ccccccssssss",
"status": "completed",
"payload": {
"link": "https://docs.appio.so",
"title": "Notification",
"message": "Hello from Appio Docs",
"image_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg"
},
"scheduled_at": "2025-03-24T14:23:37.016526Z"
},
...
]
Path
GET /v1/notifications?status=completed
Request
curl -X GET https://api.appio.so/v1/notifications?status=completed \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v",
"service_id": "svc_00dddddd000000ccccccssssss",
"status": "completed",
"payload": {
"link": "https://docs.appio.so",
"title": "Notification",
"message": "Hello from Appio Docs",
"image_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg"
},
"scheduled_at": "2025-03-24T14:23:37.016526Z"
},
...
]
Path
GET /v1/notifications?device_id={device_id}
Request
curl -X GET https://api.appio.so/v1/notifications?device_id=dvc_01jmpmh9fvxgyym44sqanjr9hs \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v",
"service_id": "svc_00dddddd000000ccccccssssss",
"status": "completed",
"payload": {
"link": "https://docs.appio.so",
"title": "Notification",
"message": "Hello from Appio Docs",
"image_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg"
},
"scheduled_at": "2025-03-24T14:23:37.016526Z"
},
...
]
Path
GET /v1/notifications?user_id={user_id}
Request
curl -X GET https://api.appio.so/v1/notifications?user_id=docs-appio-so%3Ahi%40appio.so \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v",
"service_id": "svc_00dddddd000000ccccccssssss",
"status": "completed",
"payload": {
"link": "https://docs.appio.so",
"title": "Notification",
"message": "Hello from Appio Docs",
"image_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg"
},
"scheduled_at": "2025-03-24T14:23:37.016526Z"
},
...
]
View a notification's details, including its sending status.
Each notification may be delivered to multiple devices.
Path
GET /v1/notifications/{id}
Request
curl -X GET https://api.appio.so/v1/notifications/ntf_01jmpmgb6my0s57c960q1s862v \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v",
"service_id": "svc_00dddddd000000ccccccssssss",
"status": "completed",
"payload": {
"link": "https://docs.appio.so",
"title": "Notification",
"message": "Hello from Appio Docs",
"image_url": "https://cdn.appio.so/app/docs.appio.so/banner.jpg"
},
"scheduled_at": "2025-03-24T14:23:37.016526Z",
"delivery_stats": {
"total": 1,
"created": 0,
"queued": 0,
"completed": 1,
"failed": 0
}
}
Path
POST /v1/notifications
Request
curl -X POST https://api.appio.so/v1/notifications \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"payload":{"title":"Notification","message":"Hello from Appio Docs"}}'
Request body
{
"payload": {
"title": "Notification",
"message": "Hello from Appio Docs"
}
}
Response
HTTP Code: 201
{
"id": "ntf_01jv7938vhvsccakmeq7c1hcy8"
}
The User's Device must be active.
Sends a notification to all active devices belonging to this user.
Path
POST /v1/notifications?user_id={user_id}
Request
curl -X POST https://api.appio.so/v1/notifications?user_id=docs-appio-so%3Ahi%40appio.so \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"payload":{"title":"Notification","message":"Hello from Appio Docs"},"scheduled_at":""}'
Request body
{
"payload": {
"title": "Notification",
"message": "Hello from Appio Docs"
},
"scheduled_at": ""
}
Response
HTTP Code: 201
{
"id": "ntf_01jv7akwwbj47rf3je11jgpvvf"
}
The Device has to be active.
Path
POST /v1/notifications?device_id={device_id}
Request
curl -X POST https://api.appio.so/v1/notifications?device_id=dvc_01jmpmh9fvxgyym44sqanjr9hs \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"payload":{"title":"Notification","message":"Hello from Appio Docs"}}'
Request body
{
"payload": {
"title": "Notification",
"message": "Hello from Appio Docs"
}
}
Response
HTTP Code: 201
{
"id": "ntf_01jmpmgb6my0s57c960q1s862v"
}
A widget consists of a template (created via the WYSIWYG editor) and your data source that you link to the template.
Path
POST /v1/widgets
Request
curl -X POST https://api.appio.so/v1/widgets \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"template":"number","source":{"data":"123","type":"static"}}'
Request body
{
"template": "number",
"source": {
"data": "123",
"type": "static"
}
}
Response
HTTP Code: 201
{
"id": "wgt_01jmpr3vt1008txv1jehgdeny7"
}
Path
GET /v1/widgets
Request
curl -X GET https://api.appio.so/v1/widgets \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
[
{
"id": "wgt_01jmpr3vt1008txv1jehgdeny7",
"service_id": "svc_00dddddd000000ccccccssssss",
"template": "number",
"source": {
"type": "static",
"data": "123"
}
},
...
]
Path
GET /v1/widgets/{id}
Request
curl -X GET https://api.appio.so/v1/widgets/wgt_01jmpr3vt1008txv1jehgdeny7 \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "wgt_01jmpr3vt1008txv1jehgdeny7",
"service_id": "svc_00dddddd000000ccccccssssss",
"template": "number",
"source": {
"type": "static",
"data": "123"
}
}
Path
PATCH /v1/widgets/{id}
Request
curl -X PATCH https://api.appio.so/v1/widgets/wgt_01jmpr3vt1008txv1jehgdeny7 \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" \
-H "Content-Type: application/json" \
-d '{"template":"ring","source":{"data":"65","type":"static"}}'
Request body
{
"template": "ring",
"source": {
"data": "65",
"type": "static"
}
}
Response
HTTP Code: 200
{
"id": "wgt_01jmpr3vt1008txv1jehgdeny7"
}
Delete a widget when you no longer want to offer it to your users.
Path
DELETE /v1/widgets/{id}
Request
curl -X DELETE https://api.appio.so/v1/widgets/wgt_01jmpr3vt1008txv1jehgdeny7 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A"
Response
HTTP Code: 200
{
"id": "wgt_01jmpr3vt1008txv1jehgdeny7"
}
LLM-friendly content for AI agents is available at /llms.txt.