> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pushnotif.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Ingest API

> The HTTP API the SDK uses, for sending events from anywhere else.

The iOS SDK calls this API for you. Use it directly to send events from your
backend, from another platform, or with property types the SDK can't send
(numbers and booleans).

## Base URL

```
https://api.pushnotif.ai
```

## Authentication

Send the app's ingest key as a bearer token:

```bash theme={null}
Authorization: Bearer pna_...
```

The key can only write. A missing, revoked or malformed key gets the same
`401 {"error": "unauthorized"}`, with no detail about which.

## The `device` object

Every request carries the device it comes from. `install_id` identifies the
install; the other fields update what we know about it.

**device.install\_id** `string` *required*

A stable id for this install of your app, at most 128 characters. Generate a
UUID on first launch and keep it.

**device.timezone** `string`

IANA timezone, like `America/New_York`. Used for quiet hours.

**device.app\_version** `string`

**device.os\_version** `string`

**device.platform** `string`

For example `ios`.

**device.notif\_permission\_status** `string`

One of `notDetermined`, `denied`, `authorized`, `provisional`, `ephemeral`.
Any other value is ignored, not rejected.

## Errors

| Status | Body | Means |
| - | - | - |
| `400` | `{"error": "events[2].name: expected a non-empty string"}` | The request is invalid. Fix it; retrying won't help. |
| `401` | `{"error": "unauthorized"}` | Bad or revoked key |
| `5xx` | | Our problem. Retry with backoff; event ids make retries safe. |

Requests are limited to 4 MB.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.