Skip to main content
POST
/
v2
/
people
/
bulk
curl --location --request POST 'https://api.audienceful.com/v2/people/bulk' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <your-api-key>' \
--data-raw '{
    "people": [
        { "email": "[email protected]", "tags": ["import"], "notes": "", "extra_data": { "plan": "pro" } },
        { "email": "[email protected]" }
    ]
}'
import requests

url = "https://api.audienceful.com/v2/people/bulk"
headers = {
    "Content-Type": "application/json",
    "X-Api-Key": "<your-api-key>",
}
payload = {
    "people": [
        {
            "email": "[email protected]",
            "tags": ["import"],
            "notes": "",
            "extra_data": {
                "plan": "pro",
            },
        },
        {
            "email": "[email protected]",
        },
    ],
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
const response = await fetch("https://api.audienceful.com/v2/people/bulk", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Api-Key": "<your-api-key>",
  },
  body: JSON.stringify({
    "people": [
      {
        "email": "[email protected]",
        "tags": [
          "import"
        ],
        "notes": "",
        "extra_data": {
          "plan": "pro"
        }
      },
      {
        "email": "[email protected]"
      }
    ]
  }),
});
const data = await response.json();
console.log(data);
{
  "operation_id": "task-abc123",
  "operation_url": "https://api.audienceful.com/v2/operations/task-abc123",
  "status": "pending",
  "accepted": 2
}
Requires the people:write scope. This endpoint accepts up to 1,000 contacts per call and processes them asynchronously — it returns immediately with an operation_id you can poll for completion. Like the single Create a Contact endpoint, contacts are keyed by email: any email that already exists is merged with the supplied data (there is no skip-existing mode).

Body

people
array
required
The contacts to create or merge (at least one, at most 1,000).

Response

Returns 202 Accepted.
operation_id
string
The id of the async operation.
operation_url
string
The full URL of the operation — poll it to watch the batch progress from pendingprocessingsucceeded.
status
string
The operation’s initial status, pending. Poll the operation to see it move as the batch is processed.
accepted
number
The number of contacts accepted for processing.
curl --location --request POST 'https://api.audienceful.com/v2/people/bulk' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <your-api-key>' \
--data-raw '{
    "people": [
        { "email": "[email protected]", "tags": ["import"], "notes": "", "extra_data": { "plan": "pro" } },
        { "email": "[email protected]" }
    ]
}'
import requests

url = "https://api.audienceful.com/v2/people/bulk"
headers = {
    "Content-Type": "application/json",
    "X-Api-Key": "<your-api-key>",
}
payload = {
    "people": [
        {
            "email": "[email protected]",
            "tags": ["import"],
            "notes": "",
            "extra_data": {
                "plan": "pro",
            },
        },
        {
            "email": "[email protected]",
        },
    ],
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
const response = await fetch("https://api.audienceful.com/v2/people/bulk", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Api-Key": "<your-api-key>",
  },
  body: JSON.stringify({
    "people": [
      {
        "email": "[email protected]",
        "tags": [
          "import"
        ],
        "notes": "",
        "extra_data": {
          "plan": "pro"
        }
      },
      {
        "email": "[email protected]"
      }
    ]
  }),
});
const data = await response.json();
console.log(data);
{
  "operation_id": "task-abc123",
  "operation_url": "https://api.audienceful.com/v2/operations/task-abc123",
  "status": "pending",
  "accepted": 2
}