# https://docs.appio.so/ llms-full.txt ## Appio Documentation # Appio documentation ## Overview 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](https://appio.so/), try our [interactive demo](https://demo.appio.so/), or explore our [case studies](https://appio.so/case-studies). We also offer no-code [integrations](https://appio.so/integrations). Found an issue or have feedback? [Let us know!](https://appio.so/contact) ## Getting Started Before getting started, you'll need to [create an account](https://my.appio.so/) and obtain your service\_id. There are two integration options for Appio—both functionally identical. ### Option 1 Preview [Mobile APP](https://docs.appio.so/#) Install code ```html hljs-copy hljs language-xml Mobile APP ``` Appio("svc\_\*\*YOUR\*SERVICE\*ID\*\*")Use your service ID, which was assigned to you during registration. Replace \`svc\_\*\*YOUR\*SERVICE\*ID\*\*\` with your [service id](https://my.appio.so/).userYour user's identifier. Use a non-sequential and non-predictable string to ensure security. Suggestion: Combine your customer's unique ID with their email address. * * * ### Option 2 Preview [Mobile APP](https://docs.appio.so/#) Install code ```html hljs-copy hljs language-xml Mobile APP ``` data-appioActivates Appio. The value is optional and can be omitted.data-serviceUse your service ID, which was assigned to you during registration. Replace \`svc\_\*\*YOUR\*SERVICE\*ID\*\*\` with your [service id](https://my.appio.so/).data-userYour user's identifier. Use a non-sequential and non-predictable string to ensure security. Suggestion: Combine your customer's unique ID with their email address. ## API Overview 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. ### Authentication All API requests must include an [authentication token](https://my.appio.so/). Each registered service is issued a unique authentication token. You can validate your token by calling the testing endpoint: Request ```curl hljs-copy hljs curl https://api.appio.so/hi \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs 👋 ``` ## API Services ### Service titleString, max 255 characters.descriptionString, max 1000 characters.logo\_urlSquare image up to 1MB. Allowed formats: .gif, .jpg, .png, .webp Max 512 characters long.banner\_urlImage ration 16:9, up to 3MB. Allowed formats: .gif, .jpg, .png, .webp Max 512 characters long.urlString, max 512 characters. ### Get service details Path ```curl hljs GET /v1/services/{id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/services/svc_00dddddd000000ccccccssssss \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "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/" } ``` * * * ### Update service details Path ```curl hljs PATCH /v1/services/{id} ``` Request ```curl hljs-copy hljs 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 ```json hljs { "title": "New service title" } ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "id": "svc_00dddddd000000ccccccssssss" } ``` ## API Devices ### List of devices subscribed to service Path ```curl hljs GET /v1/devices ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/devices \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "marketing_name": "iPhone 13",\ "id": "dvc_01jmpmh9fvxgyym44sqanjr9hs",\ "user_id": "docs-appio-so:hi@appio.so",\ "name": "iPhone 13",\ "platform": "ios",\ "os_version": "18.3",\ "model": "iPhone",\ "device_token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",\ "notifications_enabled": true,\ "device_identifier": "iPhone14,5"\ },\ ...\ ] ``` * * * ### View device details Path ```curl hljs GET /v1/devices/{id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/devices/dvc_01jmpmh9fvxgyym44sqanjr9hs \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "marketing_name": "iPhone 13", "id": "dvc_01jmpmh9fvxgyym44sqanjr9hs", "user_id": "docs-appio-so:hi@appio.so", "name": "iPhone 13", "platform": "ios", "os_version": "18.3", "model": "iPhone", "device_token": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "notifications_enabled": true, "device_identifier": "iPhone14,5" } ``` * * * ### Deactivate device Deactivate a device when it should no longer receive notifications or when its associated user has been deactivated. Path ```curl hljs DELETE /v1/devices/{id} ``` Request ```curl hljs-copy hljs curl -X DELETE https://api.appio.so/v1/devices/dvc_01jmpmh9fvxgyym44sqanjr9hs \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "id": "dvc_01jmpmh9fvxgyym44sqanjr9hs" } ``` * * * ### Deactivate all user devices Deactivate all of a user’s devices when they should no longer receive notifications or when the user has been deactivated. Path ```curl hljs DELETE /v1/devices?user_id={user_id} ``` Request ```curl hljs-copy hljs curl -X DELETE https://api.appio.so/v1/devices?user_id=docs-appio-so%3Ahi%40appio.so \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "id": "dvc_01jmpmh9fvxgyym44sqanjr9hs"\ },\ ...\ ] ``` ## API Notifications ### Notification request payload[Notification payload](https://docs.appio.so/#api-notifications-payload)scheduled\_at_optional_ String, date/time to start delivery, in [RFC 3339 format](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). Schedule notifications for future delivery, up to 30 days in advance. ### Notification payload titleString, max 50 characters.messageString, max 200 characters.link_optional_ Valid URL.image\_url_optional_ Image ration 16/9, up to 3MB. Allowed formats: .gif, .jpg, .png, .webp ### Filter options status_optional_ Filter notifications by status: created, queued, completed, failed, skippeddevice\_id_optional_ Filter notifications for a specific device.user\_id_optional_ Filter notifications for a specific user. If both device\_id and user\_id are provided, only device\_id is used. ### List of notifications Path ```curl hljs GET /v1/notifications ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/notifications \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "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"\ },\ ...\ ] ``` * * * ### List of delivered notifications Path ```curl hljs GET /v1/notifications?status=completed ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/notifications?status=completed \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "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"\ },\ ...\ ] ``` * * * ### List of notifications for a device Path ```curl hljs GET /v1/notifications?device_id={device_id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/notifications?device_id=dvc_01jmpmh9fvxgyym44sqanjr9hs \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "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"\ },\ ...\ ] ``` * * * ### List of notifications for a user Path ```curl hljs GET /v1/notifications?user_id={user_id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/notifications?user_id=docs-appio-so%3Ahi%40appio.so \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "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 notification details View a notification's details, including its sending status. Each notification may be delivered to multiple devices. Path ```curl hljs GET /v1/notifications/{id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/notifications/ntf_01jmpmgb6my0s57c960q1s862v \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "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 } } ``` * * * ### Send a notification to all subscribed devices Path ```curl hljs POST /v1/notifications ``` Request ```curl hljs-copy hljs 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 ```json hljs { "payload": { "title": "Notification", "message": "Hello from Appio Docs" } } ``` Response ```plaintext hljs HTTP Code: 201 ``` ```json hljs { "id": "ntf_01jv7938vhvsccakmeq7c1hcy8" } ``` * * * ### Send a scheduled notification to a user Sends a notification to all active devices belonging to this user. Path ```curl hljs POST /v1/notifications?user_id={user_id} ``` Request ```curl hljs-copy hljs 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":"2025-06-25T09:00:00.000Z"}' ``` Request body ```json hljs { "payload": { "title": "Notification", "message": "Hello from Appio Docs" }, "scheduled_at": "2025-06-25T09:00:00.000Z" } ``` Response ```plaintext hljs HTTP Code: 201 ``` ```json hljs { "id": "ntf_01jv7akwwbj47rf3je11jgpvvf" } ``` * * * ### Send a notification to a single device The Device has to be active. Path ```curl hljs POST /v1/notifications?device_id={device_id} ``` Request ```curl hljs-copy hljs 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 ```json hljs { "payload": { "title": "Notification", "message": "Hello from Appio Docs" } } ``` Response ```plaintext hljs HTTP Code: 201 ``` ```json hljs { "id": "ntf_01jmpmgb6my0s57c960q1s862v" } ``` ## API Widgets A widget consists of a template (created via the [WYSIWYG editor](https://my.appio.so/)) and your data source that you link to the template. ### Widget templateString reference to saved template.sourcedataData source.typeType of data source. ### Create a new widget Path ```curl hljs POST /v1/widgets ``` Request ```curl hljs-copy hljs 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 ```json hljs { "template": "number", "source": { "data": "123", "type": "static" } } ``` Response ```plaintext hljs HTTP Code: 201 ``` ```json hljs { "id": "wgt_01jmpr3vt1008txv1jehgdeny7" } ``` * * * ### View all widgets Path ```curl hljs GET /v1/widgets ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/widgets \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs [\ {\ "id": "wgt_01jmpr3vt1008txv1jehgdeny7",\ "service_id": "svc_00dddddd000000ccccccssssss",\ "template": "number",\ "source": {\ "type": "static",\ "data": "123"\ }\ },\ ...\ ] ``` * * * ### View widget details Path ```curl hljs GET /v1/widgets/{id} ``` Request ```curl hljs-copy hljs curl -X GET https://api.appio.so/v1/widgets/wgt_01jmpr3vt1008txv1jehgdeny7 \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "id": "wgt_01jmpr3vt1008txv1jehgdeny7", "service_id": "svc_00dddddd000000ccccccssssss", "template": "number", "source": { "type": "static", "data": "123" } } ``` * * * ### Update widgets details Path ```curl hljs PATCH /v1/widgets/{id} ``` Request ```curl hljs-copy hljs 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 ```json hljs { "template": "ring", "source": { "data": "65", "type": "static" } } ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "id": "wgt_01jmpr3vt1008txv1jehgdeny7" } ``` * * * ### Delete widget Delete a widget when you no longer want to offer it to your users. Path ```curl hljs DELETE /v1/widgets/{id} ``` Request ```curl hljs-copy hljs curl -X DELETE https://api.appio.so/v1/widgets/wgt_01jmpr3vt1008txv1jehgdeny7 \ -H "Content-Type: application/json" \ -H "Authorization: Bearer docs_g3psUMsuKZ7NGGJvuk1csf47pvJfukz97cS5ZrOuHnY98yhY5A" ``` Response ```plaintext hljs HTTP Code: 200 ``` ```json hljs { "id": "wgt_01jmpr3vt1008txv1jehgdeny7" } ``` ## API Errors 400Bad Request The request contains invalid or missing data. Please double-check the API endpoint URL and ensure the request body is correctly formatted and complete.401Unauthorized Authentication is required. Ensure that a valid access token is included in the request headers.403Forbidden You do not have permission to perform this action. Check that your account has the necessary permissions or roles for this operation.404Not Found The requested entity doesn't exist. Verify that the resource identifier is correct, exists, and is currently active.409Conflict The request conflicts with existing data. Review the request to ensure it does not duplicate or contradict the current state or existing records.500Internal Error Something went wrong while processing your request. Try again later or [contact support](https://appio.so/contact) if the issue persists. ## AI Instructions LLM-friendly content for AI agents is available at [/llms.txt](https://docs.appio.so/llms.txt).