Introduction

Application-scoped APIs for registering installations, sending push notifications, and tracking delivery events.

This documentation aims to provide all the information you need to work with our API.

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_APPLICATION_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Use an application-scoped Sanctum token with the ability required by the endpoint.

Delivery events

Report lifecycle events emitted by a client installation.

Report a delivery event

POST
http://pushctl.test
/api/v1/events
requires authentication

Idempotently records a received, displayed, or opened event.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "http://pushctl.test/api/v1/events" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"event_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"delivery_id\": \"architecto\",
    \"installation_id\": \"n\",
    \"type\": \"received\",
    \"occurred_at\": \"2026-08-10T19:33:00+00:00\"
}"

Installations

Register and maintain mobile app installations.

Register an installation

PUT
http://pushctl.test
/api/v1/installations/{installationId}
requires authentication

Creates or replaces an installation and associates it with an optional external user.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

installationId
string
required
Example:
architecto

Body Parameters

Example request:
curl --request PUT \
    "http://pushctl.test/api/v1/installations/architecto" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": \"b\",
    \"platform\": \"android\",
    \"provider\": {
        \"type\": \"apns_token\",
        \"identifier\": \"b\"
    },
    \"permission\": \"ephemeral\",
    \"device\": {
        \"app_version\": \"n\",
        \"os_version\": \"g\",
        \"model\": \"z\",
        \"locale\": \"en_CA\",
        \"timezone\": \"America\\/Moncton\"
    }
}"

Update an installation

PATCH
http://pushctl.test
/api/v1/installations/{installationId}
requires authentication

Updates user association, permission state, or installation metadata.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

installationId
string
required
Example:
architecto

Body Parameters

Example request:
curl --request PATCH \
    "http://pushctl.test/api/v1/installations/architecto" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": \"b\",
    \"permission\": \"ephemeral\"
}"

Get an installation

GET
http://pushctl.test
/api/v1/installations/{installationId}
requires authentication

Returns an installation belonging to the authenticated application.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

installationId
string
required
Example:
architecto
Example request:
curl --request GET \
    --get "http://pushctl.test/api/v1/installations/architecto" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
Headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
    "message": "Unauthenticated."
}

Notifications

Create notifications and inspect their delivery lifecycle.

Send a notification

POST
http://pushctl.test
/api/v1/notifications
requires authentication

Queues a notification for all eligible installations belonging to the specified external users.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "http://pushctl.test/api/v1/notifications" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"recipients\": {
        \"user_ids\": [
            \"b\"
        ]
    },
    \"notification\": {
        \"title\": \"b\",
        \"body\": \"n\",
        \"image_url\": \"http:\\/\\/crooks.biz\\/et-fugiat-sunt-nihil-accusantium\",
        \"action_url\": \"http:\\/\\/tillman.com\\/\"
    },
    \"options\": {
        \"ttl\": 14,
        \"priority\": \"high\",
        \"collapse_id\": \"w\",
        \"sound\": \"a\",
        \"badge\": 50,
        \"android_channel_id\": \"k\",
        \"ios_category\": \"c\"
    }
}"

List notifications

GET
http://pushctl.test
/api/v1/notifications
requires authentication

Returns a paginated notification history, optionally filtered by status.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request GET \
    --get "http://pushctl.test/api/v1/notifications" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"queued\",
    \"per_page\": 1
}"
Example response:
Headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
    "message": "Unauthenticated."
}

Get a notification

GET
http://pushctl.test
/api/v1/notifications/{notificationId}
requires authentication

Returns aggregate lifecycle counts for a notification.

Headers

Authorization
Example:
Bearer {YOUR_APPLICATION_TOKEN}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

notificationId
string
required
Example:
architecto
Example request:
curl --request GET \
    --get "http://pushctl.test/api/v1/notifications/architecto" \
    --header "Authorization: Bearer {YOUR_APPLICATION_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
Headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
    "message": "Unauthenticated."
}