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

# Pushover compatibility

Migrating from Pushover usually requires changing **one URL**.

Point your existing Pushover sender at:

```
https://api.reflecto.dev/v1/messages.json
```

…and put a Reflecto sender token (`rfk_live_…`) in Pushover's `token` field.
The `user` field stays in the request for client compatibility but is
ignored — the Reflecto token already identifies the user.

## Example

```bash theme={null}
curl -s \
  --form-string "token=rfk_live_aB3xQ7mN9pK2vR5tY8uW4sZ1cE6dF0gH" \
  --form-string "user=ignored" \
  --form-string "message=Backup done" \
  https://api.reflecto.dev/v1/messages.json
```

Response (Pushover's exact shape):

```json theme={null}
{ "status": 1, "request": "msg_abc123def456" }
```

`request` is Reflecto's internal `msg_*` id, surfaced verbatim so log
correlation works.

## Field mapping

| Pushover    | Reflecto                                           |
| ----------- | -------------------------------------------------- |
| `token`     | Sender token (must be `rfk_live_…`).               |
| `user`      | Ignored.                                           |
| `message`   | `message`.                                         |
| `title`     | `title`.                                           |
| `priority`  | `-2`→`min`, `-1`→`low`, `0`→`default`, `1`→`high`. |
| `url`       | `url`.                                             |
| `url_title` | `url_title`.                                       |
| `device`    | `device` (comma-separated list supported).         |
| `ttl`       | `ttl`.                                             |
| `sound`     | Accepted but ignored (no custom sounds in MVP).    |
| `timestamp` | Accepted but ignored; server uses current time.    |

## Intentionally unsupported

* **`priority=2` (Emergency).** Pushover's Emergency priority requires
  acknowledgment tracking via `callback` + `receipt` polling. Reflecto does
  not implement that contract, so we reject up-front with `400`:

  ```json theme={null}
  { "status": 0, "errors": ["priority_emergency_unsupported"] }
  ```

  Silent downgrade to `urgent` would break migrations that depend on the
  receipt loop.

* **Custom sounds, attachments, HTML rendering, monthly limits API.** Not in
  MVP. If you depend on any of these, file an issue on GitHub with your use
  case.

## Error shape

Failures are wrapped in Pushover's `{ status: 0, errors: [...] }` shape, with
the same HTTP status code as the underlying `/v1/send` failure (400, 401,
413, 429, 500). Rate-limit `Retry-After` headers are preserved.
