---
title: "List Push Transports"
method: GET
path: "/v1/push-transport"
tags: ["push-transport"]
---

# List Push Transports

`GET /v1/push-transport`

## Request

- Base URL: `https://api.elaan.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.elaan.io/v1/push-transport`
- Auth: none declared

Every transport this tenant has configured. An empty list means they can't
send push at all — there is no platform default, so that is a real answer
rather than a 404.

An entry with `credentials_unreadable` is configured but unusable (the
encryption key was rotated). It is listed rather than hidden so the state is
distinguishable from "never set up", which is what it silently looked like
before — while every send through it kept failing.

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- PushTransportResponse[]
  - `provider` 'fcm' | 'apns' | 'expo' | 'onesignal' | 'webpush', required: The service a push subscription is delivered *through* — the routing key that ties a contact's `PushSubscription` to the tenant's configured `PushTransportConfig` and selects which sender adapter delivers it. Cross-cutting vocabulary (like `Channel`): it lives in `shared` because both `contact` (the destination side) and `push_transport` / `outbound_push` (the sending side) reference the same members, and they must not drift apart. Covers direct transports (FCM / APNs / Web Push) and aggregators that fan out to the native platforms themselves (Expo, OneSignal). Subclassing `str` keeps JSON and dict keys clean.
  - `expo` ExpoTransportView
    - `has_access_token` boolean, required
  - `fcm` FcmTransportView
    - `project_id` string, required
    - `client_email` string, required
    - `has_private_key` boolean, required
  - `webpush` WebPushTransportView: The public half is returned in full, deliberately: the console has to hand it to the browser as `applicationServerKey` for `pushManager.subscribe()`, and it is a public key. Only the private half is reduced to a `has_` boolean.
    - `public_key` string, required
    - `subject` string, required
    - `has_private_key` boolean, required
  - `updated_at` string, date-time, nullable
  - `credentials_unreadable` boolean: This provider has a stored transport whose credentials can no longer be decrypted (the encryption key was rotated), so its settings are absent from this entry. It is NOT the same as being unconfigured: sends through it fail until it is replaced. PUT the provider again with fresh credentials to repair it.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/elaan/apis/elaan-api.md) · [All operations](https://skmtc.dev/elaan/apis/elaan-api/llms.txt) · [OpenAPI document](https://skmtc.dev/elaan/apis/elaan-api/revisions/c96a7e6399aa?raw)
