> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.brevo.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.brevo.com/_mcp/server.

# Get all your SMS activity (unaggregated events)

GET https://api.brevo.com/v3/transactionalSMS/statistics/events

Retrieve a paginated list of individual SMS event records (unaggregated), including event type, phone number, message ID, timestamp, tag, and reason or reply content where applicable. Results default to 50 per page (max 100) and are sorted in descending order unless overridden. Filter by date range (`startDate`/`endDate`), past `days` (not compatible with date range), specific `event` type (e.g. delivered, bounces, replies), `phoneNumber`, or `tags`. Bounce events include the failure reason, and reply events include the reply content.

Reference: https://developers.brevo.com/reference/get-sms-events

## Authentication

- `api-key` header (required) — The API key should be passed in the request headers as `api-key` for authentication.

## Request

### Query parameters

- `limit` (long, optional, default: 50) — Number of documents per page
- `startDate` (string, optional) — **Mandatory if endDate is used.** Starting date (YYYY-MM-DD) of the report
- `endDate` (string, optional) — **Mandatory if startDate is used.** Ending date (YYYY-MM-DD) of the report
- `offset` (long, optional, default: 0) — Index of the first document of the page
- `days` (long, optional) — Number of days in the past including today (positive integer). **Not compatible with 'startDate' and 'endDate'**
- `phoneNumber` (string, optional) — Filter the report for a specific phone number
- `event` (enum, optional) — Filter the report for specific events
  - Allowed values: `bounces`, `hardBounces`, `softBounces`, `delivered`, `sent`, `accepted`, `unsubscription`, `replies`, `blocked`, `rejected`, `skipped`
- `tags` (string, optional) — Filter the report for specific tags passed as a serialized urlencoded array
- `sort` (enum, optional, default: desc) — Sort the results in the ascending/descending order of record creation. Default order is **descending** if `sort` is not passed
  - Allowed values: `asc`, `desc`

## Response

### 200

Sms events report informations

- `events` (list of object, optional)
  - `date` (string, optional) — UTC date-time on which the event has been generated
  - `event` (enum, optional) — Event which occurred
    - Allowed values: `bounces`, `hardBounces`, `softBounces`, `delivered`, `sent`, `accepted`, `unsubscription`, `replies`, `blocked`, `rejected`, `skipped`
  - `messageId` (string, optional) — Message ID which generated the event
  - `phoneNumber` (string, optional) — Phone number which has generated the event
  - `reason` (string, optional) — Reason of bounce (only available if the event is hardbounce or softbounce)
  - `reply` (string, optional)
  - `tag` (string, optional) — Tag of the SMS which generated the event

## Errors

### 400 Bad Request Error

bad request

- `code` (enum, required) — Error code displayed in case of a failure
  - Allowed values: `invalid_parameter`, `missing_parameter`, `out_of_range`, `campaign_processing`, `campaign_sent`, `document_not_found`, `not_enough_credits`, `permission_denied`, `duplicate_parameter`, `duplicate_request`, `method_not_allowed`, `unauthorized`, `account_under_validation`, `not_acceptable`, `bad_request`, `unprocessable_entity`, `Domain does not exist`, `Contact email not found`, `Attribute not found`, `Category id not found`, `Invalid parameters passed`, `Record(s) for identifier not found`, `Returned when query params are invalid`, `Returned when invalid data posted`, `Feed not found`, `Campaign ID not found`, `api-key not found`, `DMARC policy requires domain authentication`, `DNS records not properly configured`, `Invalid OTP code provided`, `OTP code has expired`, `Domain already exists in your account`, `The sum of all IP weights must equal 100`, `Authentication failed`, `Insufficient credits`, `Request already processed`
- `message` (string, required) — Readable message associated to the failure

## Examples

**Response**

```json
{
  "events": [
    {
      "date": "2015-05-20T12:30:00Z",
      "event": "sent",
      "messageId": "1473139351170140",
      "phoneNumber": "911059469013",
      "reason": "Recipient is currently unreachable",
      "tag": "cabWaiting"
    },
    {
      "date": "2015-05-20T16:30:00Z",
      "event": "delivered",
      "messageId": "1473139351170140",
      "phoneNumber": "911059469013",
      "reason": "Recipient is currently unreachable",
      "tag": "cabRequest"
    }
  ]
}
```

**SDK Code**

```typescript response
import { BrevoClient } from "@getbrevo/brevo";

async function main() {
    const client = new BrevoClient({
        apiKey: "YOUR_API_KEY_HERE",
    });
    await client.transactionalSms.getSmsEvents({});
}
main();

```

```python response
from brevo import Brevo

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.transactional_sms.get_sms_events()

```

```php response
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\TransactionalSms\Requests\GetSmsEventsRequest;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->transactionalSms->getSmsEvents(
    new GetSmsEventsRequest([]),
);

```

```go response
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.brevo.com/v3/transactionalSMS/statistics/events"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("api-key", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby response
require 'uri'
require 'net/http'

url = URI("https://api.brevo.com/v3/transactionalSMS/statistics/events")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["api-key"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java response
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.brevo.com/v3/transactionalSMS/statistics/events")
  .header("api-key", "<apiKey>")
  .asString();
```

```csharp response
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/transactionalSMS/statistics/events");
var request = new RestRequest(Method.GET);
request.AddHeader("api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift response
import Foundation

let headers = ["api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.brevo.com/v3/transactionalSMS/statistics/events")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```