curl --request POST \
--url https://orchestrator.control.coincover.com/v1/backup/store \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"user_identifier": "john.doe@example.com",
"verification_id": "a7b8c9d0-e1f2-4345-a678-901234567890",
"public_key": "30820122300d06092a86486f70d...",
"backup": [
{
"item_key": "seed_phrase",
"item_value": "SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...",
"item_checksum": "e3b0c44298fc1c149afbf4c8996f..."
}
],
"metadata": {
"description": "User's private seed phrase",
"content_type": "text/plain",
"original_filename": "seed.txt"
}
}
EOFimport requests
url = "https://orchestrator.control.coincover.com/v1/backup/store"
payload = {
"user_identifier": "john.doe@example.com",
"verification_id": "a7b8c9d0-e1f2-4345-a678-901234567890",
"public_key": "30820122300d06092a86486f70d...",
"backup": [
{
"item_key": "seed_phrase",
"item_value": "SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...",
"item_checksum": "e3b0c44298fc1c149afbf4c8996f..."
}
],
"metadata": {
"description": "User's private seed phrase",
"content_type": "text/plain",
"original_filename": "seed.txt"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_identifier: 'john.doe@example.com',
verification_id: 'a7b8c9d0-e1f2-4345-a678-901234567890',
public_key: '30820122300d06092a86486f70d...',
backup: [
{
item_key: 'seed_phrase',
item_value: 'SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...',
item_checksum: 'e3b0c44298fc1c149afbf4c8996f...'
}
],
metadata: {
description: 'User\'s private seed phrase',
content_type: 'text/plain',
original_filename: 'seed.txt'
}
})
};
fetch('https://orchestrator.control.coincover.com/v1/backup/store', 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://orchestrator.control.coincover.com/v1/backup/store",
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([
'user_identifier' => 'john.doe@example.com',
'verification_id' => 'a7b8c9d0-e1f2-4345-a678-901234567890',
'public_key' => '30820122300d06092a86486f70d...',
'backup' => [
[
'item_key' => 'seed_phrase',
'item_value' => 'SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...',
'item_checksum' => 'e3b0c44298fc1c149afbf4c8996f...'
]
],
'metadata' => [
'description' => 'User\'s private seed phrase',
'content_type' => 'text/plain',
'original_filename' => 'seed.txt'
]
]),
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://orchestrator.control.coincover.com/v1/backup/store"
payload := strings.NewReader("{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://orchestrator.control.coincover.com/v1/backup/store")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://orchestrator.control.coincover.com/v1/backup/store")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}"
response = http.request(request)
puts response.read_body{
"backup_type": "data",
"metadata": {
"description": "Test backup with 3 items",
"content_type": "application/json",
"original_filename": "backup.json",
"api_key_entity_type": "PARTNER",
"stored_at": "2025-11-30T20:15:20.123Z",
"backup_items_count": 3
},
"backup": [
{
"item_key": "seed_phrase",
"backup_id": "550e8400-e29b-41d4-a716-446655440000",
"checksum": "c557eec878dfd852ba3f88087c4f350f09c55537ab5e549c3cd14320ec3cef38",
"data_size": 1024
}
]
}Store encrypted backup data
Stores encrypted backup data securely. Accepts multiple backup items in a single request via the backup array (limited to a maximum of 3 items). Requires a verification_id that exists in the identity_verifications table and belongs to the user associated with the organisation. Each backup item’s item_key (e.g., “seed_phrase”, “private_key”) is stored in the hot-keys database metadata as backup_item_key for recovery operations. This endpoint calls the hot-keys orchestrator partner-secure-data endpoint.
curl --request POST \
--url https://orchestrator.control.coincover.com/v1/backup/store \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data @- <<EOF
{
"user_identifier": "john.doe@example.com",
"verification_id": "a7b8c9d0-e1f2-4345-a678-901234567890",
"public_key": "30820122300d06092a86486f70d...",
"backup": [
{
"item_key": "seed_phrase",
"item_value": "SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...",
"item_checksum": "e3b0c44298fc1c149afbf4c8996f..."
}
],
"metadata": {
"description": "User's private seed phrase",
"content_type": "text/plain",
"original_filename": "seed.txt"
}
}
EOFimport requests
url = "https://orchestrator.control.coincover.com/v1/backup/store"
payload = {
"user_identifier": "john.doe@example.com",
"verification_id": "a7b8c9d0-e1f2-4345-a678-901234567890",
"public_key": "30820122300d06092a86486f70d...",
"backup": [
{
"item_key": "seed_phrase",
"item_value": "SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...",
"item_checksum": "e3b0c44298fc1c149afbf4c8996f..."
}
],
"metadata": {
"description": "User's private seed phrase",
"content_type": "text/plain",
"original_filename": "seed.txt"
}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_identifier: 'john.doe@example.com',
verification_id: 'a7b8c9d0-e1f2-4345-a678-901234567890',
public_key: '30820122300d06092a86486f70d...',
backup: [
{
item_key: 'seed_phrase',
item_value: 'SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...',
item_checksum: 'e3b0c44298fc1c149afbf4c8996f...'
}
],
metadata: {
description: 'User\'s private seed phrase',
content_type: 'text/plain',
original_filename: 'seed.txt'
}
})
};
fetch('https://orchestrator.control.coincover.com/v1/backup/store', 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://orchestrator.control.coincover.com/v1/backup/store",
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([
'user_identifier' => 'john.doe@example.com',
'verification_id' => 'a7b8c9d0-e1f2-4345-a678-901234567890',
'public_key' => '30820122300d06092a86486f70d...',
'backup' => [
[
'item_key' => 'seed_phrase',
'item_value' => 'SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...',
'item_checksum' => 'e3b0c44298fc1c149afbf4c8996f...'
]
],
'metadata' => [
'description' => 'User\'s private seed phrase',
'content_type' => 'text/plain',
'original_filename' => 'seed.txt'
]
]),
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://orchestrator.control.coincover.com/v1/backup/store"
payload := strings.NewReader("{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://orchestrator.control.coincover.com/v1/backup/store")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://orchestrator.control.coincover.com/v1/backup/store")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_identifier\": \"john.doe@example.com\",\n \"verification_id\": \"a7b8c9d0-e1f2-4345-a678-901234567890\",\n \"public_key\": \"30820122300d06092a86486f70d...\",\n \"backup\": [\n {\n \"item_key\": \"seed_phrase\",\n \"item_value\": \"SGVsbG8gV29ybGQhIFRoaXMgaXMgbXk...\",\n \"item_checksum\": \"e3b0c44298fc1c149afbf4c8996f...\"\n }\n ],\n \"metadata\": {\n \"description\": \"User's private seed phrase\",\n \"content_type\": \"text/plain\",\n \"original_filename\": \"seed.txt\"\n }\n}"
response = http.request(request)
puts response.read_body{
"backup_type": "data",
"metadata": {
"description": "Test backup with 3 items",
"content_type": "application/json",
"original_filename": "backup.json",
"api_key_entity_type": "PARTNER",
"stored_at": "2025-11-30T20:15:20.123Z",
"backup_items_count": 3
},
"backup": [
{
"item_key": "seed_phrase",
"backup_id": "550e8400-e29b-41d4-a716-446655440000",
"checksum": "c557eec878dfd852ba3f88087c4f350f09c55537ab5e549c3cd14320ec3cef38",
"data_size": 1024
}
]
}Authorizations
API key for authentication and authorization
Body
User identifier (REQUIRED)
"john.doe@example.com"
Verification ID from a previous verification. (REQUIRED) Must exist in identity_verifications table and belong to the user associated with the organisation.
"a7b8c9d0-e1f2-4345-a678-901234567890"
Public key in hexadecimal format. (REQUIRED) 32-4096 characters long.
32 - 4096^[0-9a-fA-F]+$"30820122300d06092a86486f70d..."
Array of backup items to store. (REQUIRED) Allows multiple pieces of data to be backed up in a single request. Limited to a maximum of 3 items.
1 - 3 elementsShow child attributes
Show child attributes
Optional metadata associated with the backup. Allows custom key-value pairs.
Show child attributes
Show child attributes
Response
Backup stored successfully
Type of backup. Always present. Value is always "data".
data "data"
Metadata associated with the backup (echoed from request + enhanced with system metadata such as API key info, stored_at timestamp, and backup_items_count). Always present.
Show child attributes
Show child attributes
Array of stored backup items. Each item contains the item_key, backup_id, checksum, and data_size.
1Show child attributes
Show child attributes