/*
* 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
}
}