Platform management

Request logs data reference

The article explains the file format and data structure of the API request log feature, detailing the content and available data.

This article describes the file format and data structure delivered by the API request log feature.

File format

Files are gzipped in newline-delimited JSON (NDJSON) format.

File content

The logs will contain detailed HTTP event information, with each line representing an individual event.

Pro tip

Available data

Field IDField nameTypeDescriptionMapping
insertIdInsert IDStringUnique identifier for log entry. Used in deduplication processes.body.insertId
traceIdTrace IDStringCan appear for multiple log entries. Useful for Sanity Support.traceId
spanIdSpan IDStringCan appear for multiple log entries. Useful for Sanity Support.spanId
timestampTimestampStringTime of request in RFC3339 UTC format.timestamp
projectIdProject IDStringProject ID associated with the request.attributes.sanity.projectId
datasetNameDataset NameStringDataset associated with the request. Not all APIs require a dataset name.attributes.sanity.dataset
domainRequest TypeStringType of request (api, apicdn, cdn, studio).attributes.sanity.domain
requestMethodRequest MethodStringHTTP verb used (e.g., GET, POST). Useful for differentiating request types.body.method
requestUrlFull URLStringUnaltered URL received by Sanity including query parameters.body.url
groqQueryIdentifierGROQ Query IdentifierStringHashed version of the GROQ query string without parameters. Useful for grouping similar queries. Only available for GET requests.attributes.sanity.groqQueryIdentifier
apiVersionAPI VersionStringAPI version used, with the leading "v" stripped from the URL — for example 1, X, or YYYY-MM-DD. Not applicable to asset requests.attributes.sanity.apiVersion
tagsTagsString[]Array of tags supplied by the caller. Useful for grouping requests by business needs.attributes.sanity.tags
refererReferrerStringReferrer URL of the request, as defined in HTTP/1.1 Header Field Definitions.body.referer
userAgentUser AgentStringUser agent sent by the client. Optional. Example: python-requests/2.21.0.body.userAgent
remoteIpRemote IPStringIP address (IPv4 or IPv6) of the client that issued the HTTP request. Includes port information if available.body.remoteIp
studioRequestIs Studio RequestBooleanIndicates if the request was sent from Sanity Studio.attributes.sanity.studioRequest
returnStatusReturn StatusIntegerResponse code indicating the status of the response (e.g., 200, 404).body.status
requestSizeRequest SizeNumberSize of the HTTP request message in bytes.body.requestSize
responseSizeResponse SizeNumberSize of the HTTP response message sent back to the client in bytes. Used for metering bandwidth.body.responseSize
durationResponse TimeDecimalNumber of milliseconds between request and response within the service. Useful for performance analysis. Does not account for network latency.body.duration
endpointEndpointStringThe endpoint used in the request, e.g., graphql is used for GraphQL calls while query or mutate are GROQ calls.attributes.sanity.endpoint

Example output

{
	"timestamp": "2024-01-03T13:36:56.87202961Z",
	"traceId": "b48b918db42f0f0786702fa3ef7f6451",
	"spanId": "be245ae33db3cdaf",
	"severityText": "INFO", // INFO = <400, WARN = 400-499, ERROR = >=500
	"severityNumber": 9, // info = 9, warn = 13, error = 17
	"body": {
    "duration": 32,
		"insertId": "asdf93n03nasdf",
		"method": "GET",
		"referer": "",
    "remoteIp": "34.79.228.45",
    "requestSize": 421,
    "responseSize": 936,
    "status": 200,
    "url": "https://0ekpuoxg.apicdn.sanity.io/v2022-09-01/data/query/cache-delay?query=%0A%2A%5B_id+%3D%3D+%22cache-delay%22%5D%5B0%5D%7B%0A++++%22timestampUnixMs%22%3A+dateTime%28_updatedAt%29+-+dateTime%28%221970-01-01T00%3A00%3A00Z%22%29%2C%0A++++%22counter%22%3A+counter%0A%7D%0A",
    "userAgent": "python-requests/2.21.0"
	},
	"resource": {
		"service": {
			"name": "Sanity.io"
		},
		"sanity": {
			"type": "http_request",
			"version": "0.0.1"
		}
	},
	"attributes": { // information extracted/parsed from the glb log
		"sanity": {
			"projectId": "exx11uqh",
		  "dataset": "webhook-test",
		  "domain": "api",
			"endpoint": "query",
			"groqQueryIdentifier": "somehash",
			"apiVersion": "2022-09-01",
			"tags": [],
			"studioRequest": false
		}
	}
}

File delivery for projects on enterprise plans

We key the object using Hive partitioning with the following format:

gs://[BUCKET_NAME]/[PREFIX]/event-logs/project_id=[string]/kind=request-log/dt=[date:DATE]/[file-name:string].ndjson.gz

This allows data to be loaded into various platforms with the project ID, data type, and date used as partitioning properties.

Was this page helpful?