{
  "info": {
    "_postman_id": "475f284e-98d2-4474-8e16-d7372523b7b3",
    "name": "Ads Sandbox (Meta / TikTok / Google Ads)",
    "description": "Bo request mau cho sandbox mo phong 3 API quang cao. Dien token vao Variables cua collection (mac dinh de trong), dat start_date/end_date, roi chay lan luot tu tren xuong trong moi folder. Base URL mac dinh la production; doi sang http://127.0.0.1:8001/8002/8003 khi chay server local.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Meta",
      "description": "Graph API v21.0. Auth: query param access_token.",
      "item": [
        {
          "name": "List ad accounts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{meta_base_url}}/v21.0/me/adaccounts?fields=id,account_id,name,currency,timezone_name,account_status&limit=100&access_token={{meta_access_token}}",
              "host": [
                "{{meta_base_url}}"
              ],
              "path": [
                "v21.0",
                "me",
                "adaccounts"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "id,account_id,name,currency,timezone_name,account_status"
                },
                {
                  "key": "limit",
                  "value": "100"
                },
                {
                  "key": "access_token",
                  "value": "{{meta_access_token}}"
                }
              ]
            },
            "description": "Tai khoan quang cao ma token nay duoc phep xem. Copy `account_id` (khong co tien to act_) vao bien `meta_account_id`."
          },
          "response": []
        },
        {
          "name": "Campaigns",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{meta_base_url}}/v21.0/act_{{meta_account_id}}/campaigns?fields=id,name,objective,status,effective_status,daily_budget,start_time,stop_time,created_time&limit=100&access_token={{meta_access_token}}",
              "host": [
                "{{meta_base_url}}"
              ],
              "path": [
                "v21.0",
                "act_{{meta_account_id}}",
                "campaigns"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "id,name,objective,status,effective_status,daily_budget,start_time,stop_time,created_time"
                },
                {
                  "key": "limit",
                  "value": "100"
                },
                {
                  "key": "access_token",
                  "value": "{{meta_access_token}}"
                }
              ]
            },
            "description": "Theo doi `paging.next` neu co nhieu hon `limit` dong."
          },
          "response": []
        },
        {
          "name": "Ad sets",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{meta_base_url}}/v21.0/act_{{meta_account_id}}/adsets?fields=id,name,campaign_id,status,effective_status,optimization_goal,targeting,promoted_object,start_time,end_time&limit=100&access_token={{meta_access_token}}",
              "host": [
                "{{meta_base_url}}"
              ],
              "path": [
                "v21.0",
                "act_{{meta_account_id}}",
                "adsets"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "id,name,campaign_id,status,effective_status,optimization_goal,targeting,promoted_object,start_time,end_time"
                },
                {
                  "key": "limit",
                  "value": "100"
                },
                {
                  "key": "access_token",
                  "value": "{{meta_access_token}}"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Ads",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{meta_base_url}}/v21.0/act_{{meta_account_id}}/ads?fields=id,name,adset_id,campaign_id,status,effective_status,creative{id,name,object_type},created_time&limit=100&access_token={{meta_access_token}}",
              "host": [
                "{{meta_base_url}}"
              ],
              "path": [
                "v21.0",
                "act_{{meta_account_id}}",
                "ads"
              ],
              "query": [
                {
                  "key": "fields",
                  "value": "id,name,adset_id,campaign_id,status,effective_status,creative{id,name,object_type},created_time"
                },
                {
                  "key": "limit",
                  "value": "100"
                },
                {
                  "key": "access_token",
                  "value": "{{meta_access_token}}"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Insights (level=ad, daily, country breakdown)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{meta_base_url}}/v21.0/act_{{meta_account_id}}/insights?level=ad&fields=campaign_id,campaign_name,adset_id,adset_name,ad_id,ad_name,spend,impressions,clicks,actions,action_values&time_range={\"since\":\"{{start_date}}\",\"until\":\"{{end_date}}\"}&time_increment=1&breakdowns=country&limit=500&access_token={{meta_access_token}}",
              "host": [
                "{{meta_base_url}}"
              ],
              "path": [
                "v21.0",
                "act_{{meta_account_id}}",
                "insights"
              ],
              "query": [
                {
                  "key": "level",
                  "value": "ad"
                },
                {
                  "key": "fields",
                  "value": "campaign_id,campaign_name,adset_id,adset_name,ad_id,ad_name,spend,impressions,clicks,actions,action_values"
                },
                {
                  "key": "time_range",
                  "value": "{\"since\":\"{{start_date}}\",\"until\":\"{{end_date}}\"}"
                },
                {
                  "key": "time_increment",
                  "value": "1"
                },
                {
                  "key": "breakdowns",
                  "value": "country"
                },
                {
                  "key": "limit",
                  "value": "500"
                },
                {
                  "key": "access_token",
                  "value": "{{meta_access_token}}"
                }
              ]
            },
            "description": "Moi dong = 1 ad x 1 ngay x 1 quoc gia. Metrics la chuoi. installs = actions[mobile_app_install]; purchases = actions[app_custom_event.fb_mobile_purchase] (omni_purchase lap lai cung gia tri, khong cong don); gia tri mua = action_values[app_custom_event.fb_mobile_purchase]. Theo doi paging.next. Rate limit: HTTP 400 voi error.code=17."
          },
          "response": []
        }
      ]
    },
    {
      "name": "TikTok",
      "description": "Marketing API v1.3. Auth: header Access-Token. Loi tra HTTP 200 voi code != 0.",
      "item": [
        {
          "name": "Advertisers (oauth2/advertiser/get)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/oauth2/advertiser/get/",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "oauth2",
                "advertiser",
                "get"
              ]
            },
            "description": "Luon kiem tra `code == 0` trong body: TikTok tra HTTP 200 ngay ca khi loi. Copy `advertiser_id` vao bien `tiktok_advertiser_id`."
          },
          "response": []
        },
        {
          "name": "campaign/get",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/campaign/get/?advertiser_id={{tiktok_advertiser_id}}&page=1&page_size=100",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "campaign",
                "get"
              ],
              "query": [
                {
                  "key": "advertiser_id",
                  "value": "{{tiktok_advertiser_id}}"
                },
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "page_size",
                  "value": "100"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "adgroup/get",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/adgroup/get/?advertiser_id={{tiktok_advertiser_id}}&page=1&page_size=100",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "adgroup",
                "get"
              ],
              "query": [
                {
                  "key": "advertiser_id",
                  "value": "{{tiktok_advertiser_id}}"
                },
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "page_size",
                  "value": "100"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "ad/get",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/ad/get/?advertiser_id={{tiktok_advertiser_id}}&page=1&page_size=100",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "ad",
                "get"
              ],
              "query": [
                {
                  "key": "advertiser_id",
                  "value": "{{tiktok_advertiser_id}}"
                },
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "page_size",
                  "value": "100"
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "report/integrated/get (AUCTION_AD, daily, country)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/report/integrated/get/?advertiser_id={{tiktok_advertiser_id}}&report_type=BASIC&service_type=AUCTION&data_level=AUCTION_AD&dimensions=[\"ad_id\",\"stat_time_day\",\"country_code\"]&metrics=[\"campaign_id\",\"campaign_name\",\"adgroup_id\",\"adgroup_name\",\"ad_name\",\"spend\",\"impressions\",\"clicks\",\"conversion\",\"purchase\",\"total_purchase_value\"]&start_date={{start_date}}&end_date={{end_date}}&page=1&page_size=1000",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "report",
                "integrated",
                "get"
              ],
              "query": [
                {
                  "key": "advertiser_id",
                  "value": "{{tiktok_advertiser_id}}"
                },
                {
                  "key": "report_type",
                  "value": "BASIC"
                },
                {
                  "key": "service_type",
                  "value": "AUCTION"
                },
                {
                  "key": "data_level",
                  "value": "AUCTION_AD"
                },
                {
                  "key": "dimensions",
                  "value": "[\"ad_id\",\"stat_time_day\",\"country_code\"]"
                },
                {
                  "key": "metrics",
                  "value": "[\"campaign_id\",\"campaign_name\",\"adgroup_id\",\"adgroup_name\",\"ad_name\",\"spend\",\"impressions\",\"clicks\",\"conversion\",\"purchase\",\"total_purchase_value\"]"
                },
                {
                  "key": "start_date",
                  "value": "{{start_date}}"
                },
                {
                  "key": "end_date",
                  "value": "{{end_date}}"
                },
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "page_size",
                  "value": "1000"
                }
              ]
            },
            "description": "dimensions/metrics la JSON list. Lap page cho den khi page >= page_info.total_page. stat_time_day co dang 'YYYY-MM-DD 00:00:00'. Rate limit: body code=40100 (HTTP 200)."
          },
          "response": []
        },
        {
          "name": "tool/region/get",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/tool/region/get/",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "tool",
                "region",
                "get"
              ]
            },
            "description": "Danh sach location_id <-> region_code (ma quoc gia) de giai ma `location_ids` cua adgroup."
          },
          "response": []
        },
        {
          "name": "app/list",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Access-Token",
                "value": "{{tiktok_access_token}}"
              }
            ],
            "url": {
              "raw": "{{tiktok_base_url}}/open_api/v1.3/app/list/?advertiser_id={{tiktok_advertiser_id}}",
              "host": [
                "{{tiktok_base_url}}"
              ],
              "path": [
                "open_api",
                "v1.3",
                "app",
                "list"
              ],
              "query": [
                {
                  "key": "advertiser_id",
                  "value": "{{tiktok_advertiser_id}}"
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Google",
      "description": "Google Ads API v18 REST. Auth: Bearer + developer-token + login-customer-id.",
      "item": [
        {
          "name": "listAccessibleCustomers",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{google_access_token}}"
              },
              {
                "key": "developer-token",
                "value": "{{google_developer_token}}"
              },
              {
                "key": "login-customer-id",
                "value": "{{login_customer_id}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{google_base_url}}/v18/customers:listAccessibleCustomers",
              "host": [
                "{{google_base_url}}"
              ],
              "path": [
                "v18",
                "customers:listAccessibleCustomers"
              ]
            },
            "description": "Tra ve resourceNames dang customers/<id>. Copy <id> vao bien `google_customer_id`. Can ca Authorization Bearer, developer-token va login-customer-id (MCC)."
          },
          "response": []
        },
        {
          "name": "searchStream: campaigns",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{google_access_token}}"
              },
              {
                "key": "developer-token",
                "value": "{{google_developer_token}}"
              },
              {
                "key": "login-customer-id",
                "value": "{{login_customer_id}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{google_base_url}}/v18/customers/{{google_customer_id}}/googleAds:searchStream",
              "host": [
                "{{google_base_url}}"
              ],
              "path": [
                "v18",
                "customers",
                "{{google_customer_id}}",
                "googleAds:searchStream"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"query\": \"SELECT campaign.id, campaign.name, campaign.status, campaign.start_date, campaign.end_date, campaign.app_campaign_setting.app_id, campaign.bidding_strategy_type, campaign_budget.amount_micros FROM campaign\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "searchStream tra ve MANG cac batch, moi batch co `results`. Ket qua camelCase, int64 la chuoi."
          },
          "response": []
        },
        {
          "name": "searchStream: daily ad report (ad x date x country)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{google_access_token}}"
              },
              {
                "key": "developer-token",
                "value": "{{google_developer_token}}"
              },
              {
                "key": "login-customer-id",
                "value": "{{login_customer_id}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{google_base_url}}/v18/customers/{{google_customer_id}}/googleAds:searchStream",
              "host": [
                "{{google_base_url}}"
              ],
              "path": [
                "v18",
                "customers",
                "{{google_customer_id}}",
                "googleAds:searchStream"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"query\": \"SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_ad.ad.id, ad_group_ad.ad.name, segments.date, segments.geo_target_country, metrics.cost_micros, metrics.impressions, metrics.clicks, metrics.conversions, metrics.all_conversions, metrics.conversions_value FROM ad_group_ad WHERE segments.date BETWEEN '{{start_date}}' AND '{{end_date}}'\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "spend = costMicros/1e6; installs = conversions; purchases = allConversions - conversions; gia tri mua = conversionsValue. segments.geoTargetCountry la 'geoTargetConstants/<id>' -> tra bang geo_target_constant. Rate limit: HTTP 429 + header Retry-After."
          },
          "response": []
        },
        {
          "name": "search with pageSize (pageToken paging)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{google_access_token}}"
              },
              {
                "key": "developer-token",
                "value": "{{google_developer_token}}"
              },
              {
                "key": "login-customer-id",
                "value": "{{login_customer_id}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{google_base_url}}/v18/customers/{{google_customer_id}}/googleAds:search",
              "host": [
                "{{google_base_url}}"
              ],
              "path": [
                "v18",
                "customers",
                "{{google_customer_id}}",
                "googleAds:search"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"query\": \"SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_ad.ad.id, ad_group_ad.ad.name, segments.date, segments.geo_target_country, metrics.cost_micros, metrics.impressions, metrics.clicks, metrics.conversions, metrics.all_conversions, metrics.conversions_value FROM ad_group_ad WHERE segments.date BETWEEN '{{start_date}}' AND '{{end_date}}'\",\n  \"pageSize\": 500,\n  \"returnTotalResultsCount\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Phien ban phan trang: lap lai voi `pageToken` = `nextPageToken` cua response truoc cho den khi khong con."
          },
          "response": []
        },
        {
          "name": "geo_target_constant (country code lookup)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{google_access_token}}"
              },
              {
                "key": "developer-token",
                "value": "{{google_developer_token}}"
              },
              {
                "key": "login-customer-id",
                "value": "{{login_customer_id}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{google_base_url}}/v18/customers/{{google_customer_id}}/googleAds:searchStream",
              "host": [
                "{{google_base_url}}"
              ],
              "path": [
                "v18",
                "customers",
                "{{google_customer_id}}",
                "googleAds:searchStream"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"query\": \"SELECT geo_target_constant.id, geo_target_constant.name, geo_target_constant.country_code, geo_target_constant.target_type FROM geo_target_constant\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Map geoTargetConstants/<id> -> ma quoc gia ISO (vi du 2840 -> US). Chi can goi mot lan."
          },
          "response": []
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "meta_base_url",
      "value": "https://graph.huydata.com"
    },
    {
      "key": "tiktok_base_url",
      "value": "https://business-api.huydata.com"
    },
    {
      "key": "google_base_url",
      "value": "https://googleads.huydata.com"
    },
    {
      "key": "meta_access_token",
      "value": ""
    },
    {
      "key": "tiktok_access_token",
      "value": ""
    },
    {
      "key": "google_access_token",
      "value": ""
    },
    {
      "key": "google_developer_token",
      "value": ""
    },
    {
      "key": "login_customer_id",
      "value": "9990001111"
    },
    {
      "key": "meta_account_id",
      "value": ""
    },
    {
      "key": "tiktok_advertiser_id",
      "value": ""
    },
    {
      "key": "google_customer_id",
      "value": ""
    },
    {
      "key": "start_date",
      "value": "2026-10-01"
    },
    {
      "key": "end_date",
      "value": "2026-10-07"
    }
  ]
}
