Skip to main content
POST
/
api
/
public
/
v2
/
requests
/
analytics
Request Analytics
curl --request POST \
  --url https://api.promptlayer.com/api/public/v2/requests/analytics \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: <x-api-key>' \
  --data '
{
  "filter_group": {
    "filters": [
      {
        "field": "pl_id",
        "operator": "is",
        "value": "<string>",
        "nested_key": "<string>"
      }
    ],
    "logic": "AND"
  },
  "q": "<string>",
  "sort_by": "request_start_time",
  "sort_order": "asc"
}
'
{
  "success": true,
  "chartInterval": {
    "interval": "<string>",
    "bucketSizeMs": 123,
    "bucketMinutes": 123
  },
  "averageLatency": 123,
  "totalCost": 123,
  "totalTokens": 123,
  "totalRequests": 123,
  "totalCachedTokens": 123,
  "totalThinkingTokens": 123,
  "cacheTokenRatio": 123,
  "stats": [
    {
      "date": "<string>",
      "dateLabel": "<string>",
      "requests": 123,
      "tokens": 123,
      "inputTokens": 123,
      "outputTokens": 123,
      "cost": 123,
      "latency": 123,
      "cachedTokens": 123,
      "thinkingTokens": 123,
      "traceShare": 123,
      "statusCounts": {},
      "outputShapeCounts": {
        "json": 123,
        "toolCall": 123,
        "plainText": 123
      },
      "avgTurnCount": 123,
      "avgToolCallCount": 123,
      "toolCallCountP95": 123
    }
  ],
  "mostUsedModels": [
    [
      "<unknown>"
    ]
  ],
  "modelRequestsByDay": {},
  "mostUsedPromptTemplates": [
    {
      "promptId": "<string>",
      "requests": 123,
      "promptName": "<string>"
    }
  ],
  "promptTemplateRequestsByDay": {},
  "providerRequestsByDay": {},
  "latency": {
    "average_latency": {},
    "p50_latency": {},
    "p90_latency": {},
    "p95_latency": {}
  },
  "latencyByModelByDay": {},
  "latencyByPromptTemplateByDay": {},
  "latencyByProviderByDay": {},
  "errorTypes": [
    {
      "errorType": "<string>",
      "requests": 123
    }
  ],
  "providerBreakdown": [
    {
      "provider": "<string>",
      "promptId": "<string>",
      "tag": "<string>",
      "requests": 123,
      "cost": 123,
      "tokens": 123,
      "inputTokens": 123,
      "outputTokens": 123
    }
  ],
  "promptBreakdown": [
    {
      "provider": "<string>",
      "promptId": "<string>",
      "tag": "<string>",
      "requests": 123,
      "cost": 123,
      "tokens": 123,
      "inputTokens": 123,
      "outputTokens": 123
    }
  ],
  "tagsBreakdown": [
    {
      "provider": "<string>",
      "promptId": "<string>",
      "tag": "<string>",
      "requests": 123,
      "cost": 123,
      "tokens": 123,
      "inputTokens": 123,
      "outputTokens": 123
    }
  ],
  "metadataKeysTop": [
    {
      "key": "<string>",
      "requests": 123
    }
  ],
  "outputKeysTop": [
    {
      "key": "<string>",
      "requests": 123
    }
  ],
  "toolsLatency": [
    {
      "toolName": "<string>",
      "requests": 123,
      "avgLatencySeconds": 123,
      "minLatencySeconds": 123,
      "maxLatencySeconds": 123
    }
  ],
  "toolsUsageBars": [
    {
      "name": "<string>",
      "requests": 123
    }
  ]
}

Documentation Index

Fetch the complete documentation index at: https://docs.promptlayer.com/llms.txt

Use this file to discover all available pages before exploring further.

Get aggregated analytics for your request logs using the same filter syntax as Search Request Logs. The response is a set of pre-computed aggregations (not paginated rows), making it easy to power dashboards, alerts, or ad-hoc spend/latency questions.

Authentication

This endpoint requires API key authentication via the X-API-KEY header.

Request body

The body is RequestLogQuery — the canonical query payload also used by Search Request Logs (search additionally accepts page, per_page, and include_prompt_name).
FieldTypeDescription
filter_groupobjectStructured AND/OR filter group. Same fields and operators as Search Request Logs.
qstringFree-text query applied alongside filter_group.
sort_bystringSort field. Does not affect aggregated output.
sort_orderasc | descSort direction.

Response

The response is an aggregated payload, not a paginated list. The exact shape includes:
  • Totals: totalRequests, totalTokens, totalCost, averageLatency, plus cache and thinking-token counts.
  • Time series (stats): per-bucket entries with requests, tokens, inputTokens, outputTokens, cost, latency, cachedTokens, thinkingTokens, traceShare, statusCounts, outputShapeCounts (json / toolCall / plainText), avgTurnCount, avgToolCallCount, and toolCallCountP95.
  • Latency percentiles (latency): average_latency, p50_latency, p90_latency, p95_latency keyed by bucket date.
  • Model breakdowns: mostUsedModels, modelRequestsByDay, latencyByModelByDay.
  • Prompt template breakdowns: mostUsedPromptTemplates, promptTemplateRequestsByDay, latencyByPromptTemplateByDay.
  • Time-series interval metadata: chartInterval describing the bucket size used for the time series.
Bucket size is selected automatically based on the filter time range (seconds → minutes → hours → days).

Example: spend on GPT-4o this week

curl -X POST https://api.promptlayer.com/api/public/v2/requests/analytics \
  -H "X-API-KEY: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "filter_group": {
      "logic": "AND",
      "filters": [
        { "field": "engine", "operator": "is", "value": "gpt-4o" },
        {
          "field": "request_start_time",
          "operator": "between",
          "value": ["2025-03-08T00:00:00Z", "2025-03-15T00:00:00Z"]
        }
      ]
    }
  }'

Example: p90 latency for production traffic

{
  "filter_group": {
    "logic": "AND",
    "filters": [
      { "field": "tags", "operator": "contains", "value": "production" }
    ]
  }
}
Read the latency.p90_latency map from the response (per-bucket p90 latency in seconds).

Headers

X-API-KEY
string
required

API key for authentication.

Body

application/json

Canonical request-log query payload — the filter / search / sort fields shared by POST /api/public/v2/requests/search (which also accepts pagination + include_prompt_name) and POST /api/public/v2/requests/analytics.

filter_group
StructuredFilterGroup · object

Nested filter group with AND/OR logic. Use this for complex queries.

q
string | null

Free-text search query. Searches across the prompt input and LLM output text using fuzzy prefix matching.

sort_by
enum<string> | null

Field to sort results by. Does not affect aggregated output for /requests/analytics.

Available options:
request_start_time,
input_tokens,
output_tokens,
cost,
latency_ms,
status
sort_order
enum<string> | null

Sort direction. Must be provided together with sort_by.

Available options:
asc,
desc

Response

Aggregated analytics for the matching request logs.

Aggregated analytics across the matching request logs. Bucket size is selected automatically based on the filter time range (seconds → minutes → hours → days).

success
enum<boolean>
required
Available options:
true
chartInterval
object

Bucket-interval metadata describing how the time-series was bucketed.

averageLatency
number

Overall average latency across all matching requests, in seconds.

totalCost
number
totalTokens
integer
totalRequests
integer
totalCachedTokens
integer
totalThinkingTokens
integer
cacheTokenRatio
number | null

totalCachedTokens / total_input_tokens, or null when there are no input tokens.

stats
object[]

Per-bucket time-series.

mostUsedModels
any[][]

List of [modelName, requestCount] pairs ordered by usage.

modelRequestsByDay
object

Map of model name → list of [date, requestCount] pairs.

mostUsedPromptTemplates
object[]
promptTemplateRequestsByDay
object
providerRequestsByDay
object
latency
object

Per-bucket latency percentiles in seconds. Keys are bucket dates (e.g. 2025-03-15); values are seconds.

latencyByModelByDay
object
latencyByPromptTemplateByDay
object
latencyByProviderByDay
object
errorTypes
object[]
providerBreakdown
object[]
promptBreakdown
object[]
tagsBreakdown
object[]
metadataKeysTop
object[]
outputKeysTop
object[]
toolsLatency
object[]
toolsUsageBars
object[]