> 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 a contact's details

GET https://api.brevo.com/v3/contacts/{identifier}

Follow this format when passing a "SMS" phone number as an attribute.
Accepted Number Formats 91xxxxxxxxxx +91xxxxxxxxxx 0091xxxxxxxxxx
There are 2 ways to get a contact  Option 1- [https://api.brevo.com/v3/contacts/\{identifier}](https://api.brevo.com/v3/contacts/\{identifier})  Option 2- [https://api.brevo.com/v3/contacts/\{identifier}?identifierType=\{}](https://api.brevo.com/v3/contacts/\{identifier}?identifierType=\{})   Option 1 only works if identifierType is email\_id (for EMAIL), phone\_id (for SMS) or contact\_id (for ID of the contact),where you can directly pass the value of EMAIL, SMS and ID of the contact.    Option 2 works for all identifierType, use email\_id for EMAIL attribute, phone\_id for SMS attribute, contact\_id for ID of the contact, ext\_id for EXT\_ID attribute, whatsapp\_id for WHATSAPP attribute, landline\_number\_id for LANDLINE\_NUMBER attribute Along with the contact details, this endpoint will show the statistics of contact for the recent 90 days by default. To fetch the earlier statistics, please use Get contact campaign stats `https://developers.brevo.com/reference/contacts-7#getcontactstats` endpoint with the appropriate date ranges.

Reference: https://developers.brevo.com/reference/get-contact-info

## Authentication

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

## Request

### Path parameters

- `identifier` (string or integer, required) — Email (urlencoded) OR ID of the contact OR its SMS attribute value OR EXT_ID attribute (urlencoded)

### Query parameters

- `identifierType` (enum, optional) — email_id for Email, phone_id for SMS attribute, contact_id for ID of the contact, ext_id for EXT_ID attribute, whatsapp_id for WHATSAPP attribute, landline_number_id for LANDLINE_NUMBER attribute
  - Allowed values: `email_id`, `phone_id`, `contact_id`, `ext_id`, `whatsapp_id`, `landline_number_id`
- `startDate` (string, optional) — **Mandatory if endDate is used.** Starting date (YYYY-MM-DD) of the statistic events specific to campaigns. Must be lower than equal to endDate. Must not be greater than the current date.
- `endDate` (string, optional) — **Mandatory if startDate is used.** Ending date (YYYY-MM-DD) of the statistic events specific to campaigns. Must be greater than equal to startDate. Must not be greater than the current date.

## Response

### 200

Contact informations

- `attributes` (object, required) — Set of attributes of the contact
- `createdAt` (string, required) — Creation UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ)
- `emailBlacklisted` (boolean, required) — Blacklist status for email campaigns (true=blacklisted, false=not blacklisted)
- `id` (long, required) — ID of the contact for which you requested the details
- `listIds` (list of long, required)
- `modifiedAt` (string, required) — Last modification UTC date-time of the contact (YYYY-MM-DDTHH:mm:ss.SSSZ)
- `smsBlacklisted` (boolean, required) — Blacklist status for SMS campaigns (true=blacklisted, false=not blacklisted)
- `whatsappBlacklisted` (boolean, required) — Blacklist status for WhatsApp campaigns (true=blacklisted, false=not blacklisted)
- `statistics` (object, required) — Campaign statistics of the contact
  - `clicked` (list of object, optional) — Listing of the clicks generated by the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `links` (list of object, required) — Listing of the clicked links for the campaign
      - `count` (long, required) — Number of clicks on this link for the campaign
      - `eventTime` (string, required) — UTC date-time of the event
      - `ip` (string, required) — IP from which the user has clicked on the link
      - `url` (string, required) — URL of the clicked link
  - `complaints` (list of object, optional) — Listing of the complaints generated by the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `eventTime` (string, required) — UTC date-time of the event
  - `delivered` (list of object, optional) — Listing of the delivered campaign for the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `eventTime` (string, required) — UTC date-time of the event
  - `hardBounces` (list of object, optional) — Listing of the hard bounces generated by the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `eventTime` (string, required) — UTC date-time of the event
  - `messagesSent` (list of object, optional) — Listing of the sent campaign for the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `eventTime` (string, required) — UTC date-time of the event
  - `opened` (list of object, optional) — Listing of the openings generated by the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `count` (long, required) — Number of openings for the campaign
    - `eventTime` (string, required) — UTC date-time of the event
    - `ip` (string, required) — IP from which the user has opened the email
  - `softBounces` (list of object, optional) — Listing of the soft bounces generated by the contact
    - `campaignId` (long, required) — ID of the campaign which generated the event
    - `eventTime` (string, required) — UTC date-time of the event
  - `transacAttributes` (list of object, optional) — Listing of the transactional attributes for the contact
  - `unsubscriptions` (object, optional) — Listing of the unsubscription for the contact
    - `adminUnsubscription` (list of object, required) — Contact has been unsubscribed from the administrator
      - `eventTime` (string, required) — UTC date-time of the event
      - `ip` (string, optional) — IP from which the user has been unsubscribed
    - `userUnsubscription` (list of object, required) — Contact unsubscribe via unsubscription link in a campaign
      - `campaignId` (long, required, nullable) — ID of the campaign which generated the event
      - `eventTime` (string, required) — UTC date-time of the event
      - `ip` (string, optional) — IP from which the user has unsubscribed
- `email` (string, optional) — Email address of the contact for which you requested the details
- `listUnsubscribed` (list of long, optional)
- `consentGroups` (list of object, optional) — Consent groups the contact belongs to, with their subscription status. Only present when the Consent Groups feature is enabled for your account.
  - `id` (long, required) — ID of the consent group
  - `status` (enum, required) — The contact's subscription status within this consent group
    - Allowed values: `subscribed`, `unsubscribed`

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

### 404 Not Found Error

Contact not found

- `message` (string, required) — Readable message associated to the failure
- `code` (string, optional) — Error code displayed in case of a failure

## Examples

**Response**

```json
{
  "attributes": {
    "ADDRESS": "987 5th avenue",
    "AREA": "NY",
    "CITY": "New-York",
    "CIV": "1",
    "DOB": "1986-04-13",
    "FIRST_NAME": "Peggy",
    "LAST_NAME": "Rain",
    "SMS": "3087433387669",
    "ZIP_CODE": "87544"
  },
  "createdAt": "2017-05-02T16:40:31Z",
  "emailBlacklisted": false,
  "id": 42,
  "listIds": [
    40
  ],
  "modifiedAt": "2017-05-02T16:40:31Z",
  "smsBlacklisted": false,
  "whatsappBlacklisted": false,
  "statistics": {
    "clicked": [
      {
        "campaignId": 21,
        "links": [
          {
            "count": 2,
            "eventTime": "2016-05-03T21:25:01Z",
            "ip": "66.249.93.118",
            "url": "https://url.domain.com/fbe5387ec717e333628380454f68670010b205ff/1/go?uid={EMAIL}&utm_source=brevo&utm_campaign=test_camp&utm_medium=email"
          }
        ]
      }
    ],
    "delivered": [
      {
        "campaignId": 21,
        "eventTime": "2016-05-03T21:24:56Z",
        "count": 2,
        "ip": "66.249.93.118"
      }
    ],
    "messagesSent": [
      {
        "campaignId": 21,
        "eventTime": "2016-05-03T20:15:13Z"
      },
      {
        "campaignId": 42,
        "eventTime": "2016-10-17T10:30:01Z"
      }
    ],
    "opened": [
      {
        "campaignId": 21,
        "count": 2,
        "eventTime": "2016-05-03T21:24:56Z",
        "ip": "66.249.93.118"
      },
      {
        "campaignId": 68,
        "count": 1,
        "eventTime": "2017-01-30T13:56:40Z",
        "ip": "66.249.93.217"
      }
    ]
  },
  "email": "peggy.rain@example.com"
}
```

**SDK Code**

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

async function main() {
    const client = new BrevoClient({
        apiKey: "YOUR_API_KEY_HERE",
    });
    await client.contacts.getContactInfo({
        identifier: "string",
    });
}
main();

```

```python response
from brevo import Brevo

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.contacts.get_contact_info(
    identifier="string",
)

```

```php response
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\Contacts\Requests\GetContactInfoRequest;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->contacts->getContactInfo(
    'string',
    new GetContactInfoRequest([]),
);

```

```go response
package main

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

func main() {

	url := "https://api.brevo.com/v3/contacts/string"

	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/contacts/string")

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/contacts/string")
  .header("api-key", "<apiKey>")
  .asString();
```

```csharp response
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/contacts/string");
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/contacts/string")! 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()
```