curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenizeimport requests
url = "https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize', 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.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize"
req, _ := http.NewRequest("POST", url, nil)
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.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"tokenized": [
{
"index": 0,
"ref": "crm-row-4812",
"type": "email",
"token": "pii_email_EXAMPLE0000000000000000000000000000000",
"sealed": "enc:v1:EXAMPLESEALEDENVELOPEPLACEHOLDER0000000000000000000000000000000000"
}
],
"skipped": [
{
"index": 1,
"ref": null,
"type": "ssn",
"reason": "unnormalizable"
}
],
"reversible": true,
"tokenized_count": 1,
"skipped_count": 1
},
"meta": {
"request_id": "req_EXAMPLE",
"timestamp": "2026-09-02T12:00:00.000Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Tokenize sensitive contact identifiers (PII vault)
Turns each sensitive identifier (email / phone / ssn / national_id) into a deterministic, tenant-scoped opaque token so profiles can be segmented, joined, and activated on tokens instead of cleartext PII (data-minimization / privacy-by-design). The same value always yields the same token for a tenant (so records for one person collapse to one segmentable key), but the token is a keyed pseudonym that cannot be reversed without the sealed envelope. Pass reversible: true to also receive a sealed envelope per token to store for later detokenize; the default returns tokens only and the cleartext is unrecoverable from the response. Values that are not valid identifiers of their type are skipped (counted, never echoed). The response never contains the cleartext value. Owner / admin / developer with the contacts:read scope.
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenizeimport requests
url = "https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize', 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.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize"
req, _ := http.NewRequest("POST", url, nil)
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.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/pii-vault/tokenize")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"tokenized": [
{
"index": 0,
"ref": "crm-row-4812",
"type": "email",
"token": "pii_email_EXAMPLE0000000000000000000000000000000",
"sealed": "enc:v1:EXAMPLESEALEDENVELOPEPLACEHOLDER0000000000000000000000000000000000"
}
],
"skipped": [
{
"index": 1,
"ref": null,
"type": "ssn",
"reason": "unnormalizable"
}
],
"reversible": true,
"tokenized_count": 1,
"skipped_count": 1
},
"meta": {
"request_id": "req_EXAMPLE",
"timestamp": "2026-09-02T12:00:00.000Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Response
Tokens (and sealed envelopes when reversible was requested) with the tokenized / skipped counts. Indices are the record's position in the request array. Cleartext is never echoed — token literals below are obviously-fake doc placeholders.
Tokens (and sealed envelopes when reversible was requested) with the tokenized / skipped counts. Indices are the record's position in the request array. Cleartext is never echoed — token literals below are obviously-fake doc placeholders.