Query API Logs
Server-side DataTables endpoint for querying real-time CDN access logs. Supports pagination and optional filters on resource, edge PoP, HTTP method, status code, cache status, client IP, and request path.
Date range constraints: All timestamps in r must be in UTC with minute granularity
(seconds always 00). Maximum supported window is 1 hour. Preset options available
in the UI are: Last 15 Minutes, Last 30 Minutes, and Last 1 Hour. Windows of 2 hours,
3 hours, and 6 hours are not supported by the API.
Column definitions: The request must include all 9 DataTables column descriptors
(columns[0] through columns[8]) with the data field names in this fixed order:
e, timestamp, pop, clientip, verb, request, bytes, response, cache.
Each column must also carry name (empty string), searchable ('true'),
orderable ('false'), search[value] (empty string), and search[regex] ('false').
The global search[value] and search[regex] fields must also be present.
curl -X POST "https://api.5centscdn.com/v2/account/logs/api" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "X-API-Key: YOUR_API_KEY" \
--data-urlencode draw=1 \
--data-urlencode columns[0][data]=e \
--data-urlencode columns[0][name]= \
--data-urlencode columns[0][searchable]=true \
--data-urlencode columns[0][orderable]=false \
--data-urlencode columns[0][search][value]= \
--data-urlencode columns[0][search][regex]=false \
--data-urlencode columns[1][data]=timestamp \
--data-urlencode columns[1][name]= \
--data-urlencode columns[1][searchable]=true \
--data-urlencode columns[1][orderable]=false \
--data-urlencode columns[1][search][value]= \
--data-urlencode columns[1][search][regex]=false \
--data-urlencode columns[2][data]=pop \
--data-urlencode columns[2][name]= \
--data-urlencode columns[2][searchable]=true \
--data-urlencode columns[2][orderable]=false \
--data-urlencode columns[2][search][value]= \
--data-urlencode columns[2][search][regex]=false \
--data-urlencode columns[3][data]=clientip \
--data-urlencode columns[3][name]= \
--data-urlencode columns[3][searchable]=true \
--data-urlencode columns[3][orderable]=false \
--data-urlencode columns[3][search][value]= \
--data-urlencode columns[3][search][regex]=false \
--data-urlencode columns[4][data]=verb \
--data-urlencode columns[4][name]= \
--data-urlencode columns[4][searchable]=true \
--data-urlencode columns[4][orderable]=false \
--data-urlencode columns[4][search][value]= \
--data-urlencode columns[4][search][regex]=false \
--data-urlencode columns[5][data]=request \
--data-urlencode columns[5][name]= \
--data-urlencode columns[5][searchable]=true \
--data-urlencode columns[5][orderable]=false \
--data-urlencode columns[5][search][value]= \
--data-urlencode columns[5][search][regex]=false \
--data-urlencode columns[6][data]=bytes \
--data-urlencode columns[6][name]= \
--data-urlencode columns[6][searchable]=true \
--data-urlencode columns[6][orderable]=false \
--data-urlencode columns[6][search][value]= \
--data-urlencode columns[6][search][regex]=false \
--data-urlencode columns[7][data]=response \
--data-urlencode columns[7][name]= \
--data-urlencode columns[7][searchable]=true \
--data-urlencode columns[7][orderable]=false \
--data-urlencode columns[7][search][value]= \
--data-urlencode columns[7][search][regex]=false \
--data-urlencode columns[8][data]=cache \
--data-urlencode columns[8][name]= \
--data-urlencode columns[8][searchable]=true \
--data-urlencode columns[8][orderable]=false \
--data-urlencode columns[8][search][value]= \
--data-urlencode columns[8][search][regex]=false \
--data-urlencode start=0 \
--data-urlencode length=25 \
--data-urlencode search[value]= \
--data-urlencode search[regex]=false \
--data-urlencode r=2026-01-20 11:00:00 - 2026-01-20 12:00:00 \
--data-urlencode resources[]=["12345"] \
--data-urlencode verbs[]=["GET"]
import requests
import json
url = "https://api.5centscdn.com/v2/account/logs/api"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"X-API-Key": "YOUR_API_KEY"
}
data = {
"draw": "1",
"columns[0][data]": "e",
"columns[0][name]": "",
"columns[0][searchable]": "true",
"columns[0][orderable]": "false",
"columns[0][search][value]": "",
"columns[0][search][regex]": "false",
"columns[1][data]": "timestamp",
"columns[1][name]": "",
"columns[1][searchable]": "true",
"columns[1][orderable]": "false",
"columns[1][search][value]": "",
"columns[1][search][regex]": "false",
"columns[2][data]": "pop",
"columns[2][name]": "",
"columns[2][searchable]": "true",
"columns[2][orderable]": "false",
"columns[2][search][value]": "",
"columns[2][search][regex]": "false",
"columns[3][data]": "clientip",
"columns[3][name]": "",
"columns[3][searchable]": "true",
"columns[3][orderable]": "false",
"columns[3][search][value]": "",
"columns[3][search][regex]": "false",
"columns[4][data]": "verb",
"columns[4][name]": "",
"columns[4][searchable]": "true",
"columns[4][orderable]": "false",
"columns[4][search][value]": "",
"columns[4][search][regex]": "false",
"columns[5][data]": "request",
"columns[5][name]": "",
"columns[5][searchable]": "true",
"columns[5][orderable]": "false",
"columns[5][search][value]": "",
"columns[5][search][regex]": "false",
"columns[6][data]": "bytes",
"columns[6][name]": "",
"columns[6][searchable]": "true",
"columns[6][orderable]": "false",
"columns[6][search][value]": "",
"columns[6][search][regex]": "false",
"columns[7][data]": "response",
"columns[7][name]": "",
"columns[7][searchable]": "true",
"columns[7][orderable]": "false",
"columns[7][search][value]": "",
"columns[7][search][regex]": "false",
"columns[8][data]": "cache",
"columns[8][name]": "",
"columns[8][searchable]": "true",
"columns[8][orderable]": "false",
"columns[8][search][value]": "",
"columns[8][search][regex]": "false",
"start": "0",
"length": "25",
"search[value]": "",
"search[regex]": "false",
"r": "2026-01-20 11:00:00 - 2026-01-20 12:00:00",
"resources[]": "["12345"]",
"verbs[]": "["GET"]"
}
response = requests.post(url, headers=headers, data=data)
print(response.json())
const params = new URLSearchParams();
params.append("draw", "1");
params.append("columns[0][data]", "e");
params.append("columns[0][name]", "");
params.append("columns[0][searchable]", "true");
params.append("columns[0][orderable]", "false");
params.append("columns[0][search][value]", "");
params.append("columns[0][search][regex]", "false");
params.append("columns[1][data]", "timestamp");
params.append("columns[1][name]", "");
params.append("columns[1][searchable]", "true");
params.append("columns[1][orderable]", "false");
params.append("columns[1][search][value]", "");
params.append("columns[1][search][regex]", "false");
params.append("columns[2][data]", "pop");
params.append("columns[2][name]", "");
params.append("columns[2][searchable]", "true");
params.append("columns[2][orderable]", "false");
params.append("columns[2][search][value]", "");
params.append("columns[2][search][regex]", "false");
params.append("columns[3][data]", "clientip");
params.append("columns[3][name]", "");
params.append("columns[3][searchable]", "true");
params.append("columns[3][orderable]", "false");
params.append("columns[3][search][value]", "");
params.append("columns[3][search][regex]", "false");
params.append("columns[4][data]", "verb");
params.append("columns[4][name]", "");
params.append("columns[4][searchable]", "true");
params.append("columns[4][orderable]", "false");
params.append("columns[4][search][value]", "");
params.append("columns[4][search][regex]", "false");
params.append("columns[5][data]", "request");
params.append("columns[5][name]", "");
params.append("columns[5][searchable]", "true");
params.append("columns[5][orderable]", "false");
params.append("columns[5][search][value]", "");
params.append("columns[5][search][regex]", "false");
params.append("columns[6][data]", "bytes");
params.append("columns[6][name]", "");
params.append("columns[6][searchable]", "true");
params.append("columns[6][orderable]", "false");
params.append("columns[6][search][value]", "");
params.append("columns[6][search][regex]", "false");
params.append("columns[7][data]", "response");
params.append("columns[7][name]", "");
params.append("columns[7][searchable]", "true");
params.append("columns[7][orderable]", "false");
params.append("columns[7][search][value]", "");
params.append("columns[7][search][regex]", "false");
params.append("columns[8][data]", "cache");
params.append("columns[8][name]", "");
params.append("columns[8][searchable]", "true");
params.append("columns[8][orderable]", "false");
params.append("columns[8][search][value]", "");
params.append("columns[8][search][regex]", "false");
params.append("start", "0");
params.append("length", "25");
params.append("search[value]", "");
params.append("search[regex]", "false");
params.append("r", "2026-01-20 11:00:00 - 2026-01-20 12:00:00");
params.append("resources[]", "["12345"]");
params.append("verbs[]", "["GET"]");
const response = await fetch("https://api.5centscdn.com/v2/account/logs/api", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"X-API-Key": "YOUR_API_KEY"
},
body: params
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"net/url"
"strings"
)
func main() {
data := url.Values{}
data.Set("draw", "1")
data.Set("columns[0][data]", "e")
data.Set("columns[0][name]", "")
data.Set("columns[0][searchable]", "true")
data.Set("columns[0][orderable]", "false")
data.Set("columns[0][search][value]", "")
data.Set("columns[0][search][regex]", "false")
data.Set("columns[1][data]", "timestamp")
data.Set("columns[1][name]", "")
data.Set("columns[1][searchable]", "true")
data.Set("columns[1][orderable]", "false")
data.Set("columns[1][search][value]", "")
data.Set("columns[1][search][regex]", "false")
data.Set("columns[2][data]", "pop")
data.Set("columns[2][name]", "")
data.Set("columns[2][searchable]", "true")
data.Set("columns[2][orderable]", "false")
data.Set("columns[2][search][value]", "")
data.Set("columns[2][search][regex]", "false")
data.Set("columns[3][data]", "clientip")
data.Set("columns[3][name]", "")
data.Set("columns[3][searchable]", "true")
data.Set("columns[3][orderable]", "false")
data.Set("columns[3][search][value]", "")
data.Set("columns[3][search][regex]", "false")
data.Set("columns[4][data]", "verb")
data.Set("columns[4][name]", "")
data.Set("columns[4][searchable]", "true")
data.Set("columns[4][orderable]", "false")
data.Set("columns[4][search][value]", "")
data.Set("columns[4][search][regex]", "false")
data.Set("columns[5][data]", "request")
data.Set("columns[5][name]", "")
data.Set("columns[5][searchable]", "true")
data.Set("columns[5][orderable]", "false")
data.Set("columns[5][search][value]", "")
data.Set("columns[5][search][regex]", "false")
data.Set("columns[6][data]", "bytes")
data.Set("columns[6][name]", "")
data.Set("columns[6][searchable]", "true")
data.Set("columns[6][orderable]", "false")
data.Set("columns[6][search][value]", "")
data.Set("columns[6][search][regex]", "false")
data.Set("columns[7][data]", "response")
data.Set("columns[7][name]", "")
data.Set("columns[7][searchable]", "true")
data.Set("columns[7][orderable]", "false")
data.Set("columns[7][search][value]", "")
data.Set("columns[7][search][regex]", "false")
data.Set("columns[8][data]", "cache")
data.Set("columns[8][name]", "")
data.Set("columns[8][searchable]", "true")
data.Set("columns[8][orderable]", "false")
data.Set("columns[8][search][value]", "")
data.Set("columns[8][search][regex]", "false")
data.Set("start", "0")
data.Set("length", "25")
data.Set("search[value]", "")
data.Set("search[regex]", "false")
data.Set("r", "2026-01-20 11:00:00 - 2026-01-20 12:00:00")
data.Set("resources[]", "["12345"]")
data.Set("verbs[]", "["GET"]")
req, err := http.NewRequest("POST", "https://api.5centscdn.com/v2/account/logs/api", strings.NewReader(data.Encode()))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("X-API-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.5centscdn.com/v2/account/logs/api')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/x-www-form-urlencoded'
request['X-API-Key'] = 'YOUR_API_KEY'
request.set_form([
["draw", "1"],
["columns[0][data]", "e"],
["columns[0][name]", ""],
["columns[0][searchable]", "true"],
["columns[0][orderable]", "false"],
["columns[0][search][value]", ""],
["columns[0][search][regex]", "false"],
["columns[1][data]", "timestamp"],
["columns[1][name]", ""],
["columns[1][searchable]", "true"],
["columns[1][orderable]", "false"],
["columns[1][search][value]", ""],
["columns[1][search][regex]", "false"],
["columns[2][data]", "pop"],
["columns[2][name]", ""],
["columns[2][searchable]", "true"],
["columns[2][orderable]", "false"],
["columns[2][search][value]", ""],
["columns[2][search][regex]", "false"],
["columns[3][data]", "clientip"],
["columns[3][name]", ""],
["columns[3][searchable]", "true"],
["columns[3][orderable]", "false"],
["columns[3][search][value]", ""],
["columns[3][search][regex]", "false"],
["columns[4][data]", "verb"],
["columns[4][name]", ""],
["columns[4][searchable]", "true"],
["columns[4][orderable]", "false"],
["columns[4][search][value]", ""],
["columns[4][search][regex]", "false"],
["columns[5][data]", "request"],
["columns[5][name]", ""],
["columns[5][searchable]", "true"],
["columns[5][orderable]", "false"],
["columns[5][search][value]", ""],
["columns[5][search][regex]", "false"],
["columns[6][data]", "bytes"],
["columns[6][name]", ""],
["columns[6][searchable]", "true"],
["columns[6][orderable]", "false"],
["columns[6][search][value]", ""],
["columns[6][search][regex]", "false"],
["columns[7][data]", "response"],
["columns[7][name]", ""],
["columns[7][searchable]", "true"],
["columns[7][orderable]", "false"],
["columns[7][search][value]", ""],
["columns[7][search][regex]", "false"],
["columns[8][data]", "cache"],
["columns[8][name]", ""],
["columns[8][searchable]", "true"],
["columns[8][orderable]", "false"],
["columns[8][search][value]", ""],
["columns[8][search][regex]", "false"],
["start", "0"],
["length", "25"],
["search[value]", ""],
["search[regex]", "false"],
["r", "2026-01-20 11:00:00 - 2026-01-20 12:00:00"],
["resources[]", "["12345"]"],
["verbs[]", "["GET"]"]
], 'application/x-www-form-urlencoded')
response = http.request(request)
puts response.body
{
"draw": 1,
"recordsTotal": 5000,
"recordsFiltered": 1250,
"data": [
{
"DT_RowId": "row_42",
"e": "evt_abc123",
"timestamp": "2026-01-20 12:00:00",
"pop": "AMS-01",
"clientip": "203.0.113.1",
"verb": "GET",
"request": "/video/sample.mp4",
"bytes": 102400,
"response": 200,
"cache": "HIT",
"useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"httpversion": 1.1,
"os_full": "Windows 10",
"device": "Desktop",
"referrer": "https://example.com/",
"browser_full": "Chrome 120",
"geoip": {
"country_name": "India",
"continent_code": "AS",
"asn_org": "Jio Platforms Limited",
"asn_number": "AS55836"
},
"sort": 1705737600000
}
]
}
/account/logs/api
Target server for requests. Edit to use your own host.
API key (sent in header)
The media type of the request body
DataTables draw sequence counter. Echoed back in the response so the client can match async responses to requests and discard out-of-order results.
Data field name for column 0. Must be 'e' (expand/collapse toggle).
Data field name for column 1. Must be 'timestamp'.
Data field name for column 2. Must be 'pop'.
Data field name for column 3. Must be 'clientip'.
Data field name for column 4. Must be 'verb'.
Data field name for column 5. Must be 'request'.
Data field name for column 6. Must be 'bytes'.
Data field name for column 7. Must be 'response'.
Data field name for column 8. Must be 'cache'.
Column name. Always empty string for all 9 columns.
Whether the column is searchable. Always 'true'.
Whether the column is orderable. Always 'false'.
Per-column search value. Always empty string.
Whether the per-column search is a regex. Always 'false'.
Zero-based record offset for pagination.
Number of records per page. The dashboard UI uses 25.
Global search value. Always empty string.
Whether the global search uses a regex. Always 'false'.
Date range filter in UTC with minute granularity: "YYYY-MM-DD HH:mm:00 - YYYY-MM-DD HH:mm:00". Maximum window is 1 hour. Timestamps are converted from local time to UTC by the client before sending.
Optional. Filter to the specified resource IDs. When omitted, all resources assigned to the API log tab are queried.
Optional. Filter to requests served by the specified edge PoP codes.
Optional. Filter to the specified HTTP methods.
Optional. Filter to the specified HTTP response status codes. Accepts values 100–599.
Optional. Filter to the specified CDN cache statuses (e.g. HIT, MISS, BYPASS).
Optional. Filter to requests from the specified client IPv4 addresses.
Optional. Filter to requests matching the specified path patterns.
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Provide your API key in the header.
Body
DataTables draw sequence counter. Echoed back in the response so the client can match async responses to requests and discard out-of-order results.
1Data field name for column 0. Must be 'e' (expand/collapse toggle).
eData field name for column 1. Must be 'timestamp'.
timestampData field name for column 3. Must be 'clientip'.
clientipData field name for column 5. Must be 'request'.
requestData field name for column 7. Must be 'response'.
responseWhether the per-column search is a regex. Always 'false'.
falseWhether the global search uses a regex. Always 'false'.
falseDate range filter in UTC with minute granularity: "YYYY-MM-DD HH:mm:00 - YYYY-MM-DD HH:mm:00". Maximum window is 1 hour. Timestamps are converted from local time to UTC by the client before sending.
2026-01-20 11:00:00 - 2026-01-20 12:00:00Optional. Filter to the specified resource IDs. When omitted, all resources assigned to the API log tab are queried.
["12345"]Optional. Filter to the specified HTTP response status codes. Accepts values 100–599.
["200","404"]Optional. Filter to the specified CDN cache statuses (e.g. HIT, MISS, BYPASS).
["HIT"]Optional. Filter to requests from the specified client IPv4 addresses.
["203.0.113.1"]Optional. Filter to requests matching the specified path patterns.
["/video/sample.mp4"]Responses
Echo of the draw counter from the request. Used by DataTables to correlate async responses with the correct request.
Total number of records in the unfiltered dataset.
Total number of records matching the active filters. Used by DataTables to calculate total page count.
Access log entries for the current page.