{
  "license": "CC BY 4.0",
  "recipe": {
    "slug": "api-request-throughput",
    "title": "Calculate API Request Throughput by Route",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-28"
  },
  "contract": {
    "tableName": "api_throughput_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Request completion time in UTC."
      },
      {
        "name": "route_template",
        "type": "Utf8",
        "description": "Bounded route template, never the raw URL."
      },
      {
        "name": "status_code",
        "type": "Int64",
        "description": "HTTP response status."
      },
      {
        "name": "environment",
        "type": "Utf8",
        "description": "Deployment environment."
      }
    ]
  },
  "query": "SELECT\n  route_template,\n  COUNT(*) AS requests,\n  SUM(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) AS errors,\n  60.0 * COUNT(*) / NULLIF(\n    date_part('epoch', MAX(timestamp_utc) - MIN(timestamp_utc)),\n    0\n  ) AS requests_per_minute\nFROM api_throughput_events\nWHERE timestamp_utc >= now() - INTERVAL '24 hours'\n  AND environment = 'production'\nGROUP BY route_template\nORDER BY requests_per_minute DESC, route_template;",
  "fixtureKind": "reproducible",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T17:30:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:36:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:42:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:48:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:54:00.000Z",
      "route_template": "/api/search",
      "status_code": 503,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:30:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:40:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:50:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T17:30:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:36:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:42:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:48:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:54:00.000Z",
      "route_template": "/api/search",
      "status_code": 503,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "route_template": "/api/search",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:30:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:40:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:50:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "route_template": "/api/checkout",
      "status_code": 200,
      "environment": "production"
    }
  ],
  "expectedOutput": {
    "columns": [
      "route_template",
      "requests",
      "errors",
      "requests_per_minute"
    ],
    "rows": [
      {
        "route_template": "/api/search",
        "requests": 6,
        "errors": 1,
        "requests_per_minute": 0.2
      },
      {
        "route_template": "/api/checkout",
        "requests": 4,
        "errors": 0,
        "requests_per_minute": 0.1333333333
      }
    ]
  },
  "notes": [
    "The included synthetic input rows generate the expected output when timestamps are shifted into the documented query window.",
    "Run this fixture in the public browser SQL playground; the selected query executes locally with DuckDB-Wasm.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}