curl --request POST \
--url https://api.getredo.com/v2.2/stores/{storeId}/events/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"events": [
{
"eventName": "User Registered",
"customer": {
"email": "alice@example.com"
},
"data": {
"Plan Type": "premium"
}
},
{
"eventName": "Purchase Completed",
"customer": {
"email": "bob@example.com"
},
"data": {
"Order Total": 99.99,
"Item Count": 3
},
"value": 99.99,
"valueCurrency": "USD",
"uniqueId": "order-456"
}
]
}
'import requests
url = "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk"
payload = { "events": [
{
"eventName": "User Registered",
"customer": { "email": "alice@example.com" },
"data": { "Plan Type": "premium" }
},
{
"eventName": "Purchase Completed",
"customer": { "email": "bob@example.com" },
"data": {
"Order Total": 99.99,
"Item Count": 3
},
"value": 99.99,
"valueCurrency": "USD",
"uniqueId": "order-456"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
events: [
{
eventName: 'User Registered',
customer: {email: 'alice@example.com'},
data: {'Plan Type': 'premium'}
},
{
eventName: 'Purchase Completed',
customer: {email: 'bob@example.com'},
data: {'Order Total': 99.99, 'Item Count': 3},
value: 99.99,
valueCurrency: 'USD',
uniqueId: 'order-456'
}
]
})
};
fetch('https://api.getredo.com/v2.2/stores/{storeId}/events/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'events' => [
[
'eventName' => 'User Registered',
'customer' => [
'email' => 'alice@example.com'
],
'data' => [
'Plan Type' => 'premium'
]
],
[
'eventName' => 'Purchase Completed',
'customer' => [
'email' => 'bob@example.com'
],
'data' => [
'Order Total' => 99.99,
'Item Count' => 3
],
'value' => 99.99,
'valueCurrency' => 'USD',
'uniqueId' => 'order-456'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk"
payload := strings.NewReader("{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getredo.com/v2.2/stores/{storeId}/events/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getredo.com/v2.2/stores/{storeId}/events/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}Bulk create custom events
Create multiple custom events in a single request. Accepts up to 100 events per request.
Each event is validated independently. The response includes per-event results, allowing partial failures — some events may be accepted while others are rejected due to validation errors.
Identity Resolution
Each event resolves customers independently using the same priority order as the single-event endpoint:
customer.id— Redo customer ObjectId (highest priority)customer.email— customer email addresscustomer.phoneNumber— customer phone number
At least one identifier must be provided per event. If no matching customer is found, one will be created automatically.
Rate Limiting
This endpoint is rate-limited to 100 requests per second per store.
curl --request POST \
--url https://api.getredo.com/v2.2/stores/{storeId}/events/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"events": [
{
"eventName": "User Registered",
"customer": {
"email": "alice@example.com"
},
"data": {
"Plan Type": "premium"
}
},
{
"eventName": "Purchase Completed",
"customer": {
"email": "bob@example.com"
},
"data": {
"Order Total": 99.99,
"Item Count": 3
},
"value": 99.99,
"valueCurrency": "USD",
"uniqueId": "order-456"
}
]
}
'import requests
url = "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk"
payload = { "events": [
{
"eventName": "User Registered",
"customer": { "email": "alice@example.com" },
"data": { "Plan Type": "premium" }
},
{
"eventName": "Purchase Completed",
"customer": { "email": "bob@example.com" },
"data": {
"Order Total": 99.99,
"Item Count": 3
},
"value": 99.99,
"valueCurrency": "USD",
"uniqueId": "order-456"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
events: [
{
eventName: 'User Registered',
customer: {email: 'alice@example.com'},
data: {'Plan Type': 'premium'}
},
{
eventName: 'Purchase Completed',
customer: {email: 'bob@example.com'},
data: {'Order Total': 99.99, 'Item Count': 3},
value: 99.99,
valueCurrency: 'USD',
uniqueId: 'order-456'
}
]
})
};
fetch('https://api.getredo.com/v2.2/stores/{storeId}/events/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'events' => [
[
'eventName' => 'User Registered',
'customer' => [
'email' => 'alice@example.com'
],
'data' => [
'Plan Type' => 'premium'
]
],
[
'eventName' => 'Purchase Completed',
'customer' => [
'email' => 'bob@example.com'
],
'data' => [
'Order Total' => 99.99,
'Item Count' => 3
],
'value' => 99.99,
'valueCurrency' => 'USD',
'uniqueId' => 'order-456'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getredo.com/v2.2/stores/{storeId}/events/bulk"
payload := strings.NewReader("{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getredo.com/v2.2/stores/{storeId}/events/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getredo.com/v2.2/stores/{storeId}/events/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"events\": [\n {\n \"eventName\": \"User Registered\",\n \"customer\": {\n \"email\": \"alice@example.com\"\n },\n \"data\": {\n \"Plan Type\": \"premium\"\n }\n },\n {\n \"eventName\": \"Purchase Completed\",\n \"customer\": {\n \"email\": \"bob@example.com\"\n },\n \"data\": {\n \"Order Total\": 99.99,\n \"Item Count\": 3\n },\n \"value\": 99.99,\n \"valueCurrency\": \"USD\",\n \"uniqueId\": \"order-456\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}{
"detail": "<string>",
"instance": "<string>",
"title": "<string>",
"type": "about:blank"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Store ID
"64e5a8a1af49a89df37e4ee7"
Body
Request body for sending multiple custom events in a single request.
Array of custom events to create.
1 - 100 elementsShow child attributes
Show child attributes
Response
Bulk request accepted and queued for processing. No response body is returned.
Was this page helpful?