### GET https://emailoctopus.com/api/1.6/campaigns/:campaignId/reports/opened

Get information on the contacts who opened the campaign.

| Parameters                           |
|--------------------------------------|
| api_key (string)                    | Your API key. |
| limit (integer)                     | The number of records to return per page, up to a maximum of 100. Defaults to 100. |

### 200 (success) returns
| Field                | Description                                                  |
|----------------------|--------------------------------------------------------------|
| data (array of structs) | Details of each open:                                       |
| contact (struct)     | Details of the contact:                                     |
| id (string)          | The identifier of the contact.                              |
| email_address (string)| The email address of the contact.                           |
| fields (object)      | An object containing key/value pairs of field values.       |
| tags (array)         | An array of tags associated with the contact.               |
| status (string)      | The status of the contact: `SUBSCRIBED`, `UNSUBSCRIBED` or `PENDING`. |
| deleted (boolean)    | If the contact has since been deleted.                      |
| created_at (string)  | When the contact was created, in ISO 8601 format.          |
| last_updated_at (string)| When the contact was last updated, in ISO 8601 format.   |
| occurred_at (string) | When the open occurred, in ISO 8601 format.                |
| paging (struct/array) | If there is more data available, an object is returned in the following format: |
| next (string)        | A link for the immediate next page of results.              |

If there is no more data to page, an empty array is returned.

### Non-200 (error) returns
| Field                | Description                                                  |
|----------------------|--------------------------------------------------------------|
| code (string)        | The error code.                                            |
| message (string)     | A description of the error.                                |

#### Method-specific error codes
| Code                           | Description                                      |
|--------------------------------|--------------------------------------------------|
| CAMPAIGN_NOT_FOUND             | The campaign could not be found.                  |
| CAMPAIGN_NOT_SENT              | The campaign does not have a status of 'SENT'.   |
| CAMPAIGN_FEATURE_DISABLED       | The campaign does not have open tracking enabled. |

#### API-wide error codes
| Code                           | Description                                      |
|--------------------------------|--------------------------------------------------|
| INVALID_PARAMETERS              | Parameters are missing or invalid.                |
| API_KEY_INVALID                | Your API key is invalid.                          |
| UNAUTHORISED                   | You're not authorised to perform that action.     |
| NOT_FOUND                      | The requested endpoint does not exist.            |
| UNKNOWN                         | An unknown error has occurred.                    |

### Example request
```plaintext
/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000
```

### Example response
```json
{
    "data": [
        {
            "contact": {
                "id": "00000000-0000-0000-0000-000000000000",
                "email_address": "john.doe@example.com",
                "fields": {
                    "FirstName": "John",
                    "LastName": "Doe",
                    "Birthday": "2000-12-20"
                },
                "tags": [
                    "vip"
                ],
                "status": "SUBSCRIBED",
                "created_at": "2026-06-14T00:00:00+00:00",
                "last_updated_at": "2026-06-15T08:25:19+00:00"
            },
            "occurred_at": "2026-06-14T08:25:19+00:00"
        },
        {
            "contact": {
                "id": "00000000-0000-0000-0000-000000000001",
                "email_address": "jane.doe@example.com",
                "fields": {
                    "FirstName": "Jane",
                    "LastName": "Doe",
                    "Birthday": "2000-12-20"
                },
                "tags": [
                    "vip"
                ],
                "status": "SUBSCRIBED",
                "created_at": "2026-06-14T00:00:00+00:00"
            },
            "occurred_at": "2026-06-14T08:25:19+00:00"
        }
    ],
    "paging": []
}
```

### Code samples

#### cURL
```bash
curl -X GET \
    https://emailoctopus.com/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000
```

#### PHP
```php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://emailoctopus.com/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
```

#### Python
```python
import requests
params = (
    ('api_key', '00000000-0000-0000-0000-000000000000'),
)
response = requests.get('https://emailoctopus.com/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened', params=params)
```

#### Node.js
```javascript
var https = require('https');
var options = {
    hostname: 'emailoctopus.com',
    port: 443,
    path: '/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000',
    method: 'GET',
};
var req = https.request(options);
req.end();
```

#### Go
```go
package main
import (
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://emailoctopus.com/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000", nil)
    if err != nil {
        log.Fatal(err)
    }
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    bodyText, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
}
```
