# Status Page API

## Overview

Pluggy's status page at [status.pluggy.ai](https://status.pluggy.ai) shows the live health of every connector, payment product and infrastructure component, plus incident history. Everything the page renders is public JSON you can consume directly — no authentication required, no API key.

Three endpoints, from largest to smallest:

| Endpoint | Use it when |
| --- | --- |
| [`/api/status`](#the-snapshot-endpoint) | You want everything: connectors, 90 days of history, every incident with its timeline |
| [`/api/connectors-incidents`](#active-incidents-by-connector) | You only want what is broken right now, keyed by connector id |
| [`/api/summary`](#embeddable-widget) | You only want one overall status, for a badge or a health check |

If you already call `GET /connectors`, you may not need any of them — see [On the connector object](#on-the-connector-object).

If you just want notifications, you don't need this API: subscribe by email on the status page, add the **Pluggy Status** Slack app to a channel, or use the [RSS feed](https://status.pluggy.ai/rss).

## The snapshot endpoint

```
GET https://status.pluggy.ai/api/status
```

- **No authentication.** CORS is open, so you can call it from a browser app.
- **Cached for ~30 seconds.** Poll at 60 seconds or slower — faster polling only re-reads the cache.

The response contains four collections:

| Field | What it holds |
| --- | --- |
| `institutions` | Every connector with its current status, 90-day history and product support flags |
| `incidents` | Open incidents and everything resolved in the last 90 days, with their update timelines |
| `components` | Infrastructure components (API, Webhooks, Connect Widget, …) and their current status |
| `productStatus` | Manual per-institution status overrides for payment products |

## Institutions

```json
{
  "pluggy_id": "601",
  "name": "Itaú",
  "type": "PERSONAL_BANK",
  "logo_url": "https://cdn.pluggy.ai/assets/connector-icons/201.svg",
  "status": "online",
  "bars": "ooooooo…dxo",
  "uptime": 99.51,
  "supports_data": true,
  "supports_pis": true,
  "supports_pis_scheduled": true,
  "supports_pix_auto": true,
  "supports_smart_transfer": true
}
```

- `pluggy_id` is the same connector `id` you use everywhere else in the Pluggy API — match on it directly.
- `status` is one of `online`, `degraded`, `offline`, `maintenance`.
- `bars` encodes the last 90 days as one character per day, oldest first: `o` online, `d` degraded, `p` partial outage, `x` offline, `m` maintenance.
- `uptime` is a weighted 90-day percentage (degraded days count 25% downtime, partial 50%, offline 100%).
- The `supports_*` flags tell you which products the institution offers (data, payment initiation, scheduled payments, automatic PIX, smart transfers).

**Example — check one connector's health:**

```bash
curl -s https://status.pluggy.ai/api/status \
  | jq '.institutions[] | select(.pluggy_id == "601") | {name, status, uptime}'
```

## Incidents

```json
{
  "id": "4a8f1e80-…",
  "kind": "incident",
  "product": "pis",
  "pluggy_id": "612",
  "institution_name": "PagBank",
  "severity": "degraded",
  "state": "identified",
  "apis": ["Criação de pagamento"],
  "started_at": "2026-07-07T14:28:21Z",
  "resolved_at": null,
  "postmortem": null,
  "updates": [{ "state": "identified", "body": "…", "created_at": "…" }]
}
```

- An incident is **open** while `state != "resolved"`.
- `product` is one of `dados`, `pis`, `pis-agendado`, `pixauto`, `smart`, `infra` (legacy incidents may carry `pagamentos`, which maps to `pis`).
- `kind` is `incident` or `maintenance`; maintenances carry `window_starts_at` / `window_ends_at`.
- Connector-scoped incidents include `pluggy_id`, so you can join them against your own connector list.
- Every incident has a shareable page at `https://status.pluggy.ai/incident/<id>`.

**Example — open incidents affecting a connector you use:**

```bash
curl -s https://status.pluggy.ai/api/status \
  | jq '.incidents[] | select(.state != "resolved" and .pluggy_id == "612") | {title, state, severity}'
```

## Active incidents by connector

The snapshot carries everything, which makes it large. If all you want is "what is wrong with each connector right now" — to flag an affected bank on your own connector-selection screen before a user picks it — poll this instead. It is a few kilobytes rather than a few hundred, because it carries no history, no resolved incidents and no timelines.

```
GET https://status.pluggy.ai/api/connectors-incidents
```

```json
{
  "generatedAt": "2026-09-05T10:11:25.059Z",
  "connectors": {
    "602": [
      {
        "id": "78624c2c-bf55-466a-ba99-6b57e9bd9223",
        "title": "XP Banking - Compras parceladas não sendo retornadas",
        "description": null,
        "type": "TRANSACTIONS_INSTALLMENTS_ISSUE",
        "product": "dados",
        "kind": "INCIDENT",
        "severity": "DEGRADED",
        "state": "IDENTIFIED",
        "startedAt": "2026-07-23T13:40:41Z",
        "updatedAt": "2026-08-18T16:30:09Z",
        "url": "https://status.pluggy.ai/incident/78624c2c-bf55-466a-ba99-6b57e9bd9223"
      }
    ]
  }
}
```

Keys are the same connector `id` you get from `GET https://api.pluggy.ai/connectors`, so joining is a lookup. Only connectors with at least one active incident appear, and each list is ordered worst-first.

**Only incidents affecting a connector *at this moment* are listed.** A scheduled maintenance is published days ahead but appears here only once its window opens, and disappears when it closes. An incident affecting several institutions appears under each of their connector ids. Infrastructure-wide incidents belong to no connector and are not listed here — use the snapshot for those.

### The `type` field

`severity` says how bad it is and `state` says how far along we are. `type` says **what is broken**, which is the part you cannot infer from anything else:

| Group | Values |
| --- | --- |
| Availability | `CONNECTOR_UNAVAILABLE`, `CONNECTOR_DEGRADED`, `INSTITUTION_OUTAGE`, `SCHEDULED_MAINTENANCE` |
| Connection lifecycle | `CONSENT_ERROR`, `CONNECTION_NOT_UPDATING`, `PARTIAL_SUCCESS` |
| Data quality | `ACCOUNTS_MISSING`, `BALANCE_INCORRECT`, `TRANSACTIONS_MISSING`, `TRANSACTIONS_INCORRECT`, `TRANSACTIONS_INSTALLMENTS_ISSUE`, `INVESTMENTS_MISSING`, `INVESTMENTS_INCORRECT`, `IDENTITY_MISSING`, `HISTORICAL_DATA_MISSING` |
| Pluggy platform | `WEBHOOK_DELAY`, `PAYMENT_FAILURE` |
| Unclassified | `OTHER` |

Use it to group the same problem across institutions, and to decide which incidents are worth putting in front of a user: a `SCHEDULED_MAINTENANCE` and a `TRANSACTIONS_MISSING` both read as "degraded" otherwise. `OTHER` means Pluggy has not classified the incident, not that nothing is wrong.

## On the connector object

You do not have to call the status API at all. The same incidents ride on the `health` object of every connector returned by [`GET /connectors`](/reference/connector/connectors-list), so a listing you already make carries them:

```json
{
  "id": 602,
  "name": "XP Banking",
  "health": {
    "status": "ONLINE",
    "stage": null,
    "incidents": [
      {
        "title": "XP Banking - Compras parceladas não sendo retornadas",
        "type": "TRANSACTIONS_INSTALLMENTS_ISSUE",
        "product": "dados",
        "severity": "DEGRADED",
        "state": "IDENTIFIED",
        "url": "https://status.pluggy.ai/incident/78624c2c-…"
      }
    ]
  }
}
```

`health.incidents` is **absent** when the connector has no active incident, so its presence is the signal itself.

<Callout variant="info" title="Two different questions">
Note the `status: "ONLINE"` in that example. `health.status` answers *can I connect at all*; `health.incidents` answers *what is wrong*. A bank can be perfectly reachable and still be failing to return instalments, and only the second field can tell you that. They are different questions — read both.
</Callout>

`health.details` is a third, unrelated thing: request it with `?healthDetails=true` and it describes how **your own** connections to that institution have been doing, rather than the institution itself.

## Embeddable widget

Show Pluggy's live status inside your own app or internal dashboard.

**Floating badge** — one script tag, renders a small pill (status dot + label) in the corner of the page, linking to the status page. Refreshes every 60 seconds.

```html
<script
  src="https://status.pluggy.ai/widget.js"
  defer
  data-lang="en"
  data-position="bottom-right"
></script>
```

- `data-lang`: `pt` (default), `es` or `en`.
- `data-position`: `bottom-right` (default) or `bottom-left`.
- `data-target`: a CSS selector — renders the badge inline inside that element instead of floating.

**Iframe panel** — a compact panel with overall status, infrastructure components and open incidents:

```html
<iframe
  src="https://status.pluggy.ai/embed?lang=en"
  width="360"
  height="240"
  style="border: 0"
  title="Pluggy Status"
></iframe>
```

**Summary endpoint** — both are backed by a tiny JSON summary you can also consume directly (CORS open, cached ~30s). `\/api\/widget` serves the same body and keeps working for embeds already pointing at it:

```
GET https://status.pluggy.ai/api/summary
```

```json
{
  "status": "op",
  "labels": { "pt": "…", "es": "…", "en": "All systems operational" },
  "openIncidents": 0,
  "updatedAt": "2026-07-10T12:00:00.000Z"
}
```

`status` is `op` (operational), `mn` (maintenance), `dg` (degraded), `pt` (partial outage) or `mj` (major outage) — the worst across connectors, payment products and infrastructure.

## Other channels

| Channel | How |
| --- | --- |
| Email | Subscribe on [the status page](https://status.pluggy.ai) — pick specific products or everything; double opt-in, one-click unsubscribe |
| Slack | Install the **Pluggy Status** app from the page's subscribe dialog, or invite `@Pluggy Status` to a channel and enable it |
| RSS | [`https://status.pluggy.ai/rss`](https://status.pluggy.ai/rss) — last 50 incidents with their timelines |
| Webhooks | For connector status changes affecting **your items**, prefer the standard [Pluggy webhooks](/docs/developer-tools/webhooks-ref) (`connector/status_updated`) |