Rotate a record key
curl --request POST \
--url https://api.airctrl.dev/v1/records/{id}/rotate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ciphertext": "<string>",
"cipherMeta": {},
"wrappedDek": {},
"recipientWrappers": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"wrappedDek": {}
}
],
"projectWrappedDek": {}
}
'import requests
url = "https://api.airctrl.dev/v1/records/{id}/rotate"
payload = {
"ciphertext": "<string>",
"cipherMeta": {},
"wrappedDek": {},
"recipientWrappers": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"wrappedDek": {}
}
],
"projectWrappedDek": {}
}
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({
ciphertext: '<string>',
cipherMeta: {},
wrappedDek: {},
recipientWrappers: [{userId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', wrappedDek: {}}],
projectWrappedDek: {}
})
};
fetch('https://api.airctrl.dev/v1/records/{id}/rotate', 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.airctrl.dev/v1/records/{id}/rotate",
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([
'ciphertext' => '<string>',
'cipherMeta' => [
],
'wrappedDek' => [
],
'recipientWrappers' => [
[
'userId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'wrappedDek' => [
]
]
],
'projectWrappedDek' => [
]
]),
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.airctrl.dev/v1/records/{id}/rotate"
payload := strings.NewReader("{\n \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\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.airctrl.dev/v1/records/{id}/rotate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.airctrl.dev/v1/records/{id}/rotate")
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 \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"recordId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dekVersion": 2
}
}{
"ok": false,
"error": {
"code": "bad_request",
"message": "Request validation failed",
"details": [
"Check the submitted values."
]
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "unauthorized",
"message": "Authentication is required"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "forbidden",
"message": "not_authorized"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "conflict",
"message": "idempotency_key_reused_with_different_params"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "Internal server error"
},
"requestId": "req_example"
}Records
Rotate a record key
Stores a newly encrypted value and replacement encrypted keys prepared by the client. Requires records:rotate or record ownership.
POST
/
records
/
{id}
/
rotate
Rotate a record key
curl --request POST \
--url https://api.airctrl.dev/v1/records/{id}/rotate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ciphertext": "<string>",
"cipherMeta": {},
"wrappedDek": {},
"recipientWrappers": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"wrappedDek": {}
}
],
"projectWrappedDek": {}
}
'import requests
url = "https://api.airctrl.dev/v1/records/{id}/rotate"
payload = {
"ciphertext": "<string>",
"cipherMeta": {},
"wrappedDek": {},
"recipientWrappers": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"wrappedDek": {}
}
],
"projectWrappedDek": {}
}
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({
ciphertext: '<string>',
cipherMeta: {},
wrappedDek: {},
recipientWrappers: [{userId: '3c90c3cc-0d44-4b50-8888-8dd25736052a', wrappedDek: {}}],
projectWrappedDek: {}
})
};
fetch('https://api.airctrl.dev/v1/records/{id}/rotate', 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.airctrl.dev/v1/records/{id}/rotate",
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([
'ciphertext' => '<string>',
'cipherMeta' => [
],
'wrappedDek' => [
],
'recipientWrappers' => [
[
'userId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'wrappedDek' => [
]
]
],
'projectWrappedDek' => [
]
]),
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.airctrl.dev/v1/records/{id}/rotate"
payload := strings.NewReader("{\n \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\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.airctrl.dev/v1/records/{id}/rotate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.airctrl.dev/v1/records/{id}/rotate")
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 \"ciphertext\": \"<string>\",\n \"cipherMeta\": {},\n \"wrappedDek\": {},\n \"recipientWrappers\": [\n {\n \"userId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"wrappedDek\": {}\n }\n ],\n \"projectWrappedDek\": {}\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"recordId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"dekVersion": 2
}
}{
"ok": false,
"error": {
"code": "bad_request",
"message": "Request validation failed",
"details": [
"Check the submitted values."
]
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "unauthorized",
"message": "Authentication is required"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "forbidden",
"message": "not_authorized"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "conflict",
"message": "idempotency_key_reused_with_different_params"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Too many requests"
},
"requestId": "req_example"
}{
"ok": false,
"error": {
"code": "internal_error",
"message": "Internal server error"
},
"requestId": "req_example"
}Authorizations
Human personal access token (sk-actrl-pat-...).
Path Parameters
Body
application/json
Secret encrypted with the new record key.
Client-generated encryption metadata.
New record key encrypted for the owner.
New encrypted record key for each recipient.
Show child attributes
Show child attributes
Optional new record key encrypted for the project key.