قالبهای CSV
هر فایلی که ادپیکس میخواند یا مینویسد، ستون به ستون — قالب وارد کردن هزینه تبلیغات و رفتار دقیقش با سطر خراب، و شکل هر خروجی CSV از گزارشها تا فهرست مسدودسازی گوگل و متا.
قاعدههای مشترک#
- همه فایلها UTF-8 هستند. جداکننده ویرگول است و نقلقولگذاری استاندارد CSV.
- ستون تاریخ روزانه
YYYY-MM-DDاست. ستون زماندار RFC3339 است، مثل2026-07-30T09:12:44Z. - بعضی خروجیها با BOM شروع میشوند تا اکسل فارسی را درست باز کند؛ در جدول هر خروجی مشخص شده است.
- هر خروجی به دارایی انتخابشده و بازه تاریخ بالای صفحه محدود است و مثل هر خواندن دیگری اختیار میخواهد.
وارد کردن هزینه تبلیغات#
تنها فایلی که ادپیکس میخواند. از «مدیریت» ← «تنظیمات دارایی» ← «وارد کردن هزینه و ROAS»، یا مستقیم:
قالب خالی و یک نمونه واقعی هم آماده است: GET /api/v1/cost-import/template و همان با ?example=1. فایل نمونه دوازده هفته در سه کانال است و بدون هیچ هشداری وارد میشود.
ستونها#
| ستون | الزامی | توضیح |
|---|---|---|
date |
بله | YYYY-MM-DD یا RFC3339. یکشنبه پایان هفته توصیه میشود؛ سطرهای روزانه هم پذیرفته و در مدل به هفته جمع میشوند. |
channel |
بله | نام کانال تبلیغاتی. حداکثر ۲۵۶ کاراکتر. |
cost |
بله | هزینه، عدد اعشاری بدون نماد ارز. جداکننده هزار تحمل میشود. باید بزرگتر یا مساوی صفر باشد. |
source |
خیر | زیرمنبع. حداکثر ۲۵۶ کاراکتر. |
campaign |
خیر | نام کمپین. حداکثر ۲۵۶ کاراکتر. |
currency |
خیر | سه حرفی ISO-4217. نبودش یعنی USD. |
revenue |
خیر | درآمد گزارششده خود پلتفرم تبلیغاتی. فقط برای نمای ROAS گزارششده؛ برازش مدل را عوض نمیکند. |
سرستون بر اساس نام تطبیق داده میشود، پس ترتیب ستونها مهم نیست و ستونهای اضافی نادیده گرفته میشوند. دو نام مستعار پذیرفته است: spend به جای cost و week یا week_ending به جای date.
خطی که با # شروع شود کامنت است و اصلا خوانده نمیشود — به همین دلیل قالب دانلودی با بلوک راهنمای خودش بدون دستکاری دوباره وارد میشود. سطر کاملا خالی هم رد میشود.
اگر ردیف اول سرستون شناختهشدهای نداشته باشد (نه نامی برای تاریخ، نه نامی برای هزینه)، فایل به ترتیب موضعی خوانده میشود:
چه چیزی سطر را رد میکند و چه چیزی فقط هشدار است#
| کد | میدان | نتیجه | معنی |
|---|---|---|---|
missing_date |
date |
سطر رد میشود | تاریخ خالی است |
invalid_date |
date |
سطر رد میشود | نه YYYY-MM-DD است نه RFC3339 |
missing_channel |
channel |
سطر رد میشود | کانال خالی است |
field_too_long |
channel |
سطر رد میشود | بیش از ۲۵۶ کاراکتر |
invalid_cost |
cost |
سطر رد میشود | عدد نیست |
negative_cost |
cost |
سطر رد میشود | کوچکتر از صفر |
future_date |
date |
سطر وارد میشود | تاریخ در آینده است |
invalid_currency |
currency |
سطر وارد میشود | سه حرفی نیست؛ ارز پیشفرض به کار میرود |
invalid_revenue |
revenue |
سطر وارد میشود | عدد نامنفی نیست؛ درآمد نادیده گرفته میشود |
unknown_channel |
channel |
سطر وارد میشود | کانال نه پلتفرم شناختهشده است و نه در نگاشت کانال؛ مدل آن را در خانواده other میگذارد |
واردات یک تراکنش است، ولی سطرهای خراب داخل همان تراکنش فقط شمرده و گزارش میشوند. فقط خطای تجزیه فایل، عبور از سقف اندازه یا خطای پایگاه داده کل تراکنش را برمیگرداند و هیچ سطری نوشته نمیشود.
پاسخ، گزارش ساختاریافته کامل است:
line شماره رکورد از دید تجزیهکننده است: خطهای کامنت اصلا شمرده نمیشوند و سرستون خط شماره یک است. هر دو فهرست خطا و هشدار در هزار عضو بریده میشوند تا یک فایل زباله پاسخ را باد نکند.
بهروزرسانی به جای تکرار#
کلید یکتایی ترکیب دارایی، تاریخ، کانال، منبع و کمپین است. ورود دوباره همان ترکیب، مقدارهای cost و currency و revenue را در جای خودش بهروز میکند؛ سطر تکراری ساخته نمیشود. اگر همین ترکیب دو بار در یک فایل بیاید، آخرین سطر برنده است.
سقف اندازه#
| مسیر | سقف | رفتار |
|---|---|---|
POST /api/v1/cost-import |
۸ مگابایت | بیشتر از آن 413 — از مسیر ناهمگام استفاده کنید |
POST /api/v1/cost-import/async |
۶۴ مگابایت | فایل در صف مینشیند و پاسخ {import_id, status:"queued"} است |
GET /api/v1/cost-import/jobs/{id} |
— | وضعیت و پیشرفت همان کار |
فایل خالی پاسخ 400 میگیرد. مهلت واردات همگام پنج دقیقه و ناهمگام سی دقیقه است.
همین اعتبارسنجی یک مسیر JSON هم دارد: همان اندپوینت با {"rows":[…]} و همان کلیدهای ستون. رفتارش با مسیر CSV یکسان است.
خروجی گزارشها#
خروجی عمومی#
<report> یکی از channels، sources، geo، tech، overview و users است؛ نام دیگری 404 میگیرد. هر گزارش حداکثر ۵۰۰۰ سطر برمیگرداند.
سرستون این خروجیها از کلیدهای نتیجه پرسوجو ساخته میشود و ترتیبش بین دو اجرا میتواند فرق کند. اگر روی این فایلها اسکریپت مینویسید، ستونها را با نام سرستون پیدا کنید، نه با شماره.
users استثناست و از پایگاه تراکنشی خوانده میشود، با ستونهای ثابت و حداکثر ۵۰۰۰۰ سطر:
خروجی پیشرفته کانالها#
این یکی قالب کاملی دارد: BOM، یک بلوک فراداده با #، سرستونهای خوانا و یک سطر جمع در پایان.
با ?format=json همان داده بههمراه metadata، columns و totals به شکل JSON برمیگردد.
رویدادهای خام#
فایل raw-events.csv با شانزده ستون ثابت:
این خروجی داده در سطح تکرویداد است و پشت محدودیت «داده خام» عضویت قرار دارد.
سند رضایت#
فایل consent-records.csv، حداکثر ۵۰۰۰۰ رکورد:
accepted و rejected فهرست دستهها با فاصلهاند، مثل necessary statistics. آدرس IP در این فایل نیست — فقط شکل درهمسازیشدهاش ذخیره میشود و صادر نمیگردد.
خروجی مدلهای بازاریابی#
مارکتینگ میکس#
فایل mmm-<هشت کاراکتر اول شناسه>.csv با BOM. اول یک بلوک خلاصه به شکل کلید و مقدار، بعد یک سطر خالی، بعد جدول کانالها:
اعداد با چهار رقم اعشار نوشته میشوند و مقدار نامعلوم سلول خالی میماند.
لیفت#
فایل lift-<هشت کاراکتر اول شناسه>.csv. چند سطر خلاصه کلید و مقدار، یک سطر خالی، و بعد سری روزانه:
اعداد با دو رقم اعشار نوشته میشوند.
اگر روی عضویت شما محدودیت داده هزینه فعال باشد، ستونهای roi، roi_lo، roi_hi، mroi و cpa در مارکتینگ میکس و spend_window، incremental_roas و cpa در لیفت اصلا در سرستون نمیآیند. فایلی که به دست شما میرسد ستون کمتری دارد، نه ستون خالی — پس اسکریپتتان باید وجود ستون را بررسی کند.
خروجی محافظت در برابر تقلب#
پرونده اعتراض یک موجودیت#
فایل integrity-<موجودیت>.csv با BOM و بلوک فراداده #. ساختارش سه بلوک پشت سر هم است، جدا شده با سطر خالی: خلاصه به شکل Field,Value، بعد فهرست Reasons، بعد جدول Detector,Score.
ادعای بازپرداخت#
فایل adpix-fraud-refund-claim.csv — همان چیزی که به پلتفرم تبلیغاتی میدهید:
reasons با ; و sample_ips با فاصله جدا میشوند. estimated_wasted با دو رقم اعشار است. evidence_hash و chain_verified از دفتر شواهد زنجیرهای میآیند و همان چیزی هستند که ادعا را قابل راستیآزمایی میکنند.
فهرستهای مسدودسازی#
سه خروجی، برای سه مقصد متفاوت. هر سه فقط شبکههایی را میآورند که در بازه انتخابشده «تاییدشده» یا «محتمل» علامت خوردهاند.
| مسیر | فایل | ستونها |
|---|---|---|
/api/v1/integrity/blocklist/google.csv |
adpix-google-ads-ip-exclusions.csv |
یک ستون: IP address |
/api/v1/integrity/blocklist.csv |
adpix-blocklist.csv |
cidr,wildcard,asn,asn_org,network_type,hits |
/api/v1/integrity/blocklist/meta.csv |
adpix-meta-network-advisory.csv |
asn,asn_org,network_type,channel,severity,flagged_sessions,recommendation |
فایل گوگل دقیقا قالبی است که «حذف آدرس IP» در گوگل ادز میپذیرد: هر سطر یک a.b.c.*، پرترافیکترینها اول، و حداکثر ۵۰۰ سطر — چون خود گوگل ادز بیشتر از ۵۰۰ حذف در هر کمپین نمیپذیرد. اگر شبکههای علامتخورده بیشتر از این باشند، هدر پاسخ X-AdPix-Blocklist-Truncated تعداد جامانده را میگوید.
فایل عمومی برای فایروال، Cloudflare یا CDN است و بهجای فقط IP، شبکه و شماره سیستم خودگردان را هم میآورد. سقفش با ?cap= تنظیم میشود، پیشفرض ۱۰۰۰ و بین ۱ تا ۵۰۰۰ محدود میشود.
فایل متا فهرست IP نیست: متا حذف IP ندارد، پس این خروجی در سطح شبکه توصیه میدهد — همان چیزی که با کنترلهای جایگاه و مخاطب، یا با فیلتر سمت سرور روی Conversions API اعمال میکنید. ستون recommendation همین را در هر سطر تکرار میکند.
غیر از این سه فایل، یک مسیر «فشاری» هم هست که همان فهرست را به یک سامانه بیرونی میفرستد. آن مسیر یک مقصد وبهوک با بدنه JSON است، نه CSV. فایلهای این بخش مسیر «کششی» هستند: خودتان میگیرید و آپلود میکنید.
قالبهای دانلودی#
| فایل | از کجا |
|---|---|
adpix_cost_template.csv |
GET /api/v1/cost-import/template — بلوک راهنما، سرستون و یک سطر نمونه |
adpix_cost_example.csv |
همان با ?example=1 — دوازده هفته در سه کانال، بدون هشدار |
قالب خالی را میشود بدون هیچ ویرایشی دوباره وارد کرد؛ بلوک راهنمایش با # شروع میشود و تجزیهکننده آن را نمیبیند.
پرسشهای پرتکرار#
یک سطر خراب کل فایل هزینه را رد میکند؟
خیر. سطر خراب کنار گذاشته میشود، بقیه سطرها وارد میشوند، و پاسخ فهرستی از شماره خط، نام میدان، کد خطا و پیام برمیگرداند. فقط خطای تجزیه فایل یا خطای پایگاه داده کل تراکنش را برمیگرداند.
اگر همان فایل را دوباره وارد کنم، هزینهها دو برابر میشوند؟
خیر. کلید یکتایی ترکیب دارایی، تاریخ، کانال، منبع و کمپین است و ورود دوباره همان ترکیب، مقدار هزینه و ارز و درآمد را در جای خودش بهروز میکند. برای اصلاح یک هفته، فایل اصلاحشده همان هفته را دوباره بفرستید.
چرا ترتیب ستونهای خروجی گزارش هر بار فرق میکند؟
خروجیهای عمومی /api/v1/export/<report>.csv ستونهایشان را از نتیجه پرسوجو میسازند و ترتیبشان تضمینشده نیست. همیشه بر اساس نام سرستون بخوانید، نه شماره ستون. خروجیهای اختصاصی — کانالها، مارکتینگ میکس، لیفت، تقلب، رضایت — ستونهای ثابت دارند.
چرا ستون هزینه در خروجی مارکتینگ میکس اصلا وجود ندارد؟
چون محدودیت داده هزینه روی عضویت شما فعال است. این ستونها خالی نمیشوند، اصلا در سرستون نمیآیند — تا فایلی که دست به دست میشود ستون خالی مشکوک نداشته باشد. همین قاعده برای هزینه و ROAS در خروجی لیفت هم هست.
ممنون — بازخورد شما به بهتر شدن مستندات کمک میکند.