curl --request POST \
--url https://api.sapt.ai/projects/{projectId}/conversions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"kind": "Purchase",
"value": 49.99,
"currency": "USD",
"email": "<string>",
"phone": "<string>",
"visitorId": "<string>",
"personId": "<string>",
"sourceUrl": "<string>",
"eventId": "your-order-id-123"
}
'import requests
url = "https://api.sapt.ai/projects/{projectId}/conversions"
payload = {
"kind": "Purchase",
"value": 49.99,
"currency": "USD",
"email": "<string>",
"phone": "<string>",
"visitorId": "<string>",
"personId": "<string>",
"sourceUrl": "<string>",
"eventId": "your-order-id-123"
}
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({
kind: 'Purchase',
value: 49.99,
currency: 'USD',
email: '<string>',
phone: '<string>',
visitorId: '<string>',
personId: '<string>',
sourceUrl: '<string>',
eventId: 'your-order-id-123'
})
};
fetch('https://api.sapt.ai/projects/{projectId}/conversions', 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.sapt.ai/projects/{projectId}/conversions",
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([
'kind' => 'Purchase',
'value' => 49.99,
'currency' => 'USD',
'email' => '<string>',
'phone' => '<string>',
'visitorId' => '<string>',
'personId' => '<string>',
'sourceUrl' => '<string>',
'eventId' => 'your-order-id-123'
]),
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.sapt.ai/projects/{projectId}/conversions"
payload := strings.NewReader("{\n \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\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.sapt.ai/projects/{projectId}/conversions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sapt.ai/projects/{projectId}/conversions")
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 \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\n}"
response = http.request(request)
puts response.read_body{
"eventId": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}Send a server-side conversion
Send a conversion to Meta’s Conversions API server-side. Customer data is hashed before delivery. Returns the eventId used — send the same id from your browser pixel to dedupe. A CAPI pixel must be connected first.
curl --request POST \
--url https://api.sapt.ai/projects/{projectId}/conversions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"kind": "Purchase",
"value": 49.99,
"currency": "USD",
"email": "<string>",
"phone": "<string>",
"visitorId": "<string>",
"personId": "<string>",
"sourceUrl": "<string>",
"eventId": "your-order-id-123"
}
'import requests
url = "https://api.sapt.ai/projects/{projectId}/conversions"
payload = {
"kind": "Purchase",
"value": 49.99,
"currency": "USD",
"email": "<string>",
"phone": "<string>",
"visitorId": "<string>",
"personId": "<string>",
"sourceUrl": "<string>",
"eventId": "your-order-id-123"
}
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({
kind: 'Purchase',
value: 49.99,
currency: 'USD',
email: '<string>',
phone: '<string>',
visitorId: '<string>',
personId: '<string>',
sourceUrl: '<string>',
eventId: 'your-order-id-123'
})
};
fetch('https://api.sapt.ai/projects/{projectId}/conversions', 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.sapt.ai/projects/{projectId}/conversions",
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([
'kind' => 'Purchase',
'value' => 49.99,
'currency' => 'USD',
'email' => '<string>',
'phone' => '<string>',
'visitorId' => '<string>',
'personId' => '<string>',
'sourceUrl' => '<string>',
'eventId' => 'your-order-id-123'
]),
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.sapt.ai/projects/{projectId}/conversions"
payload := strings.NewReader("{\n \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\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.sapt.ai/projects/{projectId}/conversions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sapt.ai/projects/{projectId}/conversions")
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 \"kind\": \"Purchase\",\n \"value\": 49.99,\n \"currency\": \"USD\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"visitorId\": \"<string>\",\n \"personId\": \"<string>\",\n \"sourceUrl\": \"<string>\",\n \"eventId\": \"your-order-id-123\"\n}"
response = http.request(request)
puts response.read_body{
"eventId": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}Authorizations
JWT token obtained from /api/auth/token endpoint. Token is verified using JWKS and must include a valid user identifier.
Path Parameters
The project id.
"123e4567-e89b-12d3-a456-426614174000"
Body
The Meta standard event name.
Lead, Purchase, CompleteRegistration, AddToCart, InitiateCheckout, PageView, ViewContent, Subscribe, Qualified, Schedule, Contact, Showed, NoShow, Disqualified "Purchase"
Monetary value of the conversion.
x >= 049.99
ISO 4217 currency code.
3"USD"
Customer email — hashed before delivery.
Customer phone — hashed before delivery.
Sapt first-party visitor id (_sapt_vid), if you have it.
CRM Person id to attribute the conversion to.
The page URL where the conversion occurred.
Send the same id from your browser pixel (fbq) so Meta dedupes the browser and server events. Auto-minted and returned if omitted.
"your-order-id-123"
Response
Conversion accepted
The event_id delivered to Meta — reconcile against your browser pixel.