Account & API keys
These endpoints let you check your account details, current plan, and resource usage without leaving your integration. Useful for building dashboards or validating that your application is connected to the right account.
Account info
Returns your account details including name, email, timezone, and the full plan configuration with limits for monitors, retention, frequency, and features.
/v1/accountcurl "https://api.snapshotarchive.com/v1/account" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"$response = Http::withToken('YOUR_API_KEY')
->get('https://api.snapshotarchive.com/v1/account');
$account = $response->json('data');import requests
resp = requests.get('https://api.snapshotarchive.com/v1/account',
headers={'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json'})
account = resp.json()['data']const resp = await fetch('https://api.snapshotarchive.com/v1/account', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json' },
});
const { data: account } = await resp.json();require 'net/http'
require 'json'
uri = URI('https://api.snapshotarchive.com/v1/account')
req = Net::HTTP::Get.new(uri, 'Authorization' => "Bearer #{API_KEY}",
'Accept' => 'application/json')
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
account = JSON.parse(resp.body)['data']req, _ := http.NewRequest("GET", "https://api.snapshotarchive.com/v1/account", nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Accept", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)Response
{
"data": {
"id": 1,
"name": "John Doe",
"email": "[email protected]",
"timezone": "UTC",
"created_at": "2026-01-01T00:00:00Z",
"plan": {
"name": "Pro",
"slug": "pro",
"monitors_limit": 50,
"retention_days": 365,
"min_frequency_minutes": 360,
"api_access": true,
"diff_enabled": true,
"snapshot_package": true
}
}
}Usage stats
Shows how much of your plan's resources you've used — monitors, API keys, and today's snapshot count. Use this to monitor your usage programmatically and alert yourself before hitting limits.
/v1/account/usagecurl "https://api.snapshotarchive.com/v1/account/usage" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"$response = Http::withToken('YOUR_API_KEY')
->get('https://api.snapshotarchive.com/v1/account/usage');
$usage = $response->json('data');import requests
resp = requests.get('https://api.snapshotarchive.com/v1/account/usage',
headers={'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json'})
usage = resp.json()['data']const resp = await fetch('https://api.snapshotarchive.com/v1/account/usage', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json' },
});
const { data: usage } = await resp.json();require 'net/http'
require 'json'
uri = URI('https://api.snapshotarchive.com/v1/account/usage')
req = Net::HTTP::Get.new(uri, 'Authorization' => "Bearer #{API_KEY}",
'Accept' => 'application/json')
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
usage = JSON.parse(resp.body)['data']req, _ := http.NewRequest("GET", "https://api.snapshotarchive.com/v1/account/usage", nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Accept", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)Response
{
"data": {
"monitors": { "used": 12, "limit": 50, "remaining": 38 },
"api_keys": { "used": 2, "limit": 5, "remaining": 3 },
"snapshots_today": 47
}
}API Keys
Manage your API keys programmatically. You can create keys for different environments or integrations, restrict them to specific IP addresses, set expiration dates, and revoke compromised keys — all through the API. Each plan allows up to 5 API keys.
List API keys
Returns all API keys on your account. For security, the full key is never returned — only a preview (first 8 characters). Each key shows its active status, IP restrictions, expiration, and when it was last used.
/v1/api-keyscurl "https://api.snapshotarchive.com/v1/api-keys" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"$response = Http::withToken('YOUR_API_KEY')
->get('https://api.snapshotarchive.com/v1/api-keys');
$keys = $response->json('data');import requests
resp = requests.get('https://api.snapshotarchive.com/v1/api-keys',
headers={'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json'})
keys = resp.json()['data']const resp = await fetch('https://api.snapshotarchive.com/v1/api-keys', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json' },
});
const { data: keys } = await resp.json();require 'net/http'
require 'json'
uri = URI('https://api.snapshotarchive.com/v1/api-keys')
req = Net::HTTP::Get.new(uri, 'Authorization' => "Bearer #{API_KEY}",
'Accept' => 'application/json')
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
keys = JSON.parse(resp.body)['data']req, _ := http.NewRequest("GET", "https://api.snapshotarchive.com/v1/api-keys", nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Accept", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)Response
{
"data": [
{
"id": 1,
"name": "Production Key",
"key_preview": "abc12345...",
"is_active": true,
"allowed_ips": ["203.0.113.10"],
"expires_at": "2027-10-01T00:00:00Z",
"last_used_at": "2026-10-01T12:00:00Z",
"created_at": "2026-09-15T10:00:00Z"
}
]
}Create an API key
Creates a new API key. The response includes the full token — copy it immediately, it's only shown once. You can optionally restrict the key to specific IP addresses and set an expiration date.
/v1/api-keysRequest body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Key name (max 255 chars) |
expires_at | string | No | Expiration date (ISO 8601, must be in the future) |
allowed_ips | array | No | IP whitelist (max 20 IPs) |
curl -X POST https://api.snapshotarchive.com/v1/api-keys \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name": "CI/CD Pipeline",
"allowed_ips": ["203.0.113.10"],
"expires_at": "2027-12-31T23:59:59Z"
}'$response = Http::withToken('YOUR_API_KEY')
->post('https://api.snapshotarchive.com/v1/api-keys', [
'name' => 'CI/CD Pipeline',
'allowed_ips' => ['203.0.113.10'],
'expires_at' => '2027-12-31T23:59:59Z',
]);
$data = $response->json('data');
$token = $data['token']; // Save this immediately!import requests
resp = requests.post('https://api.snapshotarchive.com/v1/api-keys',
headers={'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json'},
json={'name': 'CI/CD Pipeline', 'allowed_ips': ['203.0.113.10'],
'expires_at': '2027-12-31T23:59:59Z'})
data = resp.json()['data']
token = data['token'] # Save this immediately!const resp = await fetch('https://api.snapshotarchive.com/v1/api-keys', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ name: 'CI/CD Pipeline',
allowed_ips: ['203.0.113.10'], expires_at: '2027-12-31T23:59:59Z' }),
});
const { data } = await resp.json();
console.log(data.token); // Save this immediately!require 'net/http'
require 'json'
uri = URI('https://api.snapshotarchive.com/v1/api-keys')
req = Net::HTTP::Post.new(uri, 'Authorization' => "Bearer #{API_KEY}",
'Content-Type' => 'application/json', 'Accept' => 'application/json')
req.body = { name: 'CI/CD Pipeline', allowed_ips: ['203.0.113.10'],
expires_at: '2027-12-31T23:59:59Z' }.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(resp.body)['data']
puts data['token'] # Save this immediately!body := strings.NewReader(`{"name":"CI/CD Pipeline",
"allowed_ips":["203.0.113.10"],"expires_at":"2027-12-31T23:59:59Z"}`)
req, _ := http.NewRequest("POST", "https://api.snapshotarchive.com/v1/api-keys", body)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)Response
{
"data": {
"api_key": {
"id": 2,
"name": "CI/CD Pipeline",
"key_preview": "xyz98765...",
"is_active": true,
"allowed_ips": ["203.0.113.10"],
"expires_at": "2027-12-31T23:59:59Z"
},
"token": "full-api-key-shown-only-once-copy-it-now..."
}
}Update and revoke an API key
Update a key's name, IP restrictions, active status, or expiration date.
# Add IP restriction
curl -X PUT https://api.snapshotarchive.com/v1/api-keys/2 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"allowed_ips": ["203.0.113.10", "198.51.100.20"]}'$response = Http::withToken('YOUR_API_KEY')
->put('https://api.snapshotarchive.com/v1/api-keys/2', [
'allowed_ips' => ['203.0.113.10', '198.51.100.20'],
]);
$key = $response->json('data');import requests
resp = requests.put('https://api.snapshotarchive.com/v1/api-keys/2',
headers={'Authorization': 'Bearer YOUR_API_KEY', 'Accept': 'application/json'},
json={'allowed_ips': ['203.0.113.10', '198.51.100.20']})
key = resp.json()['data']const resp = await fetch('https://api.snapshotarchive.com/v1/api-keys/2', {
method: 'PUT',
headers: { 'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify({ allowed_ips: ['203.0.113.10', '198.51.100.20'] }),
});
const { data: key } = await resp.json();require 'net/http'
require 'json'
uri = URI('https://api.snapshotarchive.com/v1/api-keys/2')
req = Net::HTTP::Put.new(uri, 'Authorization' => "Bearer #{API_KEY}",
'Content-Type' => 'application/json', 'Accept' => 'application/json')
req.body = { allowed_ips: ['203.0.113.10', '198.51.100.20'] }.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
key = JSON.parse(resp.body)['data']body := strings.NewReader(`{"allowed_ips":["203.0.113.10","198.51.100.20"]}`)
req, _ := http.NewRequest("PUT", "https://api.snapshotarchive.com/v1/api-keys/2", body)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)Revoke an API key. It's deactivated immediately and cannot be used again. Returns 204 No Content. You cannot revoke the key you're currently using for authentication (returns 409).
curl -X DELETE https://api.snapshotarchive.com/v1/api-keys/5 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"$response = Http::withToken('YOUR_API_KEY')
->delete('https://api.snapshotarchive.com/v1/api-keys/5');
// 204 No Contentresponse = requests.delete(
'https://api.snapshotarchive.com/v1/api-keys/5',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
) # 204 No Contentconst response = await fetch('https://api.snapshotarchive.com/v1/api-keys/5', {
method: 'DELETE',
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}); // 204 No Contenturi = URI('https://api.snapshotarchive.com/v1/api-keys/5')
req = Net::HTTP::Delete.new(uri)
req['Authorization'] = 'Bearer YOUR_API_KEY'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
# 204 No Contentreq, _ := http.NewRequest("DELETE", "https://api.snapshotarchive.com/v1/api-keys/5", nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
// 204 No Content