Status Page API

Programmatically consume Pluggy's public status page — connector health, incidents and infrastructure components.

Overview#

Pluggy's status page at 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:

EndpointUse it when
/api/statusYou want everything: connectors, 90 days of history, every incident with its timeline
/api/connectors-incidentsYou only want what is broken right now, keyed by connector id
/api/summaryYou 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.

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.

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:

FieldWhat it holds
institutionsEvery connector with its current status, 90-day history and product support flags
incidentsOpen incidents and everything resolved in the last 90 days, with their update timelines
componentsInfrastructure components (API, Webhooks, Connect Widget, …) and their current status
productStatusManual per-institution status overrides for payment products

Institutions#

{
  "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:

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

Incidents#

{
  "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:

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
{
  "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:

GroupValues
AvailabilityCONNECTOR_UNAVAILABLE, CONNECTOR_DEGRADED, INSTITUTION_OUTAGE, SCHEDULED_MAINTENANCE
Connection lifecycleCONSENT_ERROR, CONNECTION_NOT_UPDATING, PARTIAL_SUCCESS
Data qualityACCOUNTS_MISSING, BALANCE_INCORRECT, TRANSACTIONS_MISSING, TRANSACTIONS_INCORRECT, TRANSACTIONS_INSTALLMENTS_ISSUE, INVESTMENTS_MISSING, INVESTMENTS_INCORRECT, IDENTITY_MISSING, HISTORICAL_DATA_MISSING
Pluggy platformWEBHOOK_DELAY, PAYMENT_FAILURE
UnclassifiedOTHER

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, so a listing you already make carries them:

{
  "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.

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.

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.

<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:

<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
{
  "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#

ChannelHow
EmailSubscribe on the status page — pick specific products or everything; double opt-in, one-click unsubscribe
SlackInstall the Pluggy Status app from the page's subscribe dialog, or invite @Pluggy Status to a channel and enable it
RSShttps://status.pluggy.ai/rss — last 50 incidents with their timelines
WebhooksFor connector status changes affecting your items, prefer the standard Pluggy webhooks (connector/status_updated)