late 0.0.1055

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.104.0
 * Contact: support@zernio.com
 * Generated by: https://openapi-generator.tech
 */

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

/// UploadedOrDerivedAudience : customer_list, website, or lookalike audience (uploaded or derived from a source).
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct UploadedOrDerivedAudience {
    #[serde(rename = "accountId")]
    pub account_id: String,
    /// Platform ad account ID. Must start with act_ for Meta; bare platform id for others (Google customer id, X/TikTok/LinkedIn/Pinterest account id).
    #[serde(rename = "adAccountId")]
    pub ad_account_id: String,
    #[serde(rename = "name")]
    pub name: String,
    #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(rename = "type")]
    pub r#type: Type,
    /// Required for website_retargeting audiences (LinkedIn only). Each rule is a URL pattern; a member who visits any matching page enters the segment. Needs the LinkedIn Insight Tag installed on the customer's site; the segment only starts filling once the tag reports visits.  The response's `platformAudienceId` is the LinkedIn adSegment id, valid for downstream use. These segments appear in GET /v1/ads/audiences with  `type: website_retargeting` once LinkedIn has finished building them.
    #[serde(rename = "matchRules", skip_serializing_if = "Option::is_none")]
    pub match_rules: Option<Vec<models::UploadedOrDerivedAudienceMatchRulesInner>>,
    /// Required for engagement audiences (LinkedIn only): what members engaged with: a video/leadgen/single-image ad campaign, a Company Page or an Event page.
    #[serde(rename = "sourceType", skip_serializing_if = "Option::is_none")]
    pub source_type: Option<SourceType>,
    /// Required for engagement audiences. The action, validated by LinkedIn against `sourceType`. Common values: VIDEO_ADS FIRST_QUARTILE / MIDPOINT / THIRD_QUARTILE / FULL_COMPLETE; LEAD_GEN_FORMS VIEW_FORM / LEAD_FORM_SUBMIT; ORGANIZATION_PAGES VIEW / CTA_CLICK; EVENT_PAGES RSVPED / VIDEO_VIEWED / ENGAGEMENT / CLICK.
    #[serde(rename = "trigger", skip_serializing_if = "Option::is_none")]
    pub trigger: Option<String>,
    /// Required for engagement audiences. Rolling window.
    #[serde(rename = "lookbackDays", skip_serializing_if = "Option::is_none")]
    pub lookback_days: Option<LookbackDays>,
    /// Required for engagement audiences. Campaign URNs for the ad source types, organization URNs for pages and events. LinkedIn creates one rule per source, all sharing the same trigger and lookbackDays.
    #[serde(rename = "engagementSources", skip_serializing_if = "Option::is_none")]
    pub engagement_sources: Option<Vec<String>>,
    /// Required for company_list audiences (LinkedIn only): plain-text company rows for account targeting. Each row needs at least one identifier. Not hashed, LinkedIn matches these against its own company graph. LinkedIn recommends 1,000+ companies for a usable match rate and takes up to 48h to process the list. Replace the list later with POST /v1/ads/audiences/{audienceId}/companies.
    #[serde(rename = "companies", skip_serializing_if = "Option::is_none")]
    pub companies: Option<Vec<models::UploadedOrDerivedAudienceCompaniesInner>>,
    /// Required for website audiences
    #[serde(rename = "pixelId", skip_serializing_if = "Option::is_none")]
    pub pixel_id: Option<String>,
    /// Required for website (max 180) and meta_engagement (max 365) audiences.
    #[serde(rename = "retentionDays", skip_serializing_if = "Option::is_none")]
    pub retention_days: Option<i32>,
    /// Required for meta_engagement audiences (Meta only): what people engaged with. `page` = a Facebook Page, `instagram` = an IG professional account, `video` = a video.
    #[serde(rename = "engagementSource", skip_serializing_if = "Option::is_none")]
    pub engagement_source: Option<EngagementSource>,
    /// Required for meta_engagement: the Page / IG account / video id.
    #[serde(rename = "sourceId", skip_serializing_if = "Option::is_none")]
    pub source_id: Option<String>,
    /// meta_engagement only. The engagement event; defaults per source (page → page_engaged, instagram → ig_business_profile_all, video → video_watched). Ignored when `rule` is provided.
    #[serde(rename = "event", skip_serializing_if = "Option::is_none")]
    pub event: Option<String>,
    /// Required for lookalike audiences
    #[serde(rename = "sourceAudienceId", skip_serializing_if = "Option::is_none")]
    pub source_audience_id: Option<String>,
    /// 2-letter code, required for lookalike audiences
    #[serde(rename = "country", skip_serializing_if = "Option::is_none")]
    pub country: Option<String>,
    /// Required for lookalike audiences
    #[serde(rename = "ratio", skip_serializing_if = "Option::is_none")]
    pub ratio: Option<f64>,
    /// website only. Narrows the audience from all visitors to visitors of URLs containing this substring. Ignored when `rule` is supplied.
    #[serde(rename = "urlContains", skip_serializing_if = "Option::is_none")]
    pub url_contains: Option<String>,
    /// Optional raw Meta rule, replacing the one we build. Omit it for all visitors of `pixelId`, or use `urlContains` for the common page-match case.  For `website` this is Meta's Flexible Audience Rule and is VALIDATED before we call Meta: every entry in `inclusions.rules` (and `exclusions.rules`) must carry `event_sources`, `retention_seconds` AND `filter`. Meta rejects a rule missing any of the three with code 100 / subcode 1713098 (\"Invalid rule JSON format\"), so a bad shape is a 400 here instead. The pre-2018 flat shapes (`{url: ...}`, `{event: ...}`) are not accepted by Meta at all (subcode 1870029).  Example, visitors of /checkout in the last 30 days: `{\"inclusions\":{\"operator\":\"or\",\"rules\":[{\"event_sources\":[{\"id\":\"<pixelId>\",\"type\":\"pixel\"}],\"retention_seconds\":2592000,\"filter\":{\"operator\":\"and\",\"filters\":[{\"field\":\"url\",\"operator\":\"i_contains\",\"value\":\"/checkout\"}]}}]}}`  Note Meta DERIVES `retention_days` from `retention_seconds` and stores `event_sources[].id` as a number, so a rule read back will not be byte-identical to the one you sent.  For `meta_engagement` the rule is forwarded verbatim and NOT validated: that type has two dialects (the `video` source uses a legacy flat array), so no single schema covers both.
    #[serde(rename = "rule", skip_serializing_if = "Option::is_none")]
    pub rule: Option<serde_json::Value>,
    /// Data source declaration for GDPR compliance (customer_list only)
    #[serde(rename = "customerFileSource", skip_serializing_if = "Option::is_none")]
    pub customer_file_source: Option<String>,
}

impl UploadedOrDerivedAudience {
    /// customer_list, website, or lookalike audience (uploaded or derived from a source).
    pub fn new(
        account_id: String,
        ad_account_id: String,
        name: String,
        r#type: Type,
    ) -> UploadedOrDerivedAudience {
        UploadedOrDerivedAudience {
            account_id,
            ad_account_id,
            name,
            description: None,
            r#type,
            match_rules: None,
            source_type: None,
            trigger: None,
            lookback_days: None,
            engagement_sources: None,
            companies: None,
            pixel_id: None,
            retention_days: None,
            engagement_source: None,
            source_id: None,
            event: None,
            source_audience_id: None,
            country: None,
            ratio: None,
            url_contains: None,
            rule: None,
            customer_file_source: None,
        }
    }
}
///
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum Type {
    #[serde(rename = "customer_list")]
    CustomerList,
    #[serde(rename = "company_list")]
    CompanyList,
    #[serde(rename = "engagement")]
    Engagement,
    #[serde(rename = "meta_engagement")]
    MetaEngagement,
    #[serde(rename = "website")]
    Website,
    #[serde(rename = "website_retargeting")]
    WebsiteRetargeting,
    #[serde(rename = "lookalike")]
    Lookalike,
}

impl Default for Type {
    fn default() -> Type {
        Self::CustomerList
    }
}
/// Required for engagement audiences (LinkedIn only): what members engaged with: a video/leadgen/single-image ad campaign, a Company Page or an Event page.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum SourceType {
    #[serde(rename = "VIDEO_ADS")]
    VideoAds,
    #[serde(rename = "LEAD_GEN_FORMS")]
    LeadGenForms,
    #[serde(rename = "ORGANIZATION_PAGES")]
    OrganizationPages,
    #[serde(rename = "EVENT_PAGES")]
    EventPages,
    #[serde(rename = "SINGLE_IMAGE_ADS")]
    SingleImageAds,
}

impl Default for SourceType {
    fn default() -> SourceType {
        Self::VideoAds
    }
}
/// Required for engagement audiences. Rolling window.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum LookbackDays {
    #[serde(rename = "30")]
    Variant30,
    #[serde(rename = "60")]
    Variant60,
    #[serde(rename = "90")]
    Variant90,
    #[serde(rename = "180")]
    Variant180,
    #[serde(rename = "365")]
    Variant365,
}

impl Default for LookbackDays {
    fn default() -> LookbackDays {
        Self::Variant30
    }
}
/// Required for meta_engagement audiences (Meta only): what people engaged with. `page` = a Facebook Page, `instagram` = an IG professional account, `video` = a video.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum EngagementSource {
    #[serde(rename = "page")]
    Page,
    #[serde(rename = "instagram")]
    Instagram,
    #[serde(rename = "video")]
    Video,
}

impl Default for EngagementSource {
    fn default() -> EngagementSource {
        Self::Page
    }
}