API Reference
Complete API reference documentation for the Central Monitoring API.
Contents
API References
Browse all available endpoints with detailed schemas, examples, and responses:
Logs
V1
The V1 logs endpoints (/v1/logs/scroll, /v1/logs/batch, and /v1/logs/batch/status) will be deprecated on March 1, 2026. Please migrate to the V2 endpoints.
POST /v1/logs/batch
Description: Recommended for queries retrieving > 100,000 logs. Returns a token to access presigned URLs containing batches of logs.
Request Body:
{
"application": "quasar",
"app_type": "caas",
"domain": "example.domain.com",
"time_range": "now-15m/m",
"size": 1000,
"filters": {"status": "error"}
}
Required Fields:
application(string): Name of the monitored application. Options: "atr", "klewer", "eventops", "quasar"time_range(string): Time range in OpenSearch format (e.g., 'now-15m/m')
Optional Fields:
app_type(string): Type of application environment. Options: "ec2", "caas"domain(string): Domain name of the monitored environmentsize(integer): Maximum number of results to return per requestfilters(object): JSON object containing additional key-value filterslog_group(string): Log group for EventOpstenant(string): Tenant identifier for EventOpsstage(string): Stage identifier for EventOps
Response (200):
{
"logs": [
{
"domain": "example.domain.com",
"time_range": "now-15m/m"
}
],
"token": "czpcL1wvY29nb",
"daily_requests_remaining": 480
}
POST /v1/logs/batch/urls
Description: Use token from Batch API response to retrieve presigned URLs for S3 buckets containing batches of logs.
Request Body:
{
"token": "1OTk3LCJpc3MiOi"
}
Required Fields:
token(string): Access token for batch log retrieval
Response (200):
{
"presigned_urls": [
{
"presigned_url": "https://cm-api-logs-prod.s3.amazonaws.com/logs-domain-name?AWSAccessKeyId=...",
"time_range": "string",
"ready": true,
"status": "completed"
}
]
}
POST /v1/logs/scroll
Description: Recommended for queries retrieving < 100,000 logs. Retrieve logs using cursor-based pagination with the returned scrollId.
Request Body:
{
"application": "atr",
"app_type": "caas",
"domain": "example.domain.com",
"time_range": "now-15m/m",
"size": 1000,
"filters": {"message": "cluster down"}
}
Required Fields:
application(string): Name of the monitored application. Options: "atr", "klewer", "eventops", "quasar"time_range(string): Time range in OpenSearch format (e.g., 'now-15m/m')
Optional Fields:
app_type(string): Type of application environment. Options: "ec2", "caas"domain(string): Domain name of the monitored environmentsize(integer): Maximum number of results to return per requestfilters(object): JSON object containing additional key-value filtersscroll_id(string): Identifier used for paginated scrolling through large datasetslog_group(string): Log group for EventOpstenant(string): Tenant identifier for EventOpsstage(string): Stage identifier for EventOps
Response (200):
{
"logs": [
{
"domain": "example.domain.com",
"time_range": "now-15m/m"
}
],
"scroll_id": "DXF1ZXJ5QW5vbmU=",
"has_more": true,
"daily_requests_remaining": 480
}
V2
POST /v2/logs/scroll
Description: Recommended for queries retrieving < 100,000 logs. Retrieve logs using cursor-based pagination with the returned scroll_id.
Request Body (EC2/Kubernetes):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"size": 100,
"domain": ["domain1.com", "domain2.com"],
"fields": ["timestamp", "message", "level"]
}
Request Body (Serverless):
{
"application": "eventops",
"app_type": "serverless",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"size": 100,
"log_group": ["*"],
"tenant": ["tenant1"],
"stage": ["prod"],
"fields": ["@timestamp", "logLevel", "message", "request.user_id", "request.endpoint", "response.status_code"],
"filters": [
{"exists": {"field": "user.id"}}
]
}
Request Body (Pagination):
{
"scroll_id": "previous_scroll_id_here"
}
Required Fields (Initial Request):
application(string): Name of the monitored application. Options: "atr", "klewer", "eventops", "quasar"start_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(string): Application type. Options: "ec2", "kubernetes", "serverless"size(integer): Number of results to return (must be > 0)
Plus these depending on app_type:
- For
serverless(requiresapplication="eventops"):log_group(array): List of log groups or["*"]for alltenant(array): List of tenants or["*"]for allstage(array): List of stages or["*"]for all
- For
ec2/kubernetes:domain(array): List of domain names or["*"]for all
Optional Fields:
filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are included)scroll_id(string): For pagination (when provided, only this field is required and all others become optional)
Special Rules:
- App Type Restrictions:
serverless→ must useapplication="eventops"+ requireslog_group,tenant,stageec2/kubernetes→ cannot useapplication="eventops"+ requiresdomain
- Wildcard Usage:
- When using
"*"in arrays, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "something"]
- When using
- Scroll ID Requests:
- If
scroll_idis provided, all other fields become optional - Used for pagination to get next batch of results
- If
Sample Response (200):
{
"data": {
"logs": [
{
"_index": "logs-application-2026-01",
"_id": "abc123xyz",
"_score": 1.0,
"_source": {
"...": "Log content varies by application"
}
},
{
"_index": "logs-application-2026-01",
"_id": "def456uvw",
"_score": 1.0,
"_source": {
"...": "Log content varies by application"
}
}
],
"count": 3595
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-19T00:00:00Z",
"end": "2026-01-19T23:59:59Z"
},
"rate_limit": {
"daily_remaining": 47
},
"request_id": "10615c94-d835-413e-ad3f-57c5a4c2276b",
"scroll_id": "FGluY2x1ZGVfY29udGV4hYmMxMjN4eXpkZWY0NTZ1dnd..."
}
}
Response Fields:
data.logs(array): Array of log objects_index(string): OpenSearch index name_id(string): Unique log identifier_score(number): Relevance score_source(object): Log content - fields vary by application and log type
data.count(integer): Total number of logs matching the querymeta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.scroll_id(string): Pagination token for retrieving next batch of results
POST /v2/logs/batch
Description: Recommended for queries retrieving > 100,000 logs. Returns a token to access presigned URLs containing batches of logs.
Usage Flow:
- Call
/v2/logs/batch→ Get a token - Call
/v2/logs/batch/statuswith the token → Check status and get download URLs - Poll periodically - each partition can be downloaded when it shows
completed: true - Download logs from the presigned URLs
Request Body (EC2/Kubernetes):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com", "domain2.com"],
"fields": ["timestamp", "message", "level"]
}
Request Body (Serverless):
{
"application": "eventops",
"app_type": "serverless",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"log_group": ["*"],
"tenant": ["tenant1"],
"stage": ["prod"],
"fields": ["@timestamp", "logLevel", "function_name", "request.method"],
"filters": [
{"term": {"message.keyword": "KeyError occurred"}},
{"term": {"function_memory_size": "1024"}}
]
}
Required Fields:
start_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapplication(string): Application name. Options: "atr", "klewer", "eventops", "quasar"app_type(string): Application type. Options: "ec2", "kubernetes", "serverless"
Plus these depending on app_type:
- For
serverless:log_group(array): List of log groups or["*"]for alltenant(array): List of tenants or["*"]for allstage(array): List of stages or["*"]for all
- For
ec2/kubernetes:domain(array): List of domain names or["*"]for all
Optional Fields:
filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are included)
Special Rules:
- App Type Restrictions:
serverless→ requireslog_group,tenant,stageec2/kubernetes→ requiresdomain
- Wildcard Usage:
- When using
"*"in arrays, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "something"]
- When using
Response (200):
{
"data": {
"token": "a6EBWDj2yr5v1UUG"
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-20T03:35:03.399316Z",
"end": "2026-01-20T06:55:03.399316Z"
},
"rate_limit": {
"daily_remaining": 49
},
"request_id": "dbfc4889-a1da-40d0-8dc9-3e08ef3e913c",
"app_type": "kubernetes",
"domain": ["*"]
}
}
Response Fields:
data.token(string): Access token for retrieving presigned URLs via/v2/logs/batch/statusmeta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.app_type(string): Application type from the requestmeta.domain(array): Domain(s) from the request (present for ec2/kubernetes requests)meta.log_group(array): Log group(s) from the request (present for serverless requests)meta.tenant(array): Tenant(s) from the request (present for serverless requests)meta.stage(array): Stage(s) from the request (present for serverless requests)
POST /v2/logs/batch/status
Description: Use token from /v2/logs/batch response to retrieve presigned URLs for S3 buckets containing batches of logs.
Usage Flow:
- Call
/v2/logs/batch→ Get a token - Call
/v2/logs/batch/statuswith the token → Check status and get download URLs - Poll periodically - each partition can be downloaded when it shows
completed: true - Download logs from the presigned URLs
Request Body:
{
"token": "Paw21VHC3VxAs7F4"
}
Required Fields:
token(string): Token from the batch request
Request Validation:
- Token is trimmed of whitespace
- Empty or whitespace-only tokens are rejected
Response (200):
{
"presigned_urls": [
{
"start_time": "2026-01-20T03:52:06.960046Z",
"end_time": "2026-01-20T07:12:06.960046Z",
"log_count": 1234,
"presigned_url": "https://s3.amazonaws.com/...",
"completed": true,
"status": "completed"
}
]
}
Response Fields:
presigned_urls(array): Contains one object per partitionstart_time(string): Start time of this partition's time rangeend_time(string): End time of this partition's time rangelog_count(integer): Number of logs in this partition (0 if none)presigned_url(string): S3 presigned URL to download the logs (or "null" if not ready)completed(boolean): Indicates if this partition is ready for downloadstatus(string): Status of the partition (e.g., "completed", "processing", "pending")
POST /v2/logs/aggs
Description: Retrieve aggregated statistics and analytics from logs using OpenSearch aggregation queries. Supports terms aggregations, histograms, metrics, and nested aggregations.
Request Body (EC2/Kubernetes):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com", "domain2.com"],
"aggs": {
"log_levels": {
"terms": {
"field": "regex.extractions.logLevel",
"size": 10
}
},
"logs_over_time": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1h"
}
}
}
}
Request Body (Serverless):
{
"application": "eventops",
"app_type": "serverless",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"log_group": ["*"],
"tenant": ["tenant1"],
"stage": ["prod"],
"aggs": {
"event_origins": {
"terms": {
"field": "event.origin",
"size": 20
}
},
"error_count": {
"filter": {
"term": {"logLevel": "ERROR"}
}
}
}
}
Required Fields:
application(string): Name of the monitored application. Options: "atr", "klewer", "eventops", "quasar"start_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(string): Application type. Options: "ec2", "kubernetes", "serverless"aggs(object): OpenSearch aggregation definition (must contain at least one aggregation)
Plus these depending on app_type:
- For
serverless:log_group(array): List of log groups or["*"]for alltenant(array): List of tenants or["*"]for allstage(array): List of stages or["*"]for all
- For
ec2/kubernetes:domain(array): List of domain names or["*"]for all
Aggregation Types:
The aggs field accepts any valid OpenSearch aggregation. Common types include:
- Terms Aggregation - Group by field values:
"aggs": {"by_field": {"terms": {"field": "field_name","size": 10}}}
- Date Histogram - Group by time intervals:
"aggs": {"over_time": {"date_histogram": {"field": "@timestamp","fixed_interval": "1h"}}}
- Filter Aggregation - Count documents matching criteria:
"aggs": {"error_logs": {"filter": {"term": {"logLevel": "ERROR"}}}}
- Nested Aggregations - Combine multiple aggregations:
"aggs": {"by_domain": {"terms": {"field": "atr.domain_name","size": 10},"aggs": {"by_level": {"terms": {"field": "regex.extractions.logLevel","size": 5}}}}}
- Filter with Sub-aggregations - Analyze subset of data:
"aggs": {"error_analysis": {"filter": {"term": {"regex.extractions.logLevel": "ERROR"}},"aggs": {"hourly_errors": {"date_histogram": {"field": "@timestamp","fixed_interval": "1h"}}}}}
See OpenSearch Aggregations for full syntax.
Special Rules:
- App Type Restrictions:
serverless→ requireslog_group,tenant,stageec2/kubernetes→ requiresdomain
- Wildcard Usage:
- When using
"*"in arrays, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "something"]
- When using
- Time Range:
end_timemust be afterstart_time- No maximum time range limit
Sample Response (200):
{
"data": {
"aggregations": {
"log_levels": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{"key": "WARN", "doc_count": 117315928},
{"key": "INFO", "doc_count": 33176681},
{"key": "ERROR", "doc_count": 107146}
]
},
"logs_over_time": {
"buckets": [
{"key_as_string": "2026-01-19T00:00:00.000Z", "key": 1737244800000, "doc_count": 45231},
{"key_as_string": "2026-01-19T01:00:00.000Z", "key": 1737248400000, "doc_count": 52187}
]
}
},
"total_documents": 269456123
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-19T00:00:00Z",
"end": "2026-01-19T23:59:59Z"
},
"rate_limit": {
"daily_remaining": 999
},
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"application": "atr",
"app_type": "kubernetes",
"domain": ["domain1.com", "domain2.com"]
}
}
Response Fields:
data.aggregations(object): Aggregation results - structure varies based on your aggregation definition- For terms aggregations: Contains
bucketsarray withkeyanddoc_count - For date histograms: Contains
bucketsarray withkey_as_string,key, anddoc_count - For filter aggregations: Contains
doc_countnumber - For nested aggregations: Contains nested aggregation results
- For terms aggregations: Contains
data.total_documents(integer): Total number of logs matching the query (before aggregation)meta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.application(string): Application name from requestmeta.app_type(string): Application type from requestmeta.domain(array): Domain filter (for non-serverless)meta.log_group(array): Log group filter (for serverless)meta.tenant(array): Tenant filter (for serverless)meta.stage(array): Stage filter (for serverless)
V3
POST /v3/logs/mappings
Description: Retrieve all available fields and their data types from a logs index. Useful for discovering which fields can be used in filters, fields, and aggs parameters. The index is resolved dynamically based on the application and app_type provided.
Request Body:
{
"application": "atr",
"app_type": "ec2",
"includes_eu": false
}
Required Fields:
application(string): Application name. Options:"atr","klewer","eventops","quasar","agentmanager"app_type(string): Application type. Options:"ec2","kubernetes","serverless"
Optional Fields:
includes_eu(boolean): Include EU cross-cluster indices (default:true). Set tofalseto query only the local region
Valid Combinations:
| application | app_type |
|---|---|
atr | ec2, kubernetes |
klewer | ec2, kubernetes |
quasar | ec2, kubernetes |
eventops | serverless |
agentmanager | serverless |
Special Rules:
- App Type Restrictions:
eventopsandagentmanageronly supportserverlessatr,klewer, andquasardo not supportserverless
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
Sample Response (200):
{
"data": {
"fields": [
{"name": "@timestamp", "type": "date"},
{"name": "atr.domain_name", "type": "keyword"},
{"name": "message", "type": "text"},
{"name": "message.keyword", "type": "keyword"},
{"name": "regex.extractions.logLevel", "type": "keyword"}
],
"field_count": 85
},
"meta": {
"trace_id": "1-69d8732e-152bf5df11c3f9fe417af0bf",
"rate_limit": {
"daily_remaining": 998
}
}
}
Response Fields:
data.fields(array): Array of field objects, sorted alphabetically by namename(string): Full field path (e.g.,"regex.extractions.logLevel")type(string): OpenSearch field type (e.g.,"keyword","text","date","float","boolean","long","integer","alias")
data.field_count(integer): Total number of fieldsmeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the day
Notes:
- Fields with multi-field mappings appear as separate entries (e.g.,
messageastextandmessage.keywordaskeyword) - Use
keywordtype fields for exact match filters (term,terms) and aggregations - Use
texttype fields for full-text search (match,match_phrase) - Different
application+app_typecombinations query different indices with different field schemas
Workloads
V2
POST /v2/workloads/scroll
Description: Recommended for queries retrieving < 100,000 workloads. Retrieve workloads using cursor-based pagination with the returned scroll_id.
Request Body (EC2):
{
"application": "atr",
"app_type": "ec2",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com", "domain2.com"],
"size": 100,
"fields": ["timestamp", "workload_id", "status"],
"filters": [
{
"bool": {
"must": [
{"term": {"ticket.type": "SR_TASK"}},
{"term": {"workload.trigger": "TICKET"}}
],
"must_not": [
{"term": {"workload.state": "FAILED"}}
]
}
}
]
}
Request Body (Kubernetes):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["*"],
"size": 50,
"filters": [
{"terms": {"workflow.name": ["Incident_Response_Workflow", "Scheduled_Maintenance_Workflow"]}}
]
}
Request Body (Pagination):
{
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoAwAAAAAAAAABFmtQN..."
}
Required Fields (Initial Request):
application(string): Application name. Only "atr" is supportedstart_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(string): Application type. Options: "ec2", "kubernetes"domain(array): List of domain names or["*"]for all (cannot be empty)
Optional Fields:
size(integer): Number of results to return (must be > 0)filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are included)scroll_id(string): For pagination (when provided, only this field is required and all others become optional)
Special Rules:
- Application Restrictions:
- Only
"atr"is supported for workloads - No serverless support (only
"ec2"and"kubernetes")
- Only
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*"in arrays, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
- Scroll ID Requests:
- If
scroll_idis provided, all other fields become optional - Used for pagination to get next batch of results
- If
Sample Response (200):
{
"data": {
"workloads": [
{
"_index": "workloads-atr-2026-01",
"_id": "wl-abc123",
"_score": 1.0,
"_source": {
"...": "Workload content varies by application"
}
}
],
"count": 50
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-20T03:52:06.960046Z",
"end": "2026-01-20T07:12:06.960046Z"
},
"rate_limit": {
"daily_remaining": 48
},
"request_id": "3a5f1229-ccef-4fcb-be27-98fd88e950c7",
"app_type": "kubernetes",
"domain": ["domain1.com", "domain2.com"],
"scroll_id": "DnF1ZXJ5VGhlbkZldGNo...",
"workloads_available": 150
}
}
Response Fields:
data.workloads(array): Array of workload objects_index(string): OpenSearch index name_id(string): Unique workload identifier_score(number): Relevance score_source(object): Workload content - fields vary by application and workload type
data.count(integer): Number of workloads returned in this responsemeta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.app_type(string): Application type from requestmeta.domain(array): List of domains queriedmeta.scroll_id(string): Pagination token (present when more results available)meta.workloads_available(integer): Total workloads available (optional)
POST /v2/workloads/batch
Description: Recommended for queries retrieving > 100,000 workloads. Returns a token to access presigned URLs containing batches of workloads.
Usage Flow:
- Call
/v2/workloads/batch→ Get a token - Call
/v2/workloads/batch/statuswith the token → Check status and get download URLs - Poll periodically - each partition can be downloaded when it shows
completed: true - Download workloads from the presigned URLs
Request Body (Minimal):
{
"application": "atr",
"app_type": "ec2",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com", "domain2.com"]
}
Request Body (With Filters):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["*"],
"filters": [
{
"bool": {
"must": [
{"term": {"ticket.type": "SR_TASK"}},
{"term": {"workload.trigger": "TICKET"}}
],
"must_not": [
{"term": {"workload.state": "FAILED"}}
]
}
}
]
}
Request Body (With Field Selection):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com"],
"fields": ["timestamp", "workload_id", "status", "workflow.name"]
}
Required Fields:
application(string): Application name. Only "atr" is supportedstart_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(string): Application type. Options: "ec2", "kubernetes"domain(array): List of domain names or["*"]for all (cannot be empty)
Optional Fields:
filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are included)
Special Rules:
- Application Restrictions:
- Only
"atr"is supported for workloads - No serverless support (only
"ec2"and"kubernetes")
- Only
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*"in arrays, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
Response (200):
{
"data": {
"token": "Paw21VHC3VxAs7F4"
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-20T03:52:06.960046Z",
"end": "2026-01-20T07:12:06.960046Z"
},
"rate_limit": {
"daily_remaining": 48
},
"request_id": "3a5f1229-ccef-4fcb-be27-98fd88e950c7",
"app_type": "kubernetes",
"domain": ["domain1.com", "domain2.com"]
}
}
Response Fields:
data.token(string): Access token for retrieving presigned URLs via/v2/workloads/batch/statusmeta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.app_type(string): Application type from the requestmeta.domain(array): Domain(s) from the request
POST /v2/workloads/batch/status
Description: Use token from /v2/workloads/batch response to retrieve presigned URLs for S3 buckets containing batches of workloads.
Usage Flow:
- Call
/v2/workloads/batch→ Get a token - Call
/v2/workloads/batch/statuswith the token → Check status and get download URLs - Poll periodically - each partition can be downloaded when it shows
completed: true - Download workloads from the presigned URLs
Request Body:
{
"token": "Paw21VHC3VxAs7F4"
}
Required Fields:
token(string): Token from the batch request (must be non-empty)
Request Validation:
- Token is trimmed of whitespace
- Empty or whitespace-only tokens are rejected
Response (200):
{
"presigned_urls": [
{
"start_time": "2026-01-21T08:00:00Z",
"end_time": "2026-01-21T14:00:00Z",
"workload_count": 1523,
"presigned_url": "https://s3.amazonaws.com/...",
"completed": true,
"status": "completed"
},
{
"start_time": "2026-01-21T14:00:00Z",
"end_time": "2026-01-21T20:00:00Z",
"workload_count": 892,
"presigned_url": "null",
"completed": false,
"status": "processing"
}
]
}
Response Fields:
presigned_urls(array): Contains one object per partitionstart_time(string): Start time of this partition's time rangeend_time(string): End time of this partition's time rangeworkload_count(integer): Number of workloads in this partitionpresigned_url(string): S3 presigned URL to download the workloads (or "null" if not ready)completed(boolean): Indicates if this partition is ready for downloadstatus(string): Status of the partition (e.g., "completed", "processing", "failed")
POST /v2/workloads/aggs
Description: Retrieve aggregated statistics and analytics from workloads using OpenSearch aggregation queries. Supports terms aggregations, histograms, metrics, and nested aggregations for analyzing workflow execution patterns.
Request Body:
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2026-01-19T00:00:00Z",
"end_time": "2026-01-19T23:59:59Z",
"domain": ["domain1.com", "domain2.com"],
"aggs": {
"by_workflow": {
"terms": {
"field": "workflow.name",
"size": 20
}
},
"by_domain": {
"terms": {
"field": "atr.domain_name",
"size": 10
}
},
"over_time": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1h"
}
}
}
}
Request Body (with filter):
{
"application": "atr",
"app_type": "kubernetes",
"start_time": "2025-01-01T00:00:00Z",
"end_time": "2026-01-28T23:59:59Z",
"domain": ["*"],
"aggs": {
"incident_workflow_count": {
"filter": {
"term": {"workflow.name": "Incident_Response_Workflow"}
}
},
"workflow_distribution": {
"terms": {
"field": "workflow.name",
"size": 50
}
}
}
}
Required Fields:
application(string): Name of the monitored application. Options: "atr"start_time(string): Start time in ISO 8601 format (e.g., "2026-01-19T00:00:00Z" or "2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(string): Application type. Options: "ec2", "kubernetes"domain(array): List of domain names or["*"]for all domainsaggs(object): OpenSearch aggregation definition (must contain at least one aggregation)
Aggregation Types:
The aggs field accepts any valid OpenSearch aggregation. Common types include:
- Terms Aggregation - Group by field values:
"aggs": {"by_workflow": {"terms": {"field": "workflow.name","size": 20}}}
- Date Histogram - Group by time intervals:
"aggs": {"over_time": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}
- Filter Aggregation - Count documents matching criteria:
"aggs": {"specific_workflow": {"filter": {"term": {"workflow.name": "Data_Processing_Workflow"}}}}
- Nested Aggregations - Combine multiple aggregations:
"aggs": {"by_domain": {"terms": {"field": "atr.domain_name","size": 10},"aggs": {"by_workflow": {"terms": {"field": "workflow.name","size": 5}}}}}
- Filter with Sub-aggregations - Analyze subset of data:
"aggs": {"incident_analysis": {"filter": {"term": {"workflow.name": "Incident_Response_Workflow"}},"aggs": {"daily_counts": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}}}
See OpenSearch Aggregations for full syntax.
Special Rules:
- Wildcard Usage:
- When using
"*"in domain array, it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "something"]
- When using
- Time Range:
end_timemust be afterstart_time- No maximum time range limit
Sample Response (200):
{
"data": {
"aggregations": {
"by_workflow": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 125000,
"buckets": [
{"key": "Incident_Response_Workflow", "doc_count": 3126831},
{"key": "Scheduled_Maintenance_Workflow", "doc_count": 1048182},
{"key": "Data_Enrichment_Workflow", "doc_count": 745352}
]
},
"by_domain": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{"key": "domain1.com", "doc_count": 2500000},
{"key": "domain2.com", "doc_count": 1800000}
]
},
"over_time": {
"buckets": [
{"key_as_string": "2026-01-19T00:00:00.000Z", "key": 1737244800000, "doc_count": 125000},
{"key_as_string": "2026-01-19T01:00:00.000Z", "key": 1737248400000, "doc_count": 132000}
]
}
},
"total_documents": 5234567
},
"meta": {
"api_version": "v2",
"time_range": {
"start": "2026-01-19T00:00:00Z",
"end": "2026-01-19T23:59:59Z"
},
"rate_limit": {
"daily_remaining": 999
},
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"app_type": "kubernetes",
"domain": ["domain1.com", "domain2.com"]
}
}
Response Fields:
data.aggregations(object): Aggregation results - structure varies based on your aggregation definition- For terms aggregations: Contains
bucketsarray withkeyanddoc_count - For date histograms: Contains
bucketsarray withkey_as_string,key, anddoc_count - For filter aggregations: Contains
doc_countnumber - For nested aggregations: Contains nested aggregation results
- For terms aggregations: Contains
data.total_documents(integer): Total number of workloads matching the query (before aggregation)meta.api_version(string): API versionmeta.time_range(object): Query time rangemeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.request_id(string): Unique request identifiermeta.app_type(string): Application type from requestmeta.domain(array): Domain filter from request
Common Fields for Workloads:
workflow.name- Workflow identifieratr.domain_name- Domain nameatr.infra_type- Infrastructure type (kubernetes, ec2)@timestamp- Timestamp of workload executionworkload.state- Workload state (e.g., "DONE", "FAILED", etc.)
You can also explore available fields using OpenSearch Dashboards Discover.
V3
POST /v3/workloads/mappings
Description: Retrieve all available fields and their data types from the workloads index. Useful for discovering which fields can be used in filters, fields, and aggs parameters.
Request Body:
{
"includes_eu": false
}
Optional Fields:
includes_eu(boolean): Include EU cross-cluster indices (default:true). Set tofalseto query only the local region
Special Rules:
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
- An empty body or
{}is valid and defaults toincludes_eu: true
Sample Response (200):
{
"data": {
"fields": [
{"name": "@timestamp", "type": "date"},
{"name": "atr.domain_name", "type": "keyword"},
{"name": "atr.infra_type", "type": "keyword"},
{"name": "workflow.name", "type": "keyword"},
{"name": "workload.state", "type": "keyword"},
{"name": "workload.execution_time.elapsed", "type": "float"}
],
"field_count": 120
},
"meta": {
"trace_id": "1-69d8732e-152bf5df11c3f9fe417af0bf",
"rate_limit": {
"daily_remaining": 998
}
}
}
Response Fields:
data.fields(array): Array of field objects, sorted alphabetically by namename(string): Full field path (e.g.,"workload.execution_time.elapsed")type(string): OpenSearch field type (e.g.,"keyword","text","date","float","boolean","long","integer","alias")
data.field_count(integer): Total number of fieldsmeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the day
Notes:
- Fields with multi-field mappings appear as separate entries (e.g.,
workflow.nameaskeywordandworkflow.name.textastext) - Use
keywordtype fields for exact match filters (term,terms) and aggregations - Use
texttype fields for full-text search (match,match_phrase) - Use
datetype fields for time-based range queries and date histogram aggregations
Jobs
V3
POST /v3/jobs/query
Description: Query job execution documents with cursor-based pagination using Point in Time (PIT) and search_after.
Request Body (Initial Request):
{
"application": "atr",
"app_type": ["ec2", "kubernetes"],
"domain": ["your-domain.example.com"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-20T23:59:59Z",
"size": 1000,
"fields": ["job.name", "job.state", "workflow.name", "atr.domain_name"],
"includes_eu": false,
"filters": [
{"term": {"job.state": "DONE"}},
{"term": {"atr.infra_type": "kubernetes"}}
]
}
Request Body (Pagination):
{
"pit_id": "previous_pit_id_here",
"search_after": [1774038927000],
"size": 1000,
"fields": ["job.name", "job.state"]
}
Required Fields (Initial Request):
application(string): Application name. Only"atr"is supportedstart_time(string): Start time in ISO 8601 format (e.g.,"2026-01-19T00:00:00Z"or"2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(array): Application types. Options:"ec2","kubernetes"(e.g.,["ec2"]or["ec2", "kubernetes"])domain(array): List of domain names or["*"]for all (cannot be empty)
Optional Fields:
size(integer): Number of results per page (default: 100, max: 10000, must be greater than 0)filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are returned)includes_eu(boolean): Include EU region search (default:true). Set tofalseto query only the local region for faster response timespit_id(string): Point in Time ID for pagination (must be provided together withsearch_after)search_after(array): Sort values from the last hit of the previous page (must be provided together withpit_id)
Special Rules:
- Pagination:
pit_idandsearch_aftermust both be provided together- When paginating,
application,start_time,end_time,app_type, anddomainare not required - The
pit_idandsearch_aftervalues are returned in the responsemeta.paginationobject - When
meta.pagination.pit_idisnull, the last page has been reached
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*", it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
- App Type Field:
- Must be a list (e.g.,
["ec2"]not"ec2") - Only
"ec2"and"kubernetes"are valid values
- Must be a list (e.g.,
- Cross Region Search:
- By default (
includes_eu: true), the query searches across all regional databases, including EU - Set
includes_eu: falseto query only the local region for reduced latency
- By default (
- Response Size:
- If the response exceeds the safe payload limit, a 413 error is returned
- Use the
fieldsparameter, reducesizeto limit response size, or use a batch endpoint instead
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
Sample Response (200):
{
"data": {
"hits": [
{
"_index": "jobs-atr-2026-v2",
"_id": "69d83f28833f6c77f741609e",
"_score": null,
"_source": {
"job": {
"name": "<job_name>",
"state": "DONE"
},
"workflow": {
"name": "<workflow_name>"
},
"atr": {
"domain_name": "<domain_name>",
"infra_type": "kubernetes"
}
},
"sort": [1775779626000]
}
],
"total": 319455,
"count": 1000
},
"meta": {
"trace_id": "1-69d8732e-152bf5df11c3f9fe417af0bf",
"rate_limit": {
"daily_remaining": 9950
},
"pagination": {
"pit_id": "FGluY2x1ZGVfY29udGV4...",
"search_after": [1775779626000]
}
}
}
Response Fields:
data.hits(array): Array of job documents_index(string): OpenSearch index name_id(string): Unique job identifier_source(object): Job content (fields vary based onfieldsparameter; all fields returned if not specified)sort(array): Sort values used for pagination
data.total(integer): Total number of jobs matching the querydata.count(integer): Number of jobs returned in this pagemeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.pagination.pit_id(string or null): Point in Time ID for next page (nullwhen last page reached)meta.pagination.search_after(array or null): Sort values for next page (nullwhen last page reached)
Last Page:
When the last page is reached, pit_id and search_after will both be null. The Point in Time is automatically cleaned up — no additional action is needed.
Common Job Fields:
job.name- Job namejob.id- Unique job identifierjob.state- Job state (e.g., "DONE", "FAILED")job.execution_time.start- Job start timestampjob.execution_time.end- Job end timestampjob.execution_time.elapsed- Execution duration in secondsworkflow.name- Workflow nameworkflow.id- Workflow identifierworkload.id- Parent workload identifierworkload.state- Workload stateatr.domain_name- Domain nameatr.infra_type- Infrastructure type ("ec2", "kubernetes")atr.client- Client nameatr.environment- Environmentticket.number- Associated ticket numberticket.type- Associated ticket type@timestamp- Document timestamp
POST /v3/jobs/aggs
Description: Retrieve aggregated statistics and analytics from jobs using OpenSearch aggregation queries. Supports terms aggregations, histograms, metrics, and nested aggregations for analyzing job execution patterns.
Request Body:
{
"application": "atr",
"app_type": ["ec2", "kubernetes"],
"domain": ["your-domain.example.com"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-20T23:59:59Z",
"includes_eu": false,
"aggs": {
"jobs_by_state": {
"terms": {
"field": "job.state",
"size": 20
}
},
"jobs_over_time": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1d"
}
},
"top_job_names": {
"terms": {
"field": "job.name",
"size": 10
}
}
}
}
Request Body (With Filters):
{
"application": "atr",
"app_type": ["kubernetes"],
"domain": ["*"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-27T23:59:59Z",
"includes_eu": true,
"filters": [
{"term": {"job.state": "FAILED"}},
{"range": {"job.execution_time.elapsed": {"gte": 60}}}
],
"aggs": {
"failed_by_domain": {
"terms": {
"field": "atr.domain_name",
"size": 20
}
},
"failed_by_workflow": {
"terms": {
"field": "workflow.name",
"size": 10
},
"aggs": {
"avg_duration": {
"avg": {
"field": "job.execution_time.elapsed"
}
}
}
}
}
}
Required Fields:
application(string): Application name. Only"atr"is supportedstart_time(string): Start time in ISO 8601 format (e.g.,"2026-01-19T00:00:00Z"or"2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(array): Application types. Options:"ec2","kubernetes"(e.g.,["ec2"]or["ec2", "kubernetes"])domain(array): List of domain names or["*"]for all (cannot be empty)aggs(object): OpenSearch aggregation definition (must contain at least one aggregation)
Optional Fields:
filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
includes_eu(boolean): Include EU region search (default:true). Set tofalseto query only the local region for faster response times
Aggregation Types:
The aggs field accepts any valid OpenSearch aggregation. Common types include:
- Terms Aggregation - Group by field values:
"aggs": {"by_state": {"terms": {"field": "job.state","size": 20}}}
- Date Histogram - Group by time intervals:
"aggs": {"over_time": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}
- Filter Aggregation - Count documents matching criteria:
"aggs": {"failed_jobs": {"filter": {"term": {"job.state": "FAILED"}}}}
- Nested Aggregations - Combine multiple aggregations:
"aggs": {"by_domain": {"terms": {"field": "atr.domain_name","size": 10},"aggs": {"by_job": {"terms": {"field": "job.name","size": 5}}}}}
- Filter with Sub-aggregations - Analyze subset of data:
"aggs": {"failed_analysis": {"filter": {"term": {"job.state": "FAILED"}},"aggs": {"daily_failures": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}}}
See OpenSearch Aggregations for full syntax.
Special Rules:
- App Type Field:
- Must be a list (e.g.,
["ec2"]not"ec2") - Only
"ec2"and"kubernetes"are valid values
- Must be a list (e.g.,
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*", it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
- Cross Region Search:
- By default (
includes_eu: true), the query searches across all regional databases, including EU - Set
includes_eu: falseto query only the local region for reduced latency
- By default (
- Time Range:
end_timemust be afterstart_time- No maximum time range limit
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
Sample Response (200):
{
"data": {
"aggregations": {
"jobs_by_state": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{"key": "DONE", "doc_count": 285231},
{"key": "FAILED", "doc_count": 32187},
{"key": "REJECTED", "doc_count": 1456}
]
},
"jobs_over_time": {
"buckets": [
{"key_as_string": "2026-01-01T00:00:00.000Z", "key": 1735689600000, "doc_count": 4523},
{"key_as_string": "2026-01-02T00:00:00.000Z", "key": 1735776000000, "doc_count": 4687}
]
},
"top_job_names": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 125000,
"buckets": [
{"key": "<job_name_1>", "doc_count": 45231},
{"key": "<job_name_2>", "doc_count": 32187},
{"key": "<job_name_3>", "doc_count": 18456}
]
}
},
"total": 319455
},
"meta": {
"trace_id": "1-69d8732e-152bf5df11c3f9fe417af0bf",
"rate_limit": {
"daily_remaining": 9950
},
"pagination": {
"pit_id": null,
"search_after": null
}
}
}
Response Fields:
data.aggregations(object): Aggregation results - structure varies based on your aggregation definition- For terms aggregations: Contains
bucketsarray withkeyanddoc_count - For date histograms: Contains
bucketsarray withkey_as_string,key, anddoc_count - For filter aggregations: Contains
doc_countnumber - For nested aggregations: Contains nested aggregation results
- For terms aggregations: Contains
data.total(integer): Total number of jobs matching the query (before aggregation)meta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.pagination.pit_id(null): Always null for aggregation queries (no pagination)meta.pagination.search_after(null): Always null for aggregation queries (no pagination)
Common Job Fields for Aggregations:
job.name- Job namejob.state- Job state (e.g., "DONE", "FAILED", "REJECTED")job.execution_time.elapsed- Execution duration in secondsworkflow.name- Workflow nameworkload.state- Workload stateatr.domain_name- Domain nameatr.infra_type- Infrastructure type ("ec2", "kubernetes")atr.client- Client nameatr.environment- Environment@timestamp- Document timestamp
You can also explore available fields using the /v3/jobs/mappings endpoint or OpenSearch Dashboards Discover.
POST /v3/jobs/mappings
Description: Retrieve all available fields and their data types from the jobs index. Useful for discovering which fields can be used in filters, fields, and aggs parameters.
Request Body:
{
"includes_eu": false
}
Optional Fields:
includes_eu(boolean): Include EU cross-cluster indices (default:true). Set tofalseto query only the local region
Special Rules:
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
- An empty body or
{}is valid and defaults toincludes_eu: true
Sample Response (200):
{
"data": {
"fields": [
{"name": "@timestamp", "type": "alias"},
{"name": "atr.client", "type": "keyword"},
{"name": "atr.domain_name", "type": "keyword"},
{"name": "atr.infra_type", "type": "keyword"},
{"name": "job.execution_time.elapsed", "type": "float"},
{"name": "job.execution_time.end", "type": "date"},
{"name": "job.execution_time.start", "type": "date"},
{"name": "job.name", "type": "keyword"},
{"name": "job.name.text", "type": "text"},
{"name": "job.state", "type": "keyword"},
{"name": "workflow.name", "type": "keyword"},
{"name": "workload.state", "type": "keyword"}
],
"field_count": 149
},
"meta": {
"trace_id": "1-69d8732e-152bf5df11c3f9fe417af0bf",
"rate_limit": {
"daily_remaining": 998
}
}
}
Response Fields:
data.fields(array): Array of field objects, sorted alphabetically by namename(string): Full field path (e.g.,"job.execution_time.elapsed")type(string): OpenSearch field type (e.g.,"keyword","text","date","float","boolean","long","integer","alias")
data.field_count(integer): Total number of fieldsmeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the day
Notes:
- Fields with multi-field mappings appear as separate entries (e.g.,
job.nameaskeywordandjob.name.textastext) - Use
keywordtype fields for exact match filters (term,terms) and aggregations - Use
texttype fields for full-text search (match,match_phrase) - Use
datetype fields for time-based range queries and date histogram aggregations
Tickets
V3
POST /v3/tickets/query
Description: Recommended for retrieving < 200,000 tickets. Query ticket documents with cursor-based pagination using Point in Time (PIT) and search_after.
Request Body (Initial Request):
{
"application": "atr",
"app_type": ["ec2", "kubernetes"],
"domain": ["your-domain.example.com"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-20T23:59:59Z",
"size": 1000,
"fields": ["ticket.description", "ticket.number", "ticket.state"],
"includes_eu": false,
"filters": [
{"term": {"ticket.resolved": true}},
{"term": {"ticket.type": "SR_ITEM"}}
]
}
Request Body (Pagination):
{
"pit_id": "previous_pit_id_here",
"search_after": [1774038927000],
"size": 1000,
"fields": ["ticket.description"]
}
Required Fields (Initial Request):
application(string): Application name. Only"atr"is supportedstart_time(string): Start time in ISO 8601 format (e.g.,"2026-01-19T00:00:00Z"or"2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(array): Application types. Options:"ec2","kubernetes"(e.g.,["ec2"]or["ec2", "kubernetes"])domain(array): List of domain names or["*"]for all (cannot be empty)
Optional Fields:
size(integer): Number of results per page (default: 100, max: 10000, must be greater than 0)filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
fields(array): List of fields to include in response (if not provided, all fields are returned)includes_eu(boolean): Include EU region search (default:true). Set tofalseto query only the local region for faster response timespit_id(string): Point in Time ID for pagination (must be provided together withsearch_after)search_after(array): Sort values from the last hit of the previous page (must be provided together withpit_id)
Special Rules:
- Pagination:
pit_idandsearch_aftermust both be provided together- When paginating,
application,start_time,end_time,app_type, anddomainare not required - The
pit_idandsearch_aftervalues are returned in the responsemeta.paginationobject - When
meta.pagination.pit_idisnull, the last page has been reached
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*", it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
- App Type Field:
- Must be a list (e.g.,
["ec2"]not"ec2") - Only
"ec2"and"kubernetes"are valid values
- Must be a list (e.g.,
- Cross Region Search:
- By default (
includes_eu: true), the query searches across all regional databases, including EU - Set
includes_eu: falseto query only the local region for reduced latency
- By default (
- Response Size:
- If the response exceeds the safe payload limit, a 413 error is returned
- Use the
fieldsparameter, reducesizeto limit response size, or use a batch endpoint instead
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
Sample Response (200):
{
"data": {
"hits": [
{
"_index": "tickets-atr-2026",
"_id": "afe7dc9e2bfffa904e9ff068f291bf5f",
"_score": null,
"_source": {
"ticket": {
"description": "Email Distribution List - Add/Remove Users"
}
},
"sort": [1774412848000]
}
],
"total": 5234,
"count": 1000
},
"meta": {
"trace_id": "1-69c36684-6c0f659437a3dc38138a02dd",
"rate_limit": {
"daily_remaining": 9950
},
"pagination": {
"pit_id": "FGluY2x1ZGVfY29udGV4...",
"search_after": [1774038927000]
}
}
}
Response Fields:
data.hits(array): Array of ticket documents_index(string): OpenSearch index name_id(string): Unique ticket identifier_source(object): Ticket content (fields vary based onfieldsparameter; all fields returned if not specified)sort(array): Sort values used for pagination
data.total(integer): Total number of tickets matching the querydata.count(integer): Number of tickets returned in this pagemeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.pagination.pit_id(string or null): Point in Time ID for next page (nullwhen last page reached)meta.pagination.search_after(array or null): Sort values for next page (nullwhen last page reached)
Last Page:
When the last page is reached, pit_id and search_after will both be null. The Point in Time is automatically cleaned up — no additional action is needed.
Common Ticket Fields:
ticket.id- Unique ticket identifierticket.number- Ticket number (e.g., "RITM1098163")ticket.type- Ticket type (e.g., "SR_ITEM")ticket.short_description- Brief descriptionticket.state- Current state (e.g., "Requested")ticket.priority- Priority level (e.g., "4 - Low")ticket.resolved- Whether the ticket is resolved (boolean)ticket.mapped- Whether the ticket is mapped (boolean)ticket.created_on- Creation timestampticket.last_updated_on- Last update timestampatr.domain_name- Domain nameatr.infra_type- Infrastructure type ("ec2", "kubernetes")atr.client- Client nameatr.environment- Environment (e.g., "client_production")@timestamp- Document timestamp
POST /v3/tickets/aggs
Description: Retrieve aggregated statistics and analytics from tickets using OpenSearch aggregation queries. Supports terms aggregations, histograms, metrics, and nested aggregations for analyzing ticket patterns.
Request Body:
{
"application": "atr",
"app_type": ["ec2", "kubernetes"],
"domain": ["your-domain.example.com"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-20T23:59:59Z",
"includes_eu": false,
"aggs": {
"tickets_by_type": {
"terms": {
"field": "ticket.type",
"size": 20
}
},
"tickets_over_time": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1d"
}
},
"resolved_count": {
"filter": {
"term": {"ticket.resolved": true}
}
}
}
}
Request Body (With Filters):
{
"application": "atr",
"app_type": ["kubernetes"],
"domain": ["*"],
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-03-27T23:59:59Z",
"includes_eu": true,
"filters": [
{"term": {"ticket.type": "INCIDENT"}},
{"range": {"ticket.priority": {"lte": 2}}}
],
"aggs": {
"by_priority": {
"terms": {
"field": "ticket.priority",
"size": 10
}
},
"by_domain": {
"terms": {
"field": "atr.domain_name",
"size": 20
},
"aggs": {
"by_state": {
"terms": {
"field": "ticket.state",
"size": 5
}
}
}
}
}
}
Required Fields:
application(string): Application name. Only"atr"is supportedstart_time(string): Start time in ISO 8601 format (e.g.,"2026-01-19T00:00:00Z"or"2026-01-19T00:00:00.000Z")end_time(string): End time in ISO 8601 formatapp_type(array): Application types. Options:"ec2","kubernetes"(e.g.,["ec2"]or["ec2", "kubernetes"])domain(array): List of domain names or["*"]for all (cannot be empty)aggs(object): OpenSearch aggregation definition (must contain at least one aggregation)
Optional Fields:
filters(array): List of OpenSearch filter objects to apply. See OpenSearch Query DSL for full syntax. Supported filter types:term- Exact match on a fieldterms- Match any of multiple valuesrange- Numeric or date range queriesexists- Check if a field existsbool- Combine filters with nested logic (must, should, must_not)match/match_phrase- Full-text search
includes_eu(boolean): Include EU region search (default:true). Set tofalseto query only the local region for faster response times
Aggregation Types:
The aggs field accepts any valid OpenSearch aggregation. Common types include:
- Terms Aggregation - Group by field values:
"aggs": {"by_type": {"terms": {"field": "ticket.type","size": 20}}}
- Date Histogram - Group by time intervals:
"aggs": {"over_time": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}
- Filter Aggregation - Count documents matching criteria:
"aggs": {"resolved_tickets": {"filter": {"term": {"ticket.resolved": true}}}}
- Nested Aggregations - Combine multiple aggregations:
"aggs": {"by_domain": {"terms": {"field": "atr.domain_name","size": 10},"aggs": {"by_type": {"terms": {"field": "ticket.type","size": 5}}}}}
- Filter with Sub-aggregations - Analyze subset of data:
"aggs": {"incident_analysis": {"filter": {"term": {"ticket.type": "INCIDENT"}},"aggs": {"daily_counts": {"date_histogram": {"field": "@timestamp","fixed_interval": "1d"}}}}}
See OpenSearch Aggregations for full syntax.
Special Rules:
- App Type Field:
- Must be a list (e.g.,
["ec2"]not"ec2") - Only
"ec2"and"kubernetes"are valid values
- Must be a list (e.g.,
- Domain Field:
- Must be a list of strings
- Cannot be empty
- When using
"*", it must be the only element:["*"] - Cannot mix wildcard with other values:
["*", "domain1"]
- Cross Region Search:
- By default (
includes_eu: true), the query searches across all regional databases, including EU - Set
includes_eu: falseto query only the local region for reduced latency
- By default (
- Time Range:
end_timemust be afterstart_time- No maximum time range limit
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
Sample Response (200):
{
"data": {
"aggregations": {
"tickets_by_type": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 1250,
"buckets": [
{"key": "SR_ITEM", "doc_count": 45231},
{"key": "INCIDENT", "doc_count": 32187},
{"key": "SR_TASK", "doc_count": 18456}
]
},
"tickets_over_time": {
"buckets": [
{"key_as_string": "2026-01-01T00:00:00.000Z", "key": 1735689600000, "doc_count": 1523},
{"key_as_string": "2026-01-02T00:00:00.000Z", "key": 1735776000000, "doc_count": 1687}
]
},
"resolved_count": {
"doc_count": 67432
}
},
"total": 97124
},
"meta": {
"trace_id": "1-69c36684-6c0f659437a3dc38138a02dd",
"rate_limit": {
"daily_remaining": 9950
},
"pagination": {
"pit_id": null,
"search_after": null
}
}
}
Response Fields:
data.aggregations(object): Aggregation results - structure varies based on your aggregation definition- For terms aggregations: Contains
bucketsarray withkeyanddoc_count - For date histograms: Contains
bucketsarray withkey_as_string,key, anddoc_count - For filter aggregations: Contains
doc_countnumber - For nested aggregations: Contains nested aggregation results
- For terms aggregations: Contains
data.total(integer): Total number of tickets matching the query (before aggregation)meta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the daymeta.pagination.pit_id(null): Always null for aggregation queries (no pagination)meta.pagination.search_after(null): Always null for aggregation queries (no pagination)
Common Ticket Fields for Aggregations:
ticket.type- Ticket type (e.g., "SR_ITEM", "INCIDENT", "SR_TASK")ticket.state- Current state (e.g., "Requested", "Closed")ticket.priority- Priority level (e.g., "4 - Low")ticket.resolved- Whether the ticket is resolved (boolean)ticket.mapped- Whether the ticket is mapped (boolean)atr.domain_name- Domain nameatr.infra_type- Infrastructure type ("ec2", "kubernetes")atr.client- Client nameatr.environment- Environment (e.g., "client_production")@timestamp- Document timestamp
You can also explore available fields using OpenSearch Dashboards Discover.
POST /v3/tickets/mappings
Description: Retrieve all available fields and their data types from the tickets index. Useful for discovering which fields can be used in filters, fields, and aggs parameters.
Request Body:
{
"includes_eu": false
}
Optional Fields:
includes_eu(boolean): Include EU cross-cluster indices (default:true). Set tofalseto query only the local region
Special Rules:
- Extra Fields:
- Unknown fields in the request body are rejected (HTTP 400)
- An empty body or
{}is valid and defaults toincludes_eu: true
Sample Response (200):
{
"data": {
"fields": [
{"name": "@timestamp", "type": "alias"},
{"name": "atr.client", "type": "keyword"},
{"name": "atr.domain_name", "type": "keyword"},
{"name": "atr.infra_type", "type": "keyword"},
{"name": "ticket.created_on", "type": "date"},
{"name": "ticket.number", "type": "keyword"},
{"name": "ticket.priority", "type": "keyword"},
{"name": "ticket.resolved", "type": "boolean"},
{"name": "ticket.state", "type": "keyword"},
{"name": "ticket.type", "type": "keyword"}
],
"field_count": 95
},
"meta": {
"trace_id": "1-69c36684-6c0f659437a3dc38138a02dd",
"rate_limit": {
"daily_remaining": 998
}
}
}
Response Fields:
data.fields(array): Array of field objects, sorted alphabetically by namename(string): Full field path (e.g.,"ticket.created_on")type(string): OpenSearch field type (e.g.,"keyword","text","date","float","boolean","long","integer","alias")
data.field_count(integer): Total number of fieldsmeta.trace_id(string): X-Ray trace ID for debuggingmeta.rate_limit.daily_remaining(integer): Remaining API calls for the day
Notes:
- Fields with multi-field mappings appear as separate entries (e.g.,
ticket.short_descriptionaskeywordandticket.short_description.textastext) - Use
keywordtype fields for exact match filters (term,terms) and aggregations - Use
texttype fields for full-text search (match,match_phrase) - Use
datetype fields for time-based range queries and date histogram aggregations
Billing
V1
POST /v1/query
Description: Query billing data for a specific domain.
Request Body:
{
"domain": "example.domain.com",
"time_range": "now-15m/m"
}
Required Fields:
domain(string): Domain name of the monitored environmenttime_range(string): Time range in OpenSearch format (e.g., 'now-15m/m')
Response (200):
{
"summary": {
"ticket_count": 125,
"domain": "example.domain.com",
"time_range": "now-15m/m",
"client": "CMClient",
"live_status": "active",
"WBS": "1234ABCD",
"created": "2025-11-11T12:00:00Z",
"infra_type": "EC2",
"billing_type": "monthly",
"point_of_contact": "team@example.com"
},
"daily_requests_remaining": 480
}
Rate Limits
The API implements daily request limits to ensure safe usage:
- Each successful response includes a
daily_requests_remainingfield - Monitor this value to track your remaining quota
- Rate limit exceeded requests return HTTP 429 status
Authentication
All endpoints require JWT authentication. Include your token in the Authorization header.
For detailed authentication setup and examples, see Authentication.