This guide provides SQL query examples for common analytics scenarios covering all the use cases from the legacy API and more. All examples use ClickHouse SQL syntax and work with the /v2/analytics.getVerifications endpoint.
SELECT COUNT(*) as total_verificationsFROM key_verifications_v1WHERE time >= now() - INTERVAL 7 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total_verifications FROM key_verifications_v1 WHERE time >= now() - INTERVAL 7 DAY"}
Verifications by outcome
Copy
Ask AI
SELECT outcome, COUNT(*) as countFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAYGROUP BY outcomeORDER BY count DESC
JSON format:
Copy
Ask AI
{ "query": "SELECT outcome, COUNT(*) as count FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY GROUP BY outcome ORDER BY count DESC"}
Daily verification trend
Copy
Ask AI
SELECT time as date, SUM(count) as verificationsFROM key_verifications_per_day_v1WHERE time >= now() - INTERVAL 30 DAYGROUP BY dateORDER BY date
JSON format:
Copy
Ask AI
{ "query": "SELECT time as date, SUM(count) as verifications FROM key_verifications_per_day_v1 WHERE time >= now() - INTERVAL 30 DAY GROUP BY date ORDER BY date"}
Hourly breakdown for today
Copy
Ask AI
SELECT time as hour, outcome, SUM(count) as verificationsFROM key_verifications_per_hour_v1WHERE time >= toStartOfDay(now())GROUP BY time, outcomeORDER BY time, outcome
JSON format:
Copy
Ask AI
{ "query": "SELECT time as hour, outcome, SUM(count) as verifications FROM key_verifications_per_hour_v1 WHERE time >= toStartOfDay(now()) GROUP BY time, outcome ORDER BY time, outcome"}
SELECT external_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limitedFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAY AND external_id != '' GROUP BY external_idORDER BY total_verifications DESCLIMIT 100
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limited FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY AND external_id != '' GROUP BY external_id ORDER BY total_verifications DESC LIMIT 100"}
Usage for a specific user
Copy
Ask AI
SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limitedFROM key_verifications_v1WHERE external_id = 'user_123' AND time >= now() - INTERVAL 30 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limited FROM key_verifications_v1 WHERE external_id = 'user_123' AND time >= now() - INTERVAL 30 DAY"}
Top 10 users by API usage
Copy
Ask AI
SELECT external_id, COUNT(*) as total_verificationsFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAY AND external_id != '' GROUP BY external_idORDER BY total_verifications DESCLIMIT 10
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, COUNT(*) as total_verifications FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY AND external_id != '' GROUP BY external_id ORDER BY total_verifications DESC LIMIT 10"}
Daily usage per user
Copy
Ask AI
SELECT external_id, toDate(time) as date, COUNT(*) as verificationsFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAYGROUP BY external_id, dateORDER BY external_id, date
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, toDate(time) as date, COUNT(*) as verifications FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY GROUP BY external_id, date ORDER BY external_id, date"}
SELECT key_space_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successfulFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAYGROUP BY key_space_idORDER BY total_verifications DESC
JSON format:
Copy
Ask AI
{ "query": "SELECT key_space_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY GROUP BY key_space_id ORDER BY total_verifications DESC"}
Usage for a specific API
Copy
Ask AI
SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limited, countIf(outcome = 'INVALID') as invalidFROM key_verifications_v1WHERE key_space_id = 'ks_1234' AND time >= now() - INTERVAL 30 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limited, countIf(outcome = 'INVALID') as invalid FROM key_verifications_v1 WHERE key_space_id = 'ks_1234' AND time >= now() - INTERVAL 30 DAY"}
Compare multiple APIs
Copy
Ask AI
SELECT key_space_id, COUNT(*) as verifications, round(countIf(outcome = 'VALID') / COUNT(*) * 100, 2) as success_rateFROM key_verifications_v1WHERE key_space_id IN ('ks_1234', 'ks_5678') AND time >= now() - INTERVAL 7 DAYGROUP BY key_space_id
JSON format:
Copy
Ask AI
{ "query": "SELECT key_space_id, COUNT(*) as verifications, round(countIf(outcome = 'VALID') / COUNT(*) * 100, 2) as success_rate FROM key_verifications_v1 WHERE key_space_id IN ('ks_1234', 'ks_5678') AND time >= now() - INTERVAL 7 DAY GROUP BY key_space_id"}
SELECT key_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successfulFROM key_verifications_v1WHERE time >= now() - INTERVAL 30 DAYGROUP BY key_idORDER BY total_verifications DESCLIMIT 100
JSON format:
Copy
Ask AI
{ "query": "SELECT key_id, COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful FROM key_verifications_v1 WHERE time >= now() - INTERVAL 30 DAY GROUP BY key_id ORDER BY total_verifications DESC LIMIT 100"}
Usage for a specific key
Copy
Ask AI
SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limitedFROM key_verifications_v1WHERE key_id = 'key_1234' AND time >= now() - INTERVAL 30 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total_verifications, countIf(outcome = 'VALID') as successful, countIf(outcome = 'RATE_LIMITED') as rate_limited FROM key_verifications_v1 WHERE key_id = 'key_1234' AND time >= now() - INTERVAL 30 DAY"}
Keys with most errors
Copy
Ask AI
SELECT key_id, COUNT(*) as total_errors, groupArray(DISTINCT outcome) as error_typesFROM key_verifications_v1WHERE outcome != 'VALID' AND time >= now() - INTERVAL 7 DAYGROUP BY key_idORDER BY total_errors DESCLIMIT 20
JSON format:
Copy
Ask AI
{ "query": "SELECT key_id, COUNT(*) as total_errors, groupArray(DISTINCT outcome) as error_types FROM key_verifications_v1 WHERE outcome != 'VALID' AND time >= now() - INTERVAL 7 DAY GROUP BY key_id ORDER BY total_errors DESC LIMIT 20"}
Tags allow you to add custom metadata to verification requests for filtering and aggregation.
Filter by single tag
Copy
Ask AI
SELECT COUNT(*) as totalFROM key_verifications_v1WHERE has(tags, 'path=/api/v1/users') AND time >= now() - INTERVAL 7 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total FROM key_verifications_v1 WHERE has(tags, 'path=/api/v1/users') AND time >= now() - INTERVAL 7 DAY"}
Filter by multiple tags (OR)
Copy
Ask AI
SELECT COUNT(*) as totalFROM key_verifications_v1WHERE hasAny(tags, ['path=/api/v1/users', 'path=/api/v1/posts']) AND time >= now() - INTERVAL 7 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total FROM key_verifications_v1 WHERE hasAny(tags, ['path=/api/v1/users', 'path=/api/v1/posts']) AND time >= now() - INTERVAL 7 DAY"}
Filter by multiple tags (AND)
Copy
Ask AI
SELECT COUNT(*) as totalFROM key_verifications_v1WHERE hasAll(tags, ['environment=production', 'team=backend']) AND time >= now() - INTERVAL 7 DAY
JSON format:
Copy
Ask AI
{ "query": "SELECT COUNT(*) as total FROM key_verifications_v1 WHERE hasAll(tags, ['environment=production', 'team=backend']) AND time >= now() - INTERVAL 7 DAY"}
Group by tag
Copy
Ask AI
SELECT arrayJoin(tags) as tag, COUNT(*) as verificationsFROM key_verifications_v1WHERE time >= now() - INTERVAL 7 DAYGROUP BY tagORDER BY verifications DESCLIMIT 20
JSON format:
Copy
Ask AI
{ "query": "SELECT arrayJoin(tags) as tag, COUNT(*) as verifications FROM key_verifications_v1 WHERE time >= now() - INTERVAL 7 DAY GROUP BY tag ORDER BY verifications DESC LIMIT 20"}
Breakdown by endpoint (using path tag)
Copy
Ask AI
SELECT arrayJoin(arrayFilter(x -> startsWith(x, 'path='), tags)) as endpoint, COUNT(*) as requestsFROM key_verifications_v1WHERE time >= now() - INTERVAL 24 HOURGROUP BY endpointORDER BY requests DESC
JSON format:
Copy
Ask AI
{ "query": "SELECT arrayJoin(arrayFilter(x -> startsWith(x, 'path='), tags)) as endpoint, COUNT(*) as requests FROM key_verifications_v1 WHERE time >= now() - INTERVAL 24 HOUR GROUP BY endpoint ORDER BY requests DESC"}
SELECT external_id, toStartOfMonth(time) as month, SUM(spent_credits) as total_creditsFROM key_verifications_v1WHERE external_id != '' AND time >= toStartOfMonth(now())GROUP BY external_id, monthORDER BY total_credits DESC
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, toStartOfMonth(time) as month, SUM(spent_credits) as total_credits FROM key_verifications_v1 WHERE external_id != '' AND time >= toStartOfMonth(now()) GROUP BY external_id, month ORDER BY total_credits DESC"}
Current billing period credits
Copy
Ask AI
SELECT external_id, SUM(spent_credits) as credits_this_periodFROM key_verifications_v1WHERE external_id = 'user_123' AND time >= 1704067200000 -- Start of billing period (Unix millis) AND time < 1706745600000 -- End of billing period (Unix millis)GROUP BY external_id
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, SUM(spent_credits) as credits_this_period FROM key_verifications_v1 WHERE external_id = 'user_123' AND time >= 1704067200000 AND time < 1706745600000 GROUP BY external_id"}
Credit-based tier calculation
Copy
Ask AI
SELECT external_id, SUM(spent_credits) as total_credits, CASE WHEN total_credits <= 1000 THEN 'free' WHEN total_credits <= 10000 THEN 'starter' WHEN total_credits <= 100000 THEN 'pro' ELSE 'enterprise' END as tierFROM key_verifications_v1WHERE time >= toStartOfMonth(now()) AND external_id = 'user_123'GROUP BY external_id
JSON format:
Copy
Ask AI
{ "query": "SELECT external_id, SUM(spent_credits) as total_credits, CASE WHEN total_credits <= 1000 THEN 'free' WHEN total_credits <= 10000 THEN 'starter' WHEN total_credits <= 100000 THEN 'pro' ELSE 'enterprise' END as tier FROM key_verifications_v1 WHERE time >= toStartOfMonth(now()) AND external_id = 'user_123' GROUP BY external_id"}
Daily credit usage and cost
Copy
Ask AI
SELECT toDate(time) as date, SUM(spent_credits) as credits_used, credits_used * 0.001 as estimated_cost -- $0.001 per creditFROM key_verifications_v1WHERE external_id = 'user_123' AND time >= now() - INTERVAL 30 DAYGROUP BY dateORDER BY date
JSON format:
Copy
Ask AI
{ "query": "SELECT toDate(time) as date, SUM(spent_credits) as credits_used, credits_used * 0.001 as estimated_cost FROM key_verifications_v1 WHERE external_id = 'user_123' AND time >= now() - INTERVAL 30 DAY GROUP BY date ORDER BY date"}
WITH first_seen AS ( SELECT external_id, min(time) as first_verification FROM key_verifications_v1 WHERE external_id != '' GROUP BY external_id)SELECT toDate(kv.time) as date, countIf(kv.time = fs.first_verification) as new_users, countIf(kv.time > fs.first_verification) as returning_usersFROM key_verifications_v1 kvJOIN first_seen fs ON kv.external_id = fs.external_idWHERE kv.time >= now() - INTERVAL 30 DAYGROUP BY dateORDER BY date
JSON format:
Copy
Ask AI
{ "query": "WITH first_seen AS ( SELECT external_id, min(time) as first_verification FROM key_verifications_v1 WHERE external_id != '' GROUP BY external_id ) SELECT toDate(kv.time) as date, countIf(kv.time = fs.first_verification) as new_users, countIf(kv.time > fs.first_verification) as returning_users FROM key_verifications_v1 kv JOIN first_seen fs ON kv.external_id = fs.external_id WHERE kv.time >= now() - INTERVAL 30 DAY GROUP BY date ORDER BY date"}
Moving average (7-day)
Copy
Ask AI
SELECT date, verifications, avg(verifications) OVER ( ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) as moving_avg_7dFROM ( SELECT time as date, SUM(count) as verifications FROM key_verifications_per_day_v1 WHERE time >= now() - INTERVAL 60 DAY GROUP BY date)ORDER BY date
JSON format:
Copy
Ask AI
{ "query": "SELECT date, verifications, avg(verifications) OVER ( ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) as moving_avg_7d FROM ( SELECT time as date, SUM(count) as verifications FROM key_verifications_per_day_v1 WHERE time >= now() - INTERVAL 60 DAY GROUP BY date ) ORDER BY date"}
For better performance on large time ranges, use pre-aggregated tables:
Hourly aggregates
Copy
Ask AI
SELECT time, SUM(count) as totalFROM key_verifications_per_hour_v1WHERE time >= toStartOfHour(now() - INTERVAL 7 DAY)GROUP BY timeORDER BY time
JSON format:
Copy
Ask AI
{ "query": "SELECT time, SUM(count) as total FROM key_verifications_per_hour_v1 WHERE time >= toStartOfHour(now() - INTERVAL 7 DAY) GROUP BY time ORDER BY time"}
Daily aggregates
Copy
Ask AI
SELECT time, SUM(count) as totalFROM key_verifications_per_day_v1WHERE time >= toStartOfDay(now() - INTERVAL 30 DAY)GROUP BY timeORDER BY time
JSON format:
Copy
Ask AI
{ "query": "SELECT time, SUM(count) as total FROM key_verifications_per_day_v1 WHERE time >= toStartOfDay(now() - INTERVAL 30 DAY) GROUP BY time ORDER BY time"}
Monthly aggregates
Copy
Ask AI
SELECT time, SUM(count) as totalFROM key_verifications_per_month_v1WHERE time >= toStartOfMonth(now() - INTERVAL 12 MONTH)GROUP BY timeORDER BY time
JSON format:
Copy
Ask AI
{ "query": "SELECT time, SUM(count) as total FROM key_verifications_per_month_v1 WHERE time >= toStartOfMonth(now() - INTERVAL 12 MONTH) GROUP BY time ORDER BY time"}