Get information on the contacts who opened the campaign.
| Parameters |
| api_key (string) |
| limit (integer) |
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
/api/1.6/campaigns/00000000-0000-0000-0000-000000000000/reports/opened?api_key=00000000-0000-0000-0000-000000000000
Example response
{
"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
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
$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
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
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
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)
}
}