The previous Search Ads 360 Reporting API is decommissioned. You can now create your reports using the new Search Ads 360 Reporting API.
Note that the get and getByCustomerId methods in the Search Ads 360 Conversion API are being deprecated in Q3 2025. To continue accessing conversion data, you must create a report using the conversion resource using the new Search Ads 360 Reporting API. See more details here.
Stay organized with collections
Save and categorize content based on your preferences.
The new Search Ads 360 Reporting API is now available. The new API provides
enhanced flexibility to build custom reports and integrate the data into your reporting applications
and processes. Learn more about migrating to and using the new Search Ads 360 Reporting
API.
What should my report scope be?
For most reports, we recommend that you set
Reports.reportScope
to a specific engine account or advertiser. For very large
reports—such as keyword reports, conversion reports, or
finely-segmented reports—we recommend limiting the scope to a
specific engine account. The API may return errors for reports larger than
10 million rows.
If you don't already have the IDs for the agencies and advertisers you have
permission to view, request an
advertiser
report with the agencyId and advertiserId columns,
but don't specify the reportScope.
Search Ads 360 will return a list of all agency and advertiser IDs that your
Google Account has permission to view.
Use the Search Ads 360 utility script to send this request
To send a raw JSON POST request, you can use the sa360Api.py
script as follows:
Copy the example JSON object (everything between and including the two
curly brackets) into a new text file named request.txt.
Change the agency ID that's in the JSON code to your own agency ID.
Remove any comments, such as // The date column segments the report by individual days.
Assemble your OAuth 2.0 credentials into a single, comma-delimited string as
follows: client-ID,client-secret,refresh-token
(This is the same string that sa360Api.py outputs when you run sa360Api.py
--login as described in Set Up
Authorization.)
Invoke sa360Api.py as follows: sa360Api.py --cred
CREDENTIALS --server API-method --post < request.txt
In the command above, substitute the string you assembled in the previous step for CREDENTIALS.
Substitute the name of the POST method in the box below for API-method.
For example: sa360Api.py --cred
123456789123.apps.googleusercontent.com,ABCDEFGHIJKLMNOPQR_abcdef,1/HIJklM01OPQR23NOP456rst890uvw
--server https://www.googleapis.com/doubleclicksearch/v2/reports/generate --post < request.txt
To make sure your reports contain all available metrics, we recommend waiting about 4
hours after midnight (engine account time zone) before requesting reports of yesterday's
metrics; for the conversion report, we recommend waiting for
12 hours after midnight (Campaign Manager advertiser time zone). If you use the API to upload conversion data, see
insert.operation
for details about the availability of uploaded data.
Even after several days, a metric can still change due to engine spam filters or offline
conversions being uploaded via the API. To incrementally download these
changes, request reports
on the data that has changed since your last download. If you download incremental
changes, we recommend that you request a full report every once in awhile. For example,
you might download incremental changes every few days and then request a full report once
a month.
When will attribute changes appear in reports?
It takes about a minute for attribute changes that someone makes in Search Ads 360 to appear in
reports that you download via the API. Changes made directly on the external engine (not
through Search Ads 360) will need to be imported into Search Ads 360 first using inbound sync.
Sometimes Search Ads 360 cannot attribute metrics to a specific ad. For example, an ad with an
unsupported format or a clickserver URL with an error can prevent Search Ads 360 from attributing
metrics to an ad. For each ad group, Search Ads 360 reports any unattributed metrics as belonging to
an "unattributed ad." To request these metrics in a report, set
includeRemovedEntities
to true. To make it easy to see which ads are unattributed, include the
isUnattributedAd column in the request.
Similarly, at times Search Ads 360 cannot attribute metrics to a specific keyword.
This happens when discrepancies in reporting arise. In such cases, the
keywordId column for unattributed keywords is set to 0.
Do reports include scaled conversions?
In some cases, conversions are hard to measure, such as when the website cookies that store
information about your ad clicks aren't available due to factors including browser settings.
In these cases, Floodlight uses scaling to account for the conversion data that can't be
directly measured. That is, Floodlight applies machine learning to historical data to model the
number of conversions and amount of conversion revenue that cannot be measured. Floodlight can
then add the resulting estimate to its conversion metrics to provide a more complete picture of
how your advertising drives conversions.
Floodlight always applies scaling to the following reporting columns:
The conversion
report does not include scaled conversions. It only shows conversions that were measured
directly. The number of conversions and amount of revenue in a conversion report
are not expected to match the conversions and revenue reported in the columns listed above.
Why do raw conversions not sum up to aggregated metric X?
In the rare event that aggregated metrics disagree with raw events in Search Ads 360, trust the
aggregated metric. When computing metric aggregates, Search Ads 360 attempts to sanitize data
sources by removing conversions that it suspects are duplicates.
What if my question isn't answered here?
If there's a problem that you can't solve after reading the resources on this site,
contact support and have the
following information ready:
Search Ads 360 Agency ID and Advertiser ID you are trying to access
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-28 UTC."],[[["\u003cp\u003eThe new Search Ads 360 Reporting API offers increased flexibility for creating custom reports and integrating data into your systems.\u003c/p\u003e\n"],["\u003cp\u003eFor large reports or those with fine segmentation, limit the report scope to a specific engine account to avoid errors.\u003c/p\u003e\n"],["\u003cp\u003eUse the provided utility script and example request to retrieve agency and advertiser IDs if needed.\u003c/p\u003e\n"],["\u003cp\u003eData freshness varies by metric; allow sufficient time for data to fully populate before generating reports.\u003c/p\u003e\n"],["\u003cp\u003eScaled conversions are included in some reports but not in the \u003ccode\u003econversion\u003c/code\u003e report, which shows only directly measured conversions.\u003c/p\u003e\n"]]],["The Search Ads 360 Reporting API allows custom report creation and data integration. For most reports, the scope should be an engine account or advertiser, limiting to a specific engine account for large reports. To find agency and advertiser IDs, request an advertiser report without specifying the `reportScope`. Use the `sa360Api.py` script to send raw JSON requests. Data freshness varies, with recommendations to wait 4 hours for most metrics and 12 for the conversion report. Attribute changes appear in reports after about a minute.\n"],null,["# Reporting FAQ\n\nThe new Search Ads 360 Reporting API is now available. The new API provides enhanced flexibility to build custom reports and integrate the data into your reporting applications and processes. Learn more about migrating to and using the [new Search Ads 360 Reporting\nAPI](https://developers.google.com/search-ads/reporting/overview).\n\n### What should my report scope be?\n\n\nFor most reports, we recommend that you set\n[`Reports.reportScope`](/search-ads/v2/reference/reports#request.reportScope)\nto a specific engine account or advertiser. For very large\nreports---such as keyword reports, conversion reports, or\nfinely-segmented reports---we recommend limiting the scope to a\nspecific engine account. The API may return errors for reports larger than\n10 million rows.\n\n### Why am I receiving a Forbidden (403) error?\n\n\nMost likely, you need to\n[obtain a refresh OAuth token](/identity/protocols/oauth2#5.-refresh-the-access-token,-if-necessary).\n\n### How do I find IDs for agencies and advertisers?\n\n\nIf you don't already have the IDs for the agencies and advertisers you have\npermission to view, request an\n[`advertiser`](/search-ads/v2/report-types/advertiser)\nreport with the `agencyId` and `advertiserId` columns,\nbut don't specify the [`reportScope`](/search-ads/v2/reference/reports#request.reportScope).\nSearch Ads 360 will return a list of all agency and advertiser IDs that your\nGoogle Account has permission to view.\n\nHere's an example request:\n\n```carbon\nPOST https://www.googleapis.com/doubleclicksearch/v2/reports/generate\nAuthorization: Bearer your OAuth 2.0 access token\nContent-type: application/json\n{\n \"reportType\": \"advertiser\",\n \"columns\": [\n { \"columnName\": \"agency\" },\n { \"columnName\": \"agencyId\" },\n { \"columnName\": \"advertiser\" },\n { \"columnName\": \"advertiserId\" }\n ],\n \"statisticsCurrency\": \"usd\"\n}\n \n```\n\n#### Use the Search Ads 360 utility script to send this request\n\n\nTo send a raw JSON POST request, you can use the [sa360Api.py\nscript](/search-ads/v2/prereqs#ds3py) as follows:\n\n1. Copy the example JSON object (everything between and including the two curly brackets) into a new text file named `request.txt`.\n2. Change the agency ID that's in the JSON code to your own agency ID.\n3. Remove any comments, such as `// The date column segments the report by individual days.`\n4. Assemble your OAuth 2.0 credentials into a single, comma-delimited string as follows: \n `client-ID,client-secret,refresh-token` \n (This is the same string that `sa360Api.py` outputs when you run `sa360Api.py\n --login` as described in [Set Up\n Authorization](/search-ads/v2/authorizing).)\n5. Invoke `sa360Api.py` as follows: \n `sa360Api.py --cred\n `*CREDENTIALS*` --server `*API-method*` --post \u003c request.txt\n ` \n In the command above, substitute the string you assembled in the previous step for *CREDENTIALS*. \n Substitute the name of the POST method in the box below for *API-method*.\n\n\n For example: \n `sa360Api.py --cred\n 123456789123.apps.googleusercontent.com,ABCDEFGHIJKLMNOPQR_abcdef,1/HIJklM01OPQR23NOP456rst890uvw\n --server https://www.googleapis.com/doubleclicksearch/v2/reports/generate --post \u003c request.txt`\n| **Note:**\n|\n| Because `statisticsCurrency` is a required field, specify\n| `usd` in this request. In other reports that are scoped to an\n| advertiser or lower, you can [request\n| the report to be returned in another currency](/search-ads/v2/how-tos/reporting#currency).\n\n### How fresh is the reporting data?\n\n\nSome metrics are fresher than others. For details, see [how fresh is the reporting data\nin Search Ads 360?](https://support.google.com/searchads/answer/1185359)\n\n\nTo make sure your reports contain all available metrics, we recommend waiting about 4\nhours after midnight (engine account time zone) before requesting reports of yesterday's\nmetrics; for the `conversion` report, we recommend waiting for\n12 hours after midnight (Campaign Manager advertiser time zone). If you use the API to upload conversion data, see\n[insert.operation](https://support.google.com/searchads/answer/2604604#insert-operation)\nfor details about the availability of uploaded data.\n\n\nEven after several days, a metric can still change due to engine spam filters or offline\nconversions being uploaded via the API. To incrementally download these\nchanges, request [reports\non the data that has changed](/search-ads/v2/how-tos/reporting/incremental-reports) since your last download. If you download incremental\nchanges, we recommend that you request a full report every once in awhile. For example,\nyou might download incremental changes every few days and then request a full report once\na month.\n\n### When will attribute changes appear in reports?\n\n\nIt takes about a minute for attribute changes that someone makes in Search Ads 360 to appear in\nreports that you download via the API. Changes made directly on the external engine (not\nthrough Search Ads 360) will need to be imported into Search Ads 360 first using [inbound sync](https://support.google.com/searchads/answer/1184686).\n\n\nWe recommend [returning\nonly the data that has changed](/search-ads/v2/how-tos/reporting/incremental-reports) to determine which entities have attribute changes.\n\n### What are unattributed ads and keywords?\n\n\nSometimes Search Ads 360 cannot attribute metrics to a specific ad. For example, an ad with an\nunsupported format or a clickserver URL with an error can prevent Search Ads 360 from attributing\nmetrics to an ad. For each ad group, Search Ads 360 reports any unattributed metrics as belonging to\nan \"unattributed ad.\" To request these metrics in a report, set\n[`includeRemovedEntities`](/search-ads/v2/reference/reports#request.includeRemovedEntities)\nto `true`. To make it easy to see which ads are unattributed, include the\n`isUnattributedAd` column in the request.\n\n\nSimilarly, at times Search Ads 360 cannot attribute metrics to a specific keyword.\nThis happens when discrepancies in reporting arise. In such cases, the\n`keywordId` column for unattributed keywords is set to 0.\n\n### Do reports include scaled conversions?\n\n\nIn some cases, conversions are hard to measure, such as when the website cookies that store\ninformation about your ad clicks aren't available due to factors including browser settings.\nIn these cases, Floodlight uses scaling to account for the conversion data that can't be\ndirectly measured. That is, Floodlight applies machine learning to historical data to model the\nnumber of conversions and amount of conversion revenue that cannot be measured. Floodlight can\nthen add the resulting estimate to its conversion metrics to provide a more complete picture of\nhow your advertising drives conversions.\n\nFloodlight always applies scaling to the following reporting columns:\n\n- dfaActions\n- dfaRevenue\n- dfaTransactions\n- dfaWeightedActions\n- [Saved columns](/search-ads/v2/how-tos/reporting/saved-columns) that report on Floodlight activities\n\n\nThe [`conversion`](/search-ads/v2/report-types/conversion)\nreport does not include scaled conversions. It only shows conversions that were measured\ndirectly. The number of conversions and amount of revenue in a `conversion` report\nare not expected to match the conversions and revenue reported in the columns listed above.\n\n### Why do raw conversions not sum up to aggregated metric *X*?\n\nIn the rare event that aggregated metrics disagree with raw events in Search Ads 360, trust the\naggregated metric. When computing metric aggregates, Search Ads 360 attempts to sanitize data\nsources by removing conversions that it suspects are duplicates.\n\n### What if my question isn't answered here?\n\nIf there's a problem that you can't solve after reading the resources on this site,\n[contact support](https://support.google.com/searchads/answer/9026876) and have the\nfollowing information ready:\n\n- Search Ads 360 Agency ID and Advertiser ID you are trying to access\n\n- Project Number from [Google API Console](https://console.cloud.google.com/)\n\n- The username of the Google Account that you're using to access the API. \n\n This is the account that has been [given\n permission to access Search Ads 360](/search-ads/v2/prereqs#permissions), which is the same account you use to\n [set up authorization](/search-ads/v2/authorizing).\n\n- Code snippet of your request\n\n- JSON response \n\n If the response is an error, be sure to include the error message, not just the\n numeric error code."]]