---
description: Migrate from Zone Analytics API to GraphQL.
title: Zone Analytics to GraphQL Analytics
image: https://developers.cloudflare.com/og-docs.png
---

[Skip to content](#main-content)

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/analytics/llms.txt  
> Use this file to discover all available pages before exploring further.

# Zone Analytics to GraphQL Analytics

Last updated Aug 24, 2026|Copy as Markdown|[View as Markdown](https://mchen-ai-models-sync.previews.developers.cloudflare.com/analytics/graphql-api/migration-guides/zone-analytics/index.md)|[Agent setup](https://mchen-ai-models-sync.previews.developers.cloudflare.com/agent-setup/)

The Zone Analytics API allows you to get request data by zone. It offers optional `since` and `until` parameters to specify the request time period and a `continuous` parameter to indicate whether the time period should be moved backward to find a period with completely aggregated data.

For example, here is a sample curl call to get data for a two minute period:

```bash
curl "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/analytics/dashboard?since=2019-09-08T20:00:00Z&until=2019-09-08T20:02:00Z&continuous=false" \
--header "Authorization: Bearer <API_TOKEN>" --silent | jq .
```

Response

```json
{
	"success": true,
	"query": {
		"since": "2019-09-08T20:00:00Z",
		"until": "2019-09-08T20:02:00Z",
		"time_delta": 1
	},
	"errors": [],
	"messages": [],
	"result": {
		"timeseries": [
			{
				"since": "2019-09-08T20:00:00Z",
				"until": "2019-09-08T20:01:00Z",
				"requests": {
					"all": 15,
					"cached": 12,
					"uncached": 3,
					"ssl": {
						"encrypted": 13,
						"unencrypted": 2
					},
					"http_status": {
						"200": 4,
						"403": 11
					},
					"content_type": {
						"html": 12,
						"png": 3
					},
					"country": {
						"CN": 6,
						"IE": 1,
						"US": 3,
						"VN": 5
					},
					"ip_class": {
						"monitoringService": 4,
						"noRecord": 11
					},
					"ssl_protocol": {
						"TLSv1.2": 13,
						"none": 2
					}
				},
				"bandwidth": {
					"all": 312740,
					"cached": 309930,
					"uncached": 2810,
					"ssl": {
						"encrypted": 309276,
						"unencrypted": 3464
					},
					"ssl_protocol": {
						"TLSv1.2": 13,
						"none": 2
					},
					"content_type": {
						"html": 32150,
						"png": 280590
					},
					"country": {
						"CN": 10797,
						"IE": 98224,
						"US": 185176,
						"VN": 18543
					}
				},
				"threats": {
					"all": 6,
					"type": {
						"user.ban.ctry": 6
					},
					"country": {
						"CN": 6
					}
				},
				"pageviews": {
					"all": 1,
					"search_engine": {
						"pingdom": 1
					}
				},
				"uniques": {
					"all": 11
				}
			},
			{
				"since": "2019-09-08T20:01:00Z",
				"until": "2019-09-08T20:02:00Z",
				"requests": {
					"all": 4,
					"cached": 1,
					"uncached": 3,
					"ssl": {
						"encrypted": 4,
						"unencrypted": 0
					},
					"http_status": {
						"200": 4
					},
					"content_type": {
						"html": 1,
						"png": 3
					},
					"country": {
						"CA": 2,
						"US": 2
					},
					"ip_class": {
						"monitoringService": 4
					},
					"ssl_protocol": {
						"TLSv1.2": 4
					}
				},
				"bandwidth": {
					"all": 283399,
					"cached": 280590,
					"uncached": 2809,
					"ssl": {
						"encrypted": 283399,
						"unencrypted": 0
					},
					"ssl_protocol": {
						"TLSv1.2": 4
					},
					"content_type": {
						"html": 2809,
						"png": 280590
					},
					"country": {
						"CA": 101033,
						"US": 182366
					}
				},
				"threats": {
					"all": 0,
					"type": {},
					"country": {}
				},
				"pageviews": {
					"all": 1,
					"search_engine": {
						"pingdom": 1
					}
				},
				"uniques": {
					"all": 4
				}
			}
		],
		"totals": {
			"since": "2019-09-08T20:00:00Z",
			"until": "2019-09-08T20:02:00Z",
			"requests": {
				"all": 19,
				"cached": 13,
				"uncached": 6,
				"ssl": {
					"encrypted": 17,
					"unencrypted": 2
				},
				"http_status": {
					"200": 8,
					"403": 11
				},
				"content_type": {
					"html": 13,
					"png": 6
				},
				"country": {
					"CA": 2,
					"CN": 6,
					"IE": 1,
					"US": 5,
					"VN": 5
				},
				"ip_class": {
					"monitoringService": 8,
					"noRecord": 11
				},
				"ssl_protocol": {
					"TLSv1.2": 17,
					"none": 2
				}
			},
			"bandwidth": {
				"all": 596139,
				"cached": 590520,
				"uncached": 5619,
				"ssl": {
					"encrypted": 592675,
					"unencrypted": 3464
				},
				"ssl_protocol": {
					"TLSv1.2": 17,
					"none": 2
				},
				"content_type": {
					"html": 34959,
					"png": 561180
				},
				"country": {
					"CA": 101033,
					"CN": 10797,
					"IE": 98224,
					"US": 367542,
					"VN": 18543
				}
			},
			"threats": {
				"all": 6,
				"type": {
					"user.ban.ctry": 6
				},
				"country": {
					"CN": 6
				}
			},
			"pageviews": {
				"all": 2,
				"search_engine": {
					"pingdom": 2
				}
			},
			"uniques": {
				"all": 15
			}
		}
	}
}
```

As you can see from the response, Zone Analytics returns metrics along many dimensions and does not give you the option to control what you receive. With GraphQL Analytics, you can ask for only the data that you need. However, if you wanted to get exactly the same metrics and dimensions as you would from Zone Analytics, here is the query you would make:

```graphql
query ZoneAnalyticsMigrationSample($zoneTag: string, $start: Time, $end: Time) {
	viewer {
		zones(filter: { zoneTag: $zoneTag }) {
			httpRequests1mGroups(
				orderBy: [datetimeFiveMinutes_ASC]
				limit: 100
				filter: { datetime_geq: $start, datetime_lt: $end }
			) {
				dimensions {
					datetimeFiveMinutes
				}
				sum {
					browserMap {
						pageViews
						uaBrowserFamily
					}
					bytes
					cachedBytes
					cachedRequests
					contentTypeMap {
						bytes
						requests
						edgeResponseContentTypeName
					}
					clientSSLMap {
						requests
						clientSSLProtocol
					}
					countryMap {
						bytes
						requests
						threats
						clientCountryName
					}
					encryptedBytes
					encryptedRequests
					ipClassMap {
						requests
						ipType
					}
					pageViews
					requests
					responseStatusMap {
						requests
						edgeResponseStatus
					}
					threats
					threatPathingMap {
						requests
						threatPathingName
					}
				}
				uniq {
					uniques
				}
			}
		}
	}
}
```

Response

```json
{
	"data": {
		"viewer": {
			"zones": [
				{
					"httpRequests1mGroups": [
						{
							"dimensions": {
								"datetimeFiveMinutes": "2019-09-08T20:00:00Z"
							},
							"sum": {
								"browserMap": [
									{
										"pageViews": 1,
										"uaBrowserFamily": "PingdomBot"
									}
								],
								"bytes": 312740,
								"cachedBytes": 309930,
								"cachedRequests": 12,
								"clientSSLMap": [
									{
										"clientSSLProtocol": "none",
										"requests": 2
									},
									{
										"clientSSLProtocol": "TLSv1.2",
										"requests": 13
									}
								],
								"contentTypeMap": [
									{
										"bytes": 280590,
										"edgeResponseContentTypeName": "png",
										"requests": 3
									},
									{
										"bytes": 32150,
										"edgeResponseContentTypeName": "html",
										"requests": 12
									}
								],
								"countryMap": [
									{
										"bytes": 10797,
										"clientCountryName": "CN",
										"requests": 6,
										"threats": 6
									},
									{
										"bytes": 98224,
										"clientCountryName": "IE",
										"requests": 1,
										"threats": 0
									},
									{
										"bytes": 185176,
										"clientCountryName": "US",
										"requests": 3,
										"threats": 0
									},
									{
										"bytes": 18543,
										"clientCountryName": "VN",
										"requests": 5,
										"threats": 0
									}
								],
								"encryptedBytes": 309276,
								"encryptedRequests": 13,
								"ipClassMap": [
									{
										"ipType": "monitoringService",
										"requests": 4
									},
									{
										"ipType": "noRecord",
										"requests": 11
									}
								],
								"pageViews": 1,
								"requests": 15,
								"responseStatusMap": [
									{
										"edgeResponseStatus": 200,
										"requests": 4
									},
									{
										"edgeResponseStatus": 403,
										"requests": 11
									}
								],
								"threatPathingMap": [
									{
										"requests": 6,
										"threatPathingName": "user.ban.ctry"
									}
								],
								"threats": 6
							},
							"uniq": {
								"uniques": 11
							}
						},
						{
							"dimensions": {
								"datetimeFiveMinutes": "2019-09-08T20:01:00Z"
							},
							"sum": {
								"browserMap": [
									{
										"pageViews": 1,
										"uaBrowserFamily": "PingdomBot"
									}
								],
								"bytes": 283399,
								"cachedBytes": 280590,
								"cachedRequests": 1,
								"clientSSLMap": [
									{
										"clientSSLProtocol": "TLSv1.2",
										"requests": 4
									}
								],
								"contentTypeMap": [
									{
										"bytes": 280590,
										"edgeResponseContentTypeName": "png",
										"requests": 3
									},
									{
										"bytes": 2809,
										"edgeResponseContentTypeName": "html",
										"requests": 1
									}
								],
								"countryMap": [
									{
										"bytes": 101033,
										"clientCountryName": "CA",
										"requests": 2,
										"threats": 0
									},
									{
										"bytes": 182366,
										"clientCountryName": "US",
										"requests": 2,
										"threats": 0
									}
								],
								"encryptedBytes": 283399,
								"encryptedRequests": 4,
								"ipClassMap": [
									{
										"ipType": "monitoringService",
										"requests": 4
									}
								],
								"pageViews": 1,
								"requests": 4,
								"responseStatusMap": [
									{
										"edgeResponseStatus": 200,
										"requests": 4
									}
								],
								"threatPathingMap": [],
								"threats": 0
							},
							"uniq": {
								"uniques": 4
							}
						}
					]
				}
			]
		}
	},
	"errors": null
}
```

Notice that you can specify the request time period using a dataset filter (refer to [Filtering](https://mchen-ai-models-sync.previews.developers.cloudflare.com/analytics/graphql-api/features/filtering/)). The `continuous` parameter is no longer needed because GraphQL Analytics is designed to provide data as soon as it is available.

Also, if you want to get the totals for a particular period, rather than a breakdown by time period, simply remove the `datetimeFiveMinutes` field under `dimensions`.

Was this helpful?

YesNo

## On this page

[![](https://mchen-ai-models-sync.previews.developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://mchen-ai-models-sync.previews.developers.cloudflare.com/)

```json
{"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/analytics/graphql-api/migration-guides/zone-analytics/#page","headline":"Zone Analytics to GraphQL Analytics · Cloudflare Analytics docs","description":"Migrate from Zone Analytics API to GraphQL.","url":"https://developers.cloudflare.com/analytics/graphql-api/migration-guides/zone-analytics/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-08-24","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}
```
