VI | EN
Message us on Messenger
Developer resources

Run a synchronous report — TikTok Business API

Run a synchronous report · call it through Quantri360 with one API key for your own accounts / assets that you connected and authorized — 360 handles request signing and refreshing the authorization you granted.

Run a synchronous report

GET/report/integrated/get/Via 360: GET https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/
Description

Use this endpoint to create a synchronous report task.

This endpoint can currently return the reporting data of up to 20,000 advertisements. If your number of advertisements exceeds 20,000, please use campaign_ids / adgroup_ids / ad_ids as a filter to obtain the reporting data of all advertisements in batches. If you use campaign_ids / adgroup_ids / ad_ids as a filter, you can pass in up to 100 IDs at a time.

  • To learn about how to run a synchronous report, see Run a synchronous report.
  • To find out the supported dimensions, metrics, and use cases for different report types, see Report types.
  • To learn about the relationship between advertising service type, report type and report data level, see Overview-Data level.
  • To find out answers to common questions regarding reporting, see FAQ.

> Important

> If you want to retrieve the reporting data of GMV Max Campaigns, run GMV Max Campaign reports for your Product GMV Max Campaigns or Live GMV Max Campaigns using /gmv_max/report/get/ instead.

>Note

>If you compare the synchronous report with a report downloaded from TTAM (TikTok Ads Manager), you will discover data inconsistency because the downloaded report should be compared with its counterpart, an asynchronous report, rather than a synchronous report. Both the TTAM downloaded report and the API asynchronous report do not implement the 20,000-truncation for ads.

Request

Endpoint

GET https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/

Authentication & shop

NameInTypeSampleDescription
AuthorizationheaderheaderBearer q360_live_ab12cd34_…Khóa API của brand (tạo ở mục API key). Bắt buộc với mọi request. Brand suy từ key — không truyền mã brand.
platform_shop_idquerystring7000000000000000001Tài sản TikTok Business đã kết nối — "Mã tài sản" ở trang Nền tảng hoặc GET /v1/platforms (tài khoản quảng cáo cho Marketing API, tài khoản TikTok cho Organic / Messaging). Có thể bỏ khi chỉ kết nối một tài sản.

Request parameters

NameInTypeRequiredSampleDescription
advertiser_idsquerystring[]NoWhen report_type is set to BASIC or AUDIENCE, you need to pass in either advertiser_id or advertiser_ids. If you pass in both advertiser_id and advertiser_ids, advertiser_id will be ignored. Valid when report_type is BASIC or AUDIENCE. A list of advertiser IDs. Max size: 5. Please be aware of the following information when working with this field: - When advertiser_ids is used, we will return up to 20,000 IDs in response. The cutoff logic for IDs is based on the creation time of campaigns, ad groups, or ads in descending order, but we cannot guarantee that each advertiser will have an evenly distributed number of IDs. - When advertiser_ids is used, the returned metrics data in the response will include currency, timezone, and advertiser_id. - Different advertisers might have different time zones. You can use multi_adv_report_in_utc_time to determine whether the data returned should be set to the UTC+0 timezone for all advertisers or set to the local timezone for each respective advertiser. - Different advertisers might have different currencies, and we will return the corresponding currency for each advertiser in the returned metrics. These metric data will be presented without a decimal point. For instance, a spend of "100 USD" will be displayed as 100 without any decimal indicator such as ".000". - If you want to view the total added-up metrics for all advertiser IDs, enable enable_total_metrics in your request. The returned total_metrics in the response will include currency, timezone, and advertiser_id, but all with a value of -. Note: - If you use advertiser_ids but do not include any ID dimensions in the dimensions field, we will return 0 as the value for currency, timezone, and advertiser_id and - as the value of cost-related metrics, such as spend, in the metrics object of the response. - The advertisers specified in advertiser_ids should all belong to the same TikTok for Business user. Otherwise, an error will occur. Use /oauth2/advertiser/get/ to retrieve a list of advertiser IDs that belong to the same TikTok for Business user.
bc_idquerystringNoYou need to pass in either advertiser_id/advertiser_ids or bc_id. - When report_type is set to BASIC or AUDIENCE,, pass in advertiser_idor advertiser_ids. - When report_type is set to PLAYABLE_MATERIAL, CATALOG, or TT_SHOP, pass in advertiser_id. - When report_type is set to BC, pass in bc_id. ID of a Business Center that you have access to. To get a list of Business Centers that you have access to, use /bc/get/.
service_typequerystringNoNot supported when report_type is BC. Ad service type. Enum values: - AUCTION: auction ads, or both auction ads and reservation ads. - RESERVATION (deprecated) : reservation ads. Default value when report_type is not set to BC: AUCTION. Note: To retrieve the reporting data of TopView ads, use the basic reports or audience reports and specify the value RESERVATION_TOP_VIEW for the buying_type filter.
report_typequerystringYesReport type. Enum values: - BASIC: basic report. - AUDIENCE: audience report. - PLAYABLE_MATERIAL: playable ads report. - CATALOG: DSA report. - BC: Business Center report. - TT_SHOP (to-be-deprecated): GMV max ads report. - When service_type is AUCTION, BASIC, AUDIENCE, PLAYABLE_MATERIAL, CATALOG, and TT_SHOP reports are all supported. - When report_type is BC, you don't need to pass service_type. Important: GMV max ads reports (with report_type as TT_SHOP) only provide limited data and will be deprecated in the next API version. To ensure a smooth integration experience, run GMV Max Campaign reports for your Product GMV Max Campaigns or Live GMV Max Campaigns using /gmv_max/report/get/ instead.
data_levelquerystringNoNot supported when report_type is BC. Required when report_type is BASIC,AUDIENCE or CATALOG. The data level that you'd like to query in reports. Enum values: - AUCTION_AD: auction ads or both auction ads and reservation ads, ad level. - AUCTION_ADGROUP: auction ads or both auction ads and reservation ads, ad group level. - AUCTION_CAMPAIGN: auction ads or both auction ads and reservation ads, campaign level. - AUCTION_ADVERTISER: auction ads or both auction ads and reservation ads, advertiser level. - RESERVATION_AD(deprecated): reservation ads, ad level. - RESERVATION_ADGROUP(deprecated): reservation ads, ad group level. - RESERVATION_CAMPAIGN(deprecated): reservation ads, campaign level. - RESERVATION_ADVERTISER(deprecated): reservation ads, advertiser level. Note: - If you specify this field as AUCTION_ADVERTISER, data of all Auction Ads and Reservation Ads under the advertiser account will be returned. - When report_type is BASIC, AUDIENCE or CATALOG: - If you set this field to AUCTION_CAMPAIGN, the data for all ads under undeleted auction campaigns will be returned, because by default the campaign_status filter is applied and defaults to STATUS_NOT_DELETE. - If you set this field to AUCTION_ADGROUP, the data for all ads under undeleted auction ad groups will be returned, because by default the adgroup_status filter is applied and defaults to STATUS_NOT_DELETE. - If you set this field to AUCTION_AD, only the data for undeleted ads under all auction campaigns will be returned, because by default the ad_status filter is applied and defaults to STATUS_NOT_DELETE. - If you want to get the data for all ads under all auction campaigns, set the ad_status filter to STATUS_ALL (filtering=[{"field_name":"ad_status","filter_type":"IN","filter_value":"[\"STATUS_ALL\"]"}]). - When report_type is TT_SHOP, you can only set this field to AUCTION_ADVERTISER or AUCTION_CAMPAIGN.
dimensionsquerystring[]YesGrouping conditions. For example: ["campaign_id", "stat_time_day"] indicates that both campaign_id and stat_time_day (days) are grouped. Different report types support different dimensions. - Supported dimensions in basic reports - Supported dimensions in audience reports - Supported dimensions in playable ad reports - Supported dimensions in DSA reports - Supported dimensions in Business Center reports - Supported dimensions in GMV max ads reports Note: - If report_type is not set to BC: - When dimensions contains stat_time_day, the query time range cannot exceed 30 days. - When dimensions contains stat_time_hour, the query time range cannot exceed 1 day. - If your query dimensions contains more than xx_id and there is no ads reporting within the query time range, an empty list will be returned.
metricsquerystring[]NoMetrics to query. Different report types support different metrics. For supported metrics for each report type, see the corresponding articles under Report types. - When report_type is set to BASIC, AUDIENCE, PLAYABLE_MATERIAL, or CATALOG, the default value is ["spend", "impressions"]. - When report_type is set to BC, the default value is all the metrics supported by the dimension grouping specified through dimensions. - When report_type is set to TT_SHOP, the default value is ["spend", "billed_cost"]. Note that the amount of currency metrics are based on the currency set by the advertiser's account.
enable_total_metricsquerybooleanNoWhether to enable the total added-up data for your requested metrics. When enable_total_metrics is enabled, we will provide the aggregate data for all pages as you query different pages. Under this condition, you only need to specify this field when requesting data for the first page. Due to the 20,000-truncation limitation, when enable_total_metrics is enabled, we will provide the total added-up data for up to 20,000 IDs. Note: - It only supports auction basic reports and GMV max ads reports. - It is only valid when one ID dimension and(or) stat_time_day is specified in the dimensions field. Examples: ["campaign_id"], ["campaign_id", "stat_time_day"]. - It can not be used in the sandbox environment.
start_datequerystringNoThis field is required when query_lifetime is false or not specified. Query start date (closed interval) in the format of YYYY-MM-DD. The date is based on the ad account time zone. Note: - When report_type is not set to BC and the value of dimensions does not include stat_time_day, the maximum time range you can specify through start_date and end_date is 365 days. - When report_type is not set to BC and the value of dimensions includes stat_time_day, the maximum time range you can specify through start_date and end_date is 30 days. - When report_type is set to BC, the maximum time range you can specify through start_date and end_date is 365 days.
end_datequerystringNoThis field is required when query_lifetime is false or not specified. Query end date (closed interval) in the format of YYYY-MM-DD. The date is based on the ad account time zone. Note: - When report_type is not set to BC and the value of dimensions does not include stat_time_day, the maximum time range you can specify through start_date and end_date is 365 days. - When report_type is not set to BC and the value of dimensions includes stat_time_day, the maximum time range you can specify through start_date and end_date is 30 days. - When report_type is set to BC, the maximum time range you can specify through start_date and end_date is 365 days.
query_lifetimequerybooleanNoSupported when report_type is BASIC or PLAYABLE_MATERIAL. Whether to request the lifetime metrics. Default value: False. If query_lifetime = True, the start_date and end_date parameters will be ignored. The lifetime metric name is the same as the normal one. Note: - Breakdown by time or audience is not supported when querying for lifetime metrics. - Breakdown by location code (country_code) is not supported when querying for lifetime metrics. - Audience reports, DSA reports, Business Center reports, and GMV max ads reports do not support lifetime metrics.
multi_adv_report_in_utc_timequerybooleanNoSupported when you have used advertiser_ids in your request. Whether to set the returned metrics in the local timezone of each respective advertiser. Default value: false. If it is set to true, the returned metrics will be set to the UTC+0 timezone for all advertisers.
order_fieldquerystringNoSorting field. All supported metrics (excluding attribute metrics) support sorting. Not sorting by default.
order_typequerystringNoSorting order. Enum values: ASC, DESC. Default value: DESC.
filteringqueryobject[]No- Supported when report_type is BASIC, AUDIENCE, PLAYABLE_MATERIAL, CATALOG, or BC. - Not supported when report_type is TT_SHOP. Filtering conditions. Supported filtering conditions vary based on service_type and data_level. Note: - When you pass in filtering, make sure you specify the fields field_name, filter_type, and filter_value at the same time as an object in a list. - If you want to use country_code as your grouping filter, then please specify country_code in the dimensions field of the request. Note that country_code works with basic report (sync and async), audience report (sync and async), playable ad report (sync only), and Business Center report (sync only).
query_modequerystringNoNot supported when report_type is BC. The way data is queried. Enum values: REGULAR, CHUNK. Default value: REGULAR. With CHUNK mode on, data can be returned much faster in a more stable way. Meanwhile, pagination will not be working with CHUNK. Note: - CHUNK mode will be deprecated soon. To ensure a smooth integration, we recommend that you do not use this mode. - CHUNK mode is only supported in synchronous basic reports.
pagequerynumberNoCurrent page number. Default value: 1.
page_sizequerynumberNoPagination size. Value range: 1-1,000. Default value: 10.

Request examples

curl -s "https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/?report_type=&dimensions=%5B%5D&filtering=%5B%7B%7D%5D" \
  -H "Authorization: Bearer $KEY"
Python
import requests

KEY = "q360_live_..."  # khóa API của brand
r = requests.get(
    "https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/",
    params={
        "report_type": "",
        "dimensions": [],
        "filtering": [
            {}
        ]
    },
    headers={"Authorization": f"Bearer {KEY}"},
    timeout=60,
)
print(r.status_code)
print(r.json())
Node.js
const KEY = 'q360_live_...'; // khóa API của brand
const url = new URL('https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/');
for (const [k, v] of Object.entries({"report_type":"","dimensions":[],"filtering":[{}]})) url.searchParams.set(k, typeof v === 'object' ? JSON.stringify(v) : String(v));
const r = await fetch(url, {
  method: 'GET',
  headers: { Authorization: `Bearer ${KEY}` },
});
console.log(r.status, await r.json());
PHP
<?php
$key = 'q360_live_...'; // khóa API của brand
$url = 'https://partner.quantri360.com/v1/tiktok_business/report/integrated/get/' . '?' . http_build_query(['report_type' => '', 'dimensions' => '[]', 'filtering' => '[{}]']);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $key]);
$res = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, "\n", $res;

Response

Response fields (as returned by TikTok Business)

NameTypeSampleDescription
X-Tt-Ads-ThrottlestringA warning message to indicate the request's over limit issue. E. g. When the number of ad ids of queried advertiser account is more than 20,000: `X-Tt-Ads-Throttle:"Number of ad ids is equal or more than 20k, only return the top 20k id's results, sorting by create time desc order."`

Response sample

{
    "code": 0,
    "message": "OK",
    "request_id": "{{request_id}}",
    "data": {
        "page_info": {
            "page": 1,
            "page_size": 1000,
            "total_page": 1,
            "total_number": 2
        },
        "list": [
            {
                "dimensions": {
                    // "ad_id_v2" returns ad level data
                    "ad_id_v2": "{{ad_id_v2}}",
                    "stat_time_day": "2025-12-03 00:00:00"
                },

                "metrics": {
                    // ad ID
                    "ad_id_v2": "{{ad_id_v2}}",
                    // ad name
                    "ad_name": "{{ad_name}}",
                    "impressions": "1079",
                    "spend": "14.68",
                    "campaign_automation_type": "UPGRADED_SMART_PLUS"
                }
            },
            {
                "dimensions": {
                    "ad_id_v2": "{{ad_id_v2}}",
                    "stat_time_day": "2025-12-03 00:00:00"
                },
                "metrics": {
                    "ad_id_v2": "{{ad_id_v2}}",
                    "ad_name": "{{ad_name}}",
                    "impressions": "52",
                    "spend": "0.70",
                    "campaign_automation_type": "UPGRADED_SMART_PLUS"
                }
            }
        ]
    }
}

Get started

  1. Sign up for Partner
  2. Enable a data type of the Ads (Marketing API) group on the platform page
  3. Create an API key (tick the TikTok Business channel)
  4. Call it as in the examples above