curl --request PATCH \
--url https://api.scrip.dev/v1/participants/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"attributes": {
"plan": "premium",
"region": "us-east"
},
"display_name": "Jane Doe",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+15551234567",
"status": "SUSPENDED",
"tags": [
"vip"
]
}
'import requests
url = "https://api.scrip.dev/v1/participants/{id}"
payload = {
"attributes": {
"plan": "premium",
"region": "us-east"
},
"display_name": "Jane Doe",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+15551234567",
"status": "SUSPENDED",
"tags": ["vip"]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
attributes: {plan: 'premium', region: 'us-east'},
display_name: 'Jane Doe',
email: 'jane@example.com',
first_name: 'Jane',
last_name: 'Doe',
phone: '+15551234567',
status: 'SUSPENDED',
tags: ['vip']
})
};
fetch('https://api.scrip.dev/v1/participants/{id}', 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.scrip.dev/v1/participants/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'attributes' => [
'plan' => 'premium',
'region' => 'us-east'
],
'display_name' => 'Jane Doe',
'email' => 'jane@example.com',
'first_name' => 'Jane',
'last_name' => 'Doe',
'phone' => '+15551234567',
'status' => 'SUSPENDED',
'tags' => [
'vip'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.scrip.dev/v1/participants/{id}"
payload := strings.NewReader("{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.scrip.dev/v1/participants/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/participants/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"attributes": {
"plan": "premium",
"region": "us-east"
},
"balances": [
{
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"available": "1500.00",
"deferred": "0.00",
"held": "200.00"
}
],
"counters": {
"points_earned": "1500",
"purchases": "42"
},
"created_at": "2024-01-15T10:30:00Z",
"display_name": "Jane Doe",
"email": "jane@example.com",
"external_id": "user_123",
"first_name": "Jane",
"id": "550e8400-e29b-41d4-a716-446655440000",
"last_name": "Doe",
"phone": "+15551234567",
"program_ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"status": "ACTIVE",
"tags": [
"vip"
],
"tiers": {
"loyalty": {
"level": "gold",
"rank": 2
}
},
"updated_at": "2024-01-15T10:30:00Z"
}{
"code": "bad_request",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Missing or invalid credentials"
}{
"code": "forbidden",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Insufficient permissions for this action"
}{
"code": "not_found",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Resource not found"
}{
"code": "conflict",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Resource already exists or state conflict"
}{
"code": "unsupported_media_type",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Content-Type must be application/json"
}{
"code": "internal_error",
"message": "An internal error occurred"
}Update a participant
Partially update a participant.
curl --request PATCH \
--url https://api.scrip.dev/v1/participants/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"attributes": {
"plan": "premium",
"region": "us-east"
},
"display_name": "Jane Doe",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+15551234567",
"status": "SUSPENDED",
"tags": [
"vip"
]
}
'import requests
url = "https://api.scrip.dev/v1/participants/{id}"
payload = {
"attributes": {
"plan": "premium",
"region": "us-east"
},
"display_name": "Jane Doe",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+15551234567",
"status": "SUSPENDED",
"tags": ["vip"]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
attributes: {plan: 'premium', region: 'us-east'},
display_name: 'Jane Doe',
email: 'jane@example.com',
first_name: 'Jane',
last_name: 'Doe',
phone: '+15551234567',
status: 'SUSPENDED',
tags: ['vip']
})
};
fetch('https://api.scrip.dev/v1/participants/{id}', 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.scrip.dev/v1/participants/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'attributes' => [
'plan' => 'premium',
'region' => 'us-east'
],
'display_name' => 'Jane Doe',
'email' => 'jane@example.com',
'first_name' => 'Jane',
'last_name' => 'Doe',
'phone' => '+15551234567',
'status' => 'SUSPENDED',
'tags' => [
'vip'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.scrip.dev/v1/participants/{id}"
payload := strings.NewReader("{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://api.scrip.dev/v1/participants/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/participants/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"attributes\": {\n \"plan\": \"premium\",\n \"region\": \"us-east\"\n },\n \"display_name\": \"Jane Doe\",\n \"email\": \"jane@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\",\n \"phone\": \"+15551234567\",\n \"status\": \"SUSPENDED\",\n \"tags\": [\n \"vip\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"attributes": {
"plan": "premium",
"region": "us-east"
},
"balances": [
{
"asset_id": "550e8400-e29b-41d4-a716-446655440000",
"available": "1500.00",
"deferred": "0.00",
"held": "200.00"
}
],
"counters": {
"points_earned": "1500",
"purchases": "42"
},
"created_at": "2024-01-15T10:30:00Z",
"display_name": "Jane Doe",
"email": "jane@example.com",
"external_id": "user_123",
"first_name": "Jane",
"id": "550e8400-e29b-41d4-a716-446655440000",
"last_name": "Doe",
"phone": "+15551234567",
"program_ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"status": "ACTIVE",
"tags": [
"vip"
],
"tiers": {
"loyalty": {
"level": "gold",
"rank": 2
}
},
"updated_at": "2024-01-15T10:30:00Z"
}{
"code": "bad_request",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Missing or invalid credentials"
}{
"code": "forbidden",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Insufficient permissions for this action"
}{
"code": "not_found",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Resource not found"
}{
"code": "conflict",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Resource already exists or state conflict"
}{
"code": "unsupported_media_type",
"details": {
"expected": "<string>",
"field": "<string>",
"fields": [
{
"expected": "<unknown>",
"field": "<string>",
"message": "This field is required",
"reason": "required",
"received": "<string>"
}
],
"reason": "invalid",
"received": "<string>"
},
"message": "Content-Type must be application/json"
}{
"code": "internal_error",
"message": "An internal error occurred"
}external_id, attributes, tags, or profile fields (email, phone, first_name, last_name, display_name). Only the fields you include in the request body are changed; omitted fields are left as-is. Sending an empty string for a profile field clears it.
This endpoint does not modify the participant’s status. To change status, use the dedicated status endpoint. This separation prevents accidental state transitions during routine profile updates.
Authorizations
API key passed in the X-API-Key header.
Path Parameters
Participant ID
Body
Participant updates
Key-value metadata to merge with existing attributes. Each key is accessible in rules via the participant.attribute. shorthand or get(participant.attributes, "key", "")
Show child attributes
Show child attributes
{ "plan": "premium", "region": "us-east" }
Display name. Empty string clears the value
255"Jane Doe"
Contact email. Empty string clears the value
255"jane@example.com"
First name. Empty string clears the value
255"Jane"
Last name. Empty string clears the value
255"Doe"
Contact phone. Empty string clears the value
50"+15551234567"
Lifecycle state
ACTIVE, SUSPENDED, CLOSED "SUSPENDED"
Replaces all existing tags
["vip"]
Response
Participant updated
Key-value metadata. Each key is accessible in rules via the participant.attribute. shorthand (null if unset) or get(participant.attributes, "key", "")
Show child attributes
Show child attributes
{ "plan": "premium", "region": "us-east" }
Current balances per asset, split by bucket
Show child attributes
Show child attributes
Numeric accumulators, returned as strings for precision
Show child attributes
Show child attributes
{
"points_earned": "1500",
"purchases": "42"
}
When the participant was created
"2024-01-15T10:30:00Z"
Display name
"Jane Doe"
Contact email
"jane@example.com"
Your application's identifier for this user
"user_123"
First name
"Jane"
Participant ID
"550e8400-e29b-41d4-a716-446655440000"
Last name
"Doe"
Contact phone
"+15551234567"
Programs this participant is enrolled in
["550e8400-e29b-41d4-a716-446655440000"]
Lifecycle state
"ACTIVE"
Labels for segmentation, accessible in rules via participant.tag. (true/false) or 'name' in participant.tags
["vip"]
Current tier level per tier type
Show child attributes
Show child attributes
{ "loyalty": { "level": "gold", "rank": 2 } }
When the participant was last modified
"2024-01-15T10:30:00Z"