---
title: "Events"
description: "2 operations, with parameters and examples."
url: https://docs.fluveo.com/api/events/
---

> Index of every page: https://docs.fluveo.com/llms.txt. Integrating Fluveo? Read https://docs.fluveo.com/agents/integrate.md first.

> Too long? This page with code in one language only: https://docs.fluveo.com/api/events.curl.md (cURL), https://docs.fluveo.com/api/events.node.md (Node.js), https://docs.fluveo.com/api/events.python.md (Python), https://docs.fluveo.com/api/events.php.md (PHP).

# Events

2 operations, with parameters and examples.

An Event records something that happened to one of the store's objects. Fluveo sends each event to the store's webhook endpoints and keeps it for reading through the API. The event types Fluveo sends are listed in Event types.

Send every request to `https://api.fluveo.com/v1` with your secret key as a Bearer token. This page lists only what Fluveo serves; [the OpenAPI file](https://docs.fluveo.com/openapi.json) holds the same operations.

> **For AI agents:**
>
> Use plain HTTP; install no payments SDK. Send `Authorization: Bearer sk_test_...` and a fresh `Idempotency-Key` on every POST; reuse the same key only when you retry that same POST. Send only the documented parameters.

## Lists event objects, newest first

`GET /v1/events`

Permission: [`rak_event_read`](https://docs.fluveo.com/permissions.md#event).

**Query parameters**

- `created` (object, optional): Filter on the creation time, a Unix timestamp: created=<t> for an exact match, or created[gt], created[gte], created[lt], created[lte].
- `delivery_success` (boolean, optional): true for events whose webhook deliveries all succeeded, false for events that still have a delivery not received (pending or failed).
- `ending_before` (string, optional): Cursor: the id of the first object of the current page, to get the previous page. Do not send it with starting_after.
- `limit` (integer, optional): How many objects to return, from 1 to 100. Default 10.
- `starting_after` (string, optional): Cursor: the id of the last object of the previous page, to get the next page. Do not send it with ending_before.
- `type` (string, optional): Only events of this type. A * matches any run of characters anywhere in the type, as payment_intent.* or *.succeeded; * alone matches all. Do not send it with types.
- `types` (array of string, optional): Several event types at once, as types[]=a&types[]=b; at most 20. Do not send it with type.

**Headers**

- `Fluveo-Version` (enum, optional): Optional. The only version Fluveo serves is 2026-05-27.dahlia; any other value is refused with a 400. Every answer names that version in its own Fluveo-Version header, except the refusals Fluveo gives before it reads the request (no key, an unknown key, an unknown URL, a body that is not a form) and a file's bytes, which name no version and no Request-Id.

  One of: `2026-05-27.dahlia`.

Returns a list of [`event`](https://docs.fluveo.com/api/events.md#object-event) objects.

**Request**

cURL:

```bash
curl -G https://api.fluveo.com/v1/events \
  -H "Authorization: Bearer sk_test_..." \
  --data-urlencode "limit=3" \
  --data-urlencode "type=payment_intent.succeeded"
```

Node.js:

```javascript
const response = await fetch("https://api.fluveo.com/v1/events" + "?" + new URLSearchParams([["limit","3"],["type","payment_intent.succeeded"]]), {
  method: "GET",
  headers: {
    "Authorization": "Bearer sk_test_...",
  },
});
console.log(await response.json());
```

Python:

```python
import requests

response = requests.get(
    "https://api.fluveo.com/v1/events",
    headers={"Authorization": "Bearer sk_test_..."},
    params=[("limit", "3"), ("type", "payment_intent.succeeded")],
)
print(response.json())
```

PHP:

```php
<?php
$ch = curl_init("https://api.fluveo.com/v1/events?limit=3&type=payment_intent.succeeded");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer sk_test_...",
    ],
]);
echo curl_exec($ch);
```

*Response (abridged example)*

```json
{
  "data": [
    {
      "api_version": "2026-05-27.dahlia",
      "created": 1767225600,
      "data": {
        "object": {
          "amount": 2000,
          "currency": "usd",
          "id": "pi_123",
          "object": "payment_intent",
          "status": "succeeded"
        }
      },
      "id": "evt_123",
      "livemode": false,
      "object": "event",
      "pending_webhooks": 0,
      "type": "payment_intent.succeeded"
    }
  ],
  "has_more": false,
  "object": "list",
  "url": "/v1/events"
}
```

## Retrieves a event

`GET /v1/events/{id}`

Permission: [`rak_event_read`](https://docs.fluveo.com/permissions.md#event).

**Path parameters**

- `id` (string, required): The object's id.

**Headers**

- `Fluveo-Version` (enum, optional): Optional. The only version Fluveo serves is 2026-05-27.dahlia; any other value is refused with a 400. Every answer names that version in its own Fluveo-Version header, except the refusals Fluveo gives before it reads the request (no key, an unknown key, an unknown URL, a body that is not a form) and a file's bytes, which name no version and no Request-Id.

  One of: `2026-05-27.dahlia`.

Returns a [`event`](https://docs.fluveo.com/api/events.md#object-event) object.

**Request**

cURL:

```bash
curl https://api.fluveo.com/v1/events/evt_123 \
  -H "Authorization: Bearer sk_test_..."
```

Node.js:

```javascript
const response = await fetch("https://api.fluveo.com/v1/events/evt_123", {
  method: "GET",
  headers: {
    "Authorization": "Bearer sk_test_...",
  },
});
console.log(await response.json());
```

Python:

```python
import requests

response = requests.get(
    "https://api.fluveo.com/v1/events/evt_123",
    headers={"Authorization": "Bearer sk_test_..."},
)
print(response.json())
```

PHP:

```php
<?php
$ch = curl_init("https://api.fluveo.com/v1/events/evt_123");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer sk_test_...",
    ],
]);
echo curl_exec($ch);
```

*Response (abridged example)*

```json
{
  "api_version": "2026-05-27.dahlia",
  "created": 1767225600,
  "data": {
    "object": {
      "amount": 2000,
      "currency": "usd",
      "id": "pi_123",
      "object": "payment_intent",
      "status": "succeeded"
    }
  },
  "id": "evt_123",
  "livemode": false,
  "object": "event",
  "pending_webhooks": 0,
  "type": "payment_intent.succeeded"
}
```

## The event object

Ids start with `evt_`.

**Attributes**

- `account` (string)
- `api_version` (string, nullable)
- `context` (string)
- `created` (integer)
- `data` (object): data.object is the object as GET /v1/<object> shows it at the time of the event, with the buyer's data in it: a Customer's name, email, phone, address and shipping, a tax id's value, a PaymentMethod's and a Charge's billing_details, a PaymentIntent's and a Charge's receipt_email and shipping, a Checkout Session's customer_details and collected_information. No object holds a card's number or CVC or an API key, so no event does. data.previous_attributes holds the old value of each field the update changed, buyer fields too. Webhook deliveries, their retries and GET /v1/events serve the same body.
- `id` (string)
- `livemode` (boolean)
- `object` (enum): One of: `event`.
- `pending_webhooks` (integer)
- `request` (object, nullable)
- `type` (enum): One of: `account.application.authorized`, `account.application.deauthorized`, `account.external_account.created`, `account.external_account.deleted`, `account.external_account.updated`, `account.updated`, `application_fee.created`, `application_fee.refund.updated`, `application_fee.refunded`, `balance.available`, `balance_settings.updated`, `capability.updated`, `cash_balance.funds_available`, `charge.captured`, `charge.dispute.closed`, `charge.dispute.created`, `charge.dispute.funds_reinstated`, `charge.dispute.funds_withdrawn`, `charge.dispute.updated`, `charge.expired`, `charge.failed`, `charge.pending`, `charge.refund.updated`, `charge.refunded`, `charge.succeeded`, `charge.updated`, `checkout.session.async_payment_failed`, `checkout.session.async_payment_succeeded`, `checkout.session.completed`, `checkout.session.expired`, `climate.order.canceled`, `climate.order.created`, `climate.order.delayed`, `climate.order.delivered`, `climate.order.product_substituted`, `climate.product.created`, `climate.product.pricing_updated`, `customer.created`, `customer.deleted`, `customer.source.created`, `customer.source.deleted`, `customer.source.expiring`, `customer.source.updated`, `customer.tax_id.created`, `customer.tax_id.deleted`, `customer.tax_id.updated`, `customer.updated`, `customer_cash_balance_transaction.created`, `entitlements.active_entitlement_summary.updated`, `file.created`, `financial_connections.account.account_numbers_updated`, `financial_connections.account.created`, `financial_connections.account.deactivated`, `financial_connections.account.disconnected`, `financial_connections.account.reactivated`, `financial_connections.account.refreshed_balance`, `financial_connections.account.refreshed_ownership`, `financial_connections.account.refreshed_transactions`, `financial_connections.account.upcoming_account_number_expiry`, `identity.verification_session.canceled`, `identity.verification_session.created`, `identity.verification_session.processing`, `identity.verification_session.redacted`, `identity.verification_session.requires_input`, `identity.verification_session.verified`, `issuing_authorization.created`, `issuing_authorization.request`, `issuing_authorization.updated`, `issuing_card.created`, `issuing_card.updated`, `issuing_cardholder.created`, `issuing_cardholder.updated`, `issuing_dispute.closed`, `issuing_dispute.created`, `issuing_dispute.funds_reinstated`, `issuing_dispute.funds_rescinded`, `issuing_dispute.submitted`, `issuing_dispute.updated`, `issuing_personalization_design.activated`, `issuing_personalization_design.deactivated`, `issuing_personalization_design.rejected`, `issuing_personalization_design.updated`, `issuing_token.created`, `issuing_token.updated`, `issuing_transaction.created`, `issuing_transaction.purchase_details_receipt_updated`, `issuing_transaction.updated`, `mandate.updated`, `payment_intent.amount_capturable_updated`, `payment_intent.canceled`, `payment_intent.created`, `payment_intent.partially_funded`, `payment_intent.payment_failed`, `payment_intent.processing`, `payment_intent.requires_action`, `payment_intent.succeeded`, `payment_link.created`, `payment_link.updated`, `payment_method.attached`, `payment_method.automatically_updated`, `payment_method.detached`, `payment_method.updated`, `payout.canceled`, `payout.created`, `payout.failed`, `payout.paid`, `payout.reconciliation_completed`, `payout.updated`, `person.created`, `person.deleted`, `person.updated`, `price.created`, `price.deleted`, `price.updated`, `product.created`, `product.deleted`, `product.updated`, `quote.accepted`, `quote.canceled`, `quote.created`, `quote.finalized`, `radar.early_fraud_warning.created`, `radar.early_fraud_warning.updated`, `refund.created`, `refund.failed`, `refund.updated`, `reporting.report_run.failed`, `reporting.report_run.succeeded`, `reporting.report_type.updated`, `reserve.hold.created`, `reserve.hold.updated`, `reserve.plan.created`, `reserve.plan.disabled`, `reserve.plan.expired`, `reserve.plan.updated`, `reserve.release.created`, `review.closed`, `review.opened`, `setup_intent.canceled`, `setup_intent.created`, `setup_intent.requires_action`, `setup_intent.setup_failed`, `setup_intent.succeeded`, `sigma.scheduled_query_run.created`, `source.canceled`, `source.chargeable`, `source.failed`, `source.mandate_notification`, `source.refund_attributes_required`, `source.transaction.created`, `source.transaction.updated`, `tax.settings.updated`, `tax_rate.created`, `tax_rate.updated`, `terminal.reader.action_failed`, `terminal.reader.action_succeeded`, `terminal.reader.action_updated`, `test_helpers.test_clock.advancing`, `test_helpers.test_clock.created`, `test_helpers.test_clock.deleted`, `test_helpers.test_clock.internal_failure`, `test_helpers.test_clock.ready`, `topup.canceled`, `topup.created`, `topup.failed`, `topup.reversed`, `topup.succeeded`, `transfer.created`, `transfer.reversed`, `transfer.updated`, `treasury.credit_reversal.created`, `treasury.credit_reversal.posted`, `treasury.debit_reversal.completed`, `treasury.debit_reversal.created`, `treasury.financial_account.closed`, `treasury.financial_account.created`, `treasury.financial_account.features_status_updated`, `treasury.inbound_transfer.canceled`, `treasury.inbound_transfer.created`, `treasury.inbound_transfer.failed`, `treasury.inbound_transfer.succeeded`, `treasury.outbound_payment.canceled`, `treasury.outbound_payment.created`, `treasury.outbound_payment.expected_arrival_date_updated`, `treasury.outbound_payment.failed`, `treasury.outbound_payment.posted`, `treasury.outbound_payment.returned`, `treasury.outbound_payment.tracking_details_updated`, `treasury.outbound_transfer.canceled`, `treasury.outbound_transfer.created`, `treasury.outbound_transfer.expected_arrival_date_updated`, `treasury.outbound_transfer.failed`, `treasury.outbound_transfer.posted`, `treasury.outbound_transfer.returned`, `treasury.outbound_transfer.tracking_details_updated`, `treasury.received_credit.created`, `treasury.received_credit.failed`, `treasury.received_credit.succeeded`, `treasury.received_debit.created`.
