API reference

Analytics

Pull executions, key-page funnels, geography and A/B results into your own panel or reports.

On this page

Every analytics endpoint is read-only and needs analytics:read. from, to and date are ISO-8601 timestamps in UTC, e.g. 2026-09-01T00:00:00.000Z. For a stats widget, pair analytics:read with services:read so it can resolve service names.

Get an overview

GET/api/analytics/statsanalytics:read

Everything the dashboard's analytics page shows: totals, executors, countries and referrers, per-service, per-provider and per-revenue performance, and a time series — for the last range days.

Query parameters

  • rangestring

    Time range in days for analytics data. Options: 7, 14, 30, 90, 365 — capped by the plan (403 LIMIT_EXCEEDED analytics_range).

    One of7143090365Default "30"
Response fieldsinside data
  • totalsobject
    Show 8 child attributes
    • total_keysnumber

      Total number of keys

    • total_generated_keysnumber

      Total generated keys

    • total_used_keysnumber

      Total used keys

    • expired_keysnumber

      Total expired keys

    • total_flowsnumber

      Total flow starts

    • active_revenuesnumber

      Currently active revenues

    • total_script_executionsnumber

      Total script executions

    • total_active_scriptsnumber

      Total active scripts

  • byExecutorarray of objects
    Show 3 child attributes
    • datestring

      Date bucket label

    • executorstring

      Executor name

    • countnumber

      Execution count

  • byCountryarray of objects
    Show 2 child attributes
    • countrystring

      Country code or name

    • countnumber

      Flow count for the country

  • byReferrerarray of objects
    Show 2 child attributes
    • referrerstring

      Traffic referrer

    • countnumber

      Flow count for the referrer

  • byServicearray of objects
    Show 4 child attributes
    • service_idinteger> 0

      Service UUID

    • service_namestring

      Service display name

    • flow_startsnumber

      Number of flow starts

    • checkpoints_passednumber

      Number of checkpoints passed

  • byProviderarray of objects
    Show 4 child attributes
    • provider_idinteger> 0

      Provider UUID

    • provider_namestring

      Provider display name

    • flow_startsnumber

      Number of flow starts

    • checkpoints_passednumber

      Number of checkpoints passed

  • byRevenuearray of objects
    Show 3 child attributes
    • revenue_idinteger> 0

      Revenue UUID

    • revenue_namestring

      Revenue display name

    • checkpoints_passednumber

      Number of checkpoints passed

  • timeSeriesarray of objects
    Show 7 child attributes
    • datestring

      Date bucket label

    • clicksnumber

      Number of clicks

    • checkpointsnumber

      Number of checkpoints completed

    • keysnumber

      Legacy key count field

    • keys_generatednumber

      Number of keys generated

    • keys_usednumber

      Number of keys used

    • script_executionsnumber

      Number of script executions

  • lockedarray of strings

    Breakdowns withheld by the plan (basic analytics); they come back as empty arrays.

    One ofbyExecutorbyCountrybyReferrerbyServicebyProviderbyRevenue
  • maxRangeDaysinteger

    Longest range the plan allows.

  • _cachedboolean

    Whether the response was served from cache

  • _generatedAtdatetime

    Timestamp when the analytics payload was generated

curl "https://api.santiauth.com/api/analytics/stats?range=30" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": {
    "totals": {
      "total_keys": 2500,
      "total_generated_keys": 2400,
      "total_used_keys": 1820,
      "expired_keys": 115,
      "total_flows": 6400,
      "active_revenues": 8,
      "total_script_executions": 0,
      "total_active_scripts": 0
    },
    "byExecutor": [
      {
        "date": "2026-04-30",
        "executor": "cloudflare-turnstile",
        "count": 120
      }
    ],
    "byCountry": [
      {
        "country": "US",
        "count": 840
      }
    ],
    "byReferrer": [
      {
        "referrer": "discord.gg",
        "count": 220
      }
    ],
    "byService": [
      {
        "service_id": "660e8400-e29b-41d4-a716-446655440001",
        "service_name": "Premium Access",
        "flow_starts": 510,
        "checkpoints_passed": 301
      }
    ],
    "byProvider": [
      {
        "provider_id": "770e8400-e29b-41d4-a716-446655440002",
        "provider_name": "Discord Verification",
        "flow_starts": 410,
        "checkpoints_passed": 245
      }
    ],
    "byRevenue": [
      {
        "revenue_id": "880e8400-e29b-41d4-a716-446655440003",
        "revenue_name": "Discord OAuth",
        "checkpoints_passed": 188
      }
    ],
    "timeSeries": [
      {
        "date": "2026-04-30",
        "clicks": 342,
        "checkpoints": 198,
        "keys": 0,
        "keys_generated": 75,
        "keys_used": 56,
        "script_executions": 0
      }
    ],
    "_cached": false,
    "_generatedAt": "2026-04-30T15:38:25.123Z"
  }
}

Get a time series

GET/api/analytics/time-seriesanalytics:read

The same metrics over a custom window, bucketed by granularity. Optionally narrowed to one provider.

Query parameters

  • service_idintegerrequired> 0

    Service the resource belongs to

  • provider_idinteger> 0

    Optional provider UUID to filter time-series analytics

  • fromstringrequired

    Start of the analytics range in ISO-8601 format

  • tostringrequired

    End of the analytics range in ISO-8601 format

  • granularitystring

    Aggregation granularity for the time-series data

    One ofhourlydailyDefault "daily"
Response fieldsinside data
  • periodstring

    Time bucket identifier

  • flowStartsnumber

    Number of flow starts

  • flowCompletionsnumber

    Number of flow completions

  • keysGeneratednumber

    Number of keys generated

  • keysUsednumber

    Number of keys used

curl "https://api.santiauth.com/api/analytics/time-series?service_id=1&from=2026-04-01T00%3A00%3A00.000Z&to=2026-04-30T23%3A59%3A59.999Z" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": [
    {
      "period": "2026-04-30",
      "flowStarts": 120,
      "flowCompletions": 84,
      "keysGenerated": 33,
      "keysUsed": 21
    }
  ]
}

Get a checkpoint funnel

GET/api/analytics/funnelanalytics:read

How many players reached and completed each checkpoint of a provider on one day — find the step where they drop off.

Query parameters

  • service_idintegerrequired> 0

    Service the resource belongs to

  • provider_idintegerrequired> 0

    Provider UUID to retrieve conversion funnel data for

  • datestringrequired

    Target date in ISO-8601 format used to compute funnel metrics

Response fieldsinside data
  • stepIndexnumber

    Funnel step order index

  • stepNamestring

    Funnel step name

  • enterednumber

    Users entering the step

  • completednumber

    Users completing the step

  • droppednumber

    Users dropping at the step

  • conversionRatenumber

    Step conversion rate percentage

curl "https://api.santiauth.com/api/analytics/funnel?service_id=1&provider_id=550e8400-e29b-41d4-a716-446655440000&date=2026-04-30T00%3A00%3A00.000Z" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": [
    {
      "stepIndex": 1,
      "stepName": "Discord verification",
      "entered": 200,
      "completed": 160,
      "dropped": 40,
      "conversionRate": 80
    }
  ]
}

Get geography

GET/api/analytics/geoanalytics:read

Key-page performance by country, for maps and regional reports.

Query parameters

  • service_idintegerrequired> 0

    Service the resource belongs to

  • fromstringrequired

    Start of the geo analytics range in ISO-8601 format

  • tostringrequired

    End of the geo analytics range in ISO-8601 format

Response fieldsinside data
  • countrystring

    Country code or name

  • flowStartsnumber

    Number of flow starts

  • flowCompletionsnumber

    Number of flow completions

curl "https://api.santiauth.com/api/analytics/geo?service_id=1&from=2026-04-01T00%3A00%3A00.000Z&to=2026-04-30T23%3A59%3A59.999Z" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": [
    {
      "country": "US",
      "flowStarts": 150,
      "flowCompletions": 90
    }
  ]
}

Compare A/B variants

GET/api/analytics/ab-comparisonanalytics:read

Totals per variant of a named experiment over a date range, side by side.

Query parameters

  • service_idintegerrequired> 0

    Service the resource belongs to

  • experiment_namestringrequired

    Experiment name to compare A/B variant performance for

  • fromstringrequired

    Start of the A/B comparison range in ISO-8601 format

  • tostringrequired

    End of the A/B comparison range in ISO-8601 format

Response fieldsinside data
  • variantstring

    Experiment variant name

  • flowStartsnumber

    Number of flow starts

  • flowCompletionsnumber

    Number of flow completions

  • keysGeneratednumber

    Number of keys generated

  • conversionRatenumber

    Variant conversion rate percentage

curl "https://api.santiauth.com/api/analytics/ab-comparison?service_id=1&experiment_name=landing-page-copy-test&from=2026-04-01T00%3A00%3A00.000Z&to=2026-04-30T23%3A59%3A59.999Z" \
  -H "x-api-key: $SANTIAUTH_API_KEY"
200 OK
{
  "success": true,
  "data": [
    {
      "variant": "variant-a",
      "flowStarts": 300,
      "flowCompletions": 180,
      "keysGenerated": 72,
      "conversionRate": 60
    }
  ]
}