late 0.0.1301

API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal. Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema). Request ids: responses carry an X-Request-Id header with the id we log the request under. Quote it when reporting a problem. A valid x-request-id you send is reused as that id.
Documentation
/*
 * Zernio API
 *
 * API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api  Versioning and deprecation: all endpoints are versioned in the URL path (current version: /v1). Breaking changes only ship in a new path version; existing versions keep working. Deprecated operations are marked 'deprecated: true' in this spec and announced in the changelog (https://zernio.com/changelog) before removal.  Errors: every 4xx/5xx response is application/json with a machine-readable 'code' and a human-readable 'error' message (see the ErrorResponse schema).  Request ids: responses carry an X-Request-Id header with the id we log the request under. Quote it when reporting a problem. A valid x-request-id you send is reused as that id.
 *
 * The version of the OpenAPI document: 1.432.1
 * Contact: support@zernio.com
 * Generated by: https://openapi-generator.tech
 */

use crate::models;
use serde::{Deserialize, Serialize};

/// AdTracking : Ad tracking. Meta, plus `urlTags` on ChatGPT (OpenAI) and `pixelId` on Reddit.  **Meta**: attaches pixel measurement to the ad regardless of the optimization goal (the \"Website events\" tracking row in Ads Manager).  - `pixelId` becomes the ad's `tracking_specs` (offsite_conversion + fb_pixel). - `urlTags` is stored on the new creative as `url_tags` and retained on the ad for compatibility. - Applied on the legacy single-creative shape, every ad of the multi-creative shape, and the attach shape. - Tracking lives on the AD object and is not inherited from the ad set, so pass it on EVERY attach call that should carry the pixel.  **ChatGPT (OpenAI)**: `urlTags` becomes the ad's `landing_page_configuration.query_string_template`, which OpenAI appends to `linkUrl` on click.  **Reddit**: `pixelId` picks the pixel of the new ad group, like `promotedObject.pixelId` (which wins when both are sent).
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct AdTracking {
    /// Meta Pixel ID to attach for offsite-conversion measurement, or the Reddit pixel of the new ad group.
    #[serde(rename = "pixelId", skip_serializing_if = "Option::is_none")]
    pub pixel_id: Option<String>,
    /// Click-URL params.  - Meta: stored on the creative as `url_tags` and returned by GET /v1/ads/{adId}/tracking-tags. Dynamic macros ({{ad.id}}, {{campaign.id}}, {{placement}}, ...) are sent through unescaped so Meta expands them; every other character is percent-encoded. App-promotion linkUrl stays byte-identical to promotedObject.objectStoreUrl. - ChatGPT (OpenAI): the same encoding, with OpenAI's macros `{campaign_id}`, `{ad_group_id}`, `{ad_id}` and `{oppref}` (click id) passed through raw. OpenAI expands macros here, not inside `linkUrl`.
    #[serde(rename = "urlTags", skip_serializing_if = "Option::is_none")]
    pub url_tags: Option<Vec<models::UpdateAdTrackingTagsRequestUrlTagsInner>>,
    /// POST /v1/ads/create on Meta and Google only. Opt-in: set `true` and the ad carries `zrn=<platform ad id>` on its landing URL, so orders and events tied to the landing URL map back to the ad.  - **Meta:** `{ key: zrn, value: '{{ad.id}}' }` is appended after your `urlTags`, which are sent unchanged; a `zrn` key you send yourself is kept. Skipped for lead forms, call ads, `existingCreativeId` and app promotion. - **Google (Display and Search):** the ad's `final_url_suffix` is set to `zrn={creative}` only when the ad inherits no suffix from its ad group, campaign or account. Otherwise the ad is left untouched (your suffix keeps applying) and attribution uses the click's `gclid`. - If the inherited suffix cannot be read or Google rejects the tag, the ad is created untagged.  Existing ads are never changed. Omitted or `false` creates the ad with no Zernio tag.
    #[serde(rename = "zernioTag", skip_serializing_if = "Option::is_none")]
    pub zernio_tag: Option<bool>,
}

impl AdTracking {
    /// Ad tracking. Meta, plus `urlTags` on ChatGPT (OpenAI) and `pixelId` on Reddit.  **Meta**: attaches pixel measurement to the ad regardless of the optimization goal (the \"Website events\" tracking row in Ads Manager).  - `pixelId` becomes the ad's `tracking_specs` (offsite_conversion + fb_pixel). - `urlTags` is stored on the new creative as `url_tags` and retained on the ad for compatibility. - Applied on the legacy single-creative shape, every ad of the multi-creative shape, and the attach shape. - Tracking lives on the AD object and is not inherited from the ad set, so pass it on EVERY attach call that should carry the pixel.  **ChatGPT (OpenAI)**: `urlTags` becomes the ad's `landing_page_configuration.query_string_template`, which OpenAI appends to `linkUrl` on click.  **Reddit**: `pixelId` picks the pixel of the new ad group, like `promotedObject.pixelId` (which wins when both are sent).
    pub fn new() -> AdTracking {
        AdTracking {
            pixel_id: None,
            url_tags: None,
            zernio_tag: None,
        }
    }
}