late-sdk 0.0.871 → 0.0.873
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +17 -8
- data/docs/AccountGroupsApi.md +1 -1
- data/docs/AccountWithFollowerStatsAllOfAccountStats.md +2 -2
- data/docs/AccountsApi.md +5 -5
- data/docs/Ad.md +4 -4
- data/docs/AdAccountsApi.md +9 -9
- data/docs/AdAudiencesApi.md +4 -4
- data/docs/AdCampaignsApi.md +46 -46
- data/docs/AdCreative.md +6 -6
- data/docs/AdCreativesApi.md +12 -12
- data/docs/AdDailyMetrics.md +4 -4
- data/docs/AdFunnelCounts.md +3 -3
- data/docs/AdInsightsApi.md +3 -3
- data/docs/AdKeyword.md +1 -1
- data/docs/AdLibraryApi.md +2 -2
- data/docs/AdMetrics.md +4 -4
- data/docs/AdTargetingApi.md +5 -5
- data/docs/AdTreeAdSet.md +1 -1
- data/docs/AdTreeCampaign.md +4 -4
- data/docs/AddAdKeywordsRequest.md +1 -1
- data/docs/AddMessageReactionRequest.md +1 -1
- data/docs/AdjustConversionsRequestAdjustmentsInner.md +4 -4
- data/docs/AdsTimelineResponseRowsInner.md +1 -1
- data/docs/AnalyticsApi.md +22 -22
- data/docs/AnalyticsDeltaEntry.md +1 -1
- data/docs/AnalyticsListResponse.md +1 -1
- data/docs/ApiKey.md +1 -1
- data/docs/AppealSmsRegistrationRequest.md +1 -1
- data/docs/AssignGoogleBusinessLocation200ResponseAccount.md +1 -1
- data/docs/AssignGoogleBusinessLocationRequest.md +2 -2
- data/docs/AttachCampaignAssetsRequest.md +2 -2
- data/docs/BillingSnapshotPlan.md +1 -1
- data/docs/BlockWhatsAppUsersRequest.md +1 -1
- data/docs/BookmarkPostRequest.md +1 -1
- data/docs/BoostPostRequest.md +5 -5
- data/docs/BusinessCenter.md +1 -1
- data/docs/CallRecord.md +2 -2
- data/docs/CampaignAnalyticsResponseAnalyticsDailyInner.md +4 -4
- data/docs/CheckPhoneNumberAvailability200Response.md +1 -1
- data/docs/CheckPhoneNumberPortability200ResponseResultsInner.md +2 -2
- data/docs/CommentsApi.md +11 -11
- data/docs/ConnectApi.md +102 -35
- data/docs/ConnectWhatsAppEmbeddedSignupRequest.md +4 -4
- data/docs/Conversation.md +34 -0
- data/docs/ConversionEvent.md +1 -1
- data/docs/ConversionsApi.md +6 -6
- data/docs/CreateAdCampaignRequest.md +1 -1
- data/docs/CreateAdCreativeRequest.md +1 -1
- data/docs/CreateApiKeyRequest.md +1 -1
- data/docs/CreateInboxConversation201ResponseData.md +2 -2
- data/docs/CreateInboxConversationRequest.md +3 -3
- data/docs/CreatePhoneNumberPortInRequestEndUser.md +2 -2
- data/docs/CreateStandaloneAdRequest.md +22 -22
- data/docs/CreateStandaloneAdRequestVideo.md +2 -2
- data/docs/CreateWhatsAppFlowRequest.md +1 -1
- data/docs/CreateWhatsAppGroupChatRequest.md +1 -1
- data/docs/CreateWhatsAppTemplateRequest.md +1 -1
- data/docs/CtwaAdRequestBodyVideo.md +1 -1
- data/docs/CustomConversion.md +1 -1
- data/docs/DeleteWhatsappBusinessUsernameRequest.md +1 -1
- data/docs/DiscordApi.md +9 -9
- data/docs/DiscordScheduledEvent.md +1 -1
- data/docs/EditInboxCommentRequest.md +1 -1
- data/docs/EditInboxMessageRequest.md +1 -1
- data/docs/EnableSmsOnNumber200Response.md +1 -1
- data/docs/ErrorResponse.md +1 -1
- data/docs/EstimateAdReachRequest.md +1 -1
- data/docs/ExternalPostWebhookPost.md +2 -2
- data/docs/FollowUserRequest.md +2 -2
- data/docs/GMBAttributesApi.md +3 -3
- data/docs/GMBFoodMenusApi.md +2 -2
- data/docs/GMBLocationDetailsApi.md +2 -2
- data/docs/GMBMediaApi.md +1 -1
- data/docs/GMBPlaceActionsApi.md +1 -1
- data/docs/GMBReviewsApi.md +4 -4
- data/docs/GetAdComments200ResponseMeta.md +4 -4
- data/docs/GetAdMedia200Response.md +1 -1
- data/docs/GetAdMedia200ResponseMediaInner.md +1 -1
- data/docs/GetAdsSearchTerms200ResponseDataInner.md +1 -1
- data/docs/GetGoogleBusinessLocationDetails200ResponseLocation.md +1 -1
- data/docs/GetInboxConversation200ResponseData.md +1 -1
- data/docs/GetInboxConversationMessages200ResponseMessagesInner.md +1 -1
- data/docs/GetInboxPostComments200ResponseCommentsInner.md +2 -2
- data/docs/GetInboxPostComments200ResponseCommentsInnerFrom.md +1 -1
- data/docs/GetInboxTopAccounts200ResponseAccountsInner.md +1 -1
- data/docs/GetLinkedInBidPricingRequest.md +1 -1
- data/docs/GetPhoneNumber200ResponsePhoneNumber.md +1 -1
- data/docs/GetPhoneNumberKycForm200ResponseReusable.md +1 -1
- data/docs/GetPhoneNumberKycForm200ResponseReusableOptionsInner.md +2 -2
- data/docs/GetPhoneNumberKycForm200ResponseReusableOptionsInnerDetailsInner.md +1 -1
- data/docs/GetPhoneNumberPortInRequirements200Response.md +1 -1
- data/docs/GetWhatsAppNumberKycForm200ResponseFieldsInner.md +1 -1
- data/docs/GetWhatsAppSdkConfig200Response.md +22 -0
- data/docs/GoogleBusinessPlatformData.md +1 -1
- data/docs/HideInboxCommentRequest.md +1 -1
- data/docs/InboxAnalyticsApi.md +5 -5
- data/docs/InboxWebhookAccount.md +3 -3
- data/docs/InboxWebhookConversation.md +1 -1
- data/docs/InboxWebhookMessageSender.md +3 -3
- data/docs/InstagramApi.md +1 -1
- data/docs/LeadGenApi.md +2 -2
- data/docs/LikeInboxCommentRequest.md +1 -1
- data/docs/LikePostRequest.md +1 -1
- data/docs/LinkedInMentionsApi.md +1 -1
- data/docs/LinkedInPlatformData.md +1 -1
- data/docs/ListAdAudiences200ResponseAudiencesInner.md +1 -1
- data/docs/ListCalls200ResponseCallsInner.md +2 -2
- data/docs/ListGoogleBusinessLocations200ResponseLocationsInner.md +1 -1
- data/docs/ListInboxComments200ResponseDataInner.md +3 -3
- data/docs/ListInboxConversations200ResponseDataInner.md +3 -1
- data/docs/ListInboxReviews200ResponseDataInner.md +6 -6
- data/docs/ListPhoneNumbers200Response.md +1 -1
- data/docs/ListPhoneNumbers200ResponseNumbersInner.md +3 -3
- data/docs/ListSipTrunks200Response.md +1 -1
- data/docs/ListWhatsAppAccountEvents200ResponseEventsInner.md +1 -1
- data/docs/LogsApi.md +2 -2
- data/docs/MediaItem.md +1 -1
- data/docs/MentionsApi.md +3 -3
- data/docs/MessagesApi.md +95 -23
- data/docs/MessagingAdsApi.md +1 -1
- data/docs/PhoneNumbersApi.md +14 -14
- data/docs/PinterestPlatformData.md +1 -1
- data/docs/PostAnalytics.md +1 -1
- data/docs/PostsApi.md +5 -5
- data/docs/ProfilesApi.md +1 -1
- data/docs/PurchasePhoneNumberRequest.md +1 -1
- data/docs/PurchaseWhatsAppPhoneNumberRequest.md +1 -1
- data/docs/ReachAndFrequencyApi.md +2 -2
- data/docs/RecyclingConfig.md +1 -1
- data/docs/ReplyToMentionRequest.md +1 -1
- data/docs/RetweetPostRequest.md +1 -1
- data/docs/ReviewWebhookReview.md +1 -1
- data/docs/ReviewWebhookReviewReviewer.md +1 -1
- data/docs/ReviewsApi.md +6 -6
- data/docs/SMSApi.md +11 -11
- data/docs/SavedTargetingAudience.md +1 -1
- data/docs/SelectGoogleBusinessLocation200ResponseAccount.md +1 -1
- data/docs/SelectGoogleBusinessLocationRequest.md +2 -2
- data/docs/SendDiscordDirectMessage200Response.md +1 -1
- data/docs/SendInboxMessage200ResponseData.md +1 -1
- data/docs/SendInboxMessageRequest.md +3 -3
- data/docs/SendPrivateReplyToCommentRequest.md +2 -2
- data/docs/SendTypingIndicatorRequest.md +1 -1
- data/docs/SendWhatsAppFlowMessageRequest.md +1 -1
- data/docs/SetCommentModerationRequest.md +1 -1
- data/docs/SetConversationThreadControl200Response.md +20 -0
- data/docs/SetConversationThreadControl200ResponseControl.md +18 -0
- data/docs/SetConversationThreadControlRequest.md +24 -0
- data/docs/SetWhatsAppFlowsEncryptionKeyRequest.md +1 -1
- data/docs/SetWhatsappBusinessUsernameRequest.md +1 -1
- data/docs/StartSmsRegistrationRequest.md +1 -1
- data/docs/StartSmsRegistrationRequestCampaign.md +1 -1
- data/docs/SubmitPhoneNumberKycRequest.md +1 -1
- data/docs/SubmitWhatsAppNumberKycRequest.md +1 -1
- data/docs/SyncExternalPosts200Response.md +1 -1
- data/docs/SyncExternalPostsRequest.md +1 -1
- data/docs/TrackingTag.md +2 -2
- data/docs/TrackingTagsApi.md +6 -6
- data/docs/TwitterEngagementApi.md +9 -9
- data/docs/UnblockWhatsAppUsersRequest.md +1 -1
- data/docs/UpdateAccountRequestXCapabilities.md +1 -1
- data/docs/UpdateAdAccountRequest.md +1 -1
- data/docs/UpdateAdSetRequestPlatformSpecificData.md +1 -1
- data/docs/UpdateConversionDestinationRequest.md +1 -1
- data/docs/UpdateGmbLocationRequest.md +1 -1
- data/docs/UpdateInboxConversationRequest.md +1 -1
- data/docs/UpdatePostMetadataRequest.md +1 -1
- data/docs/UpdateWhatsAppBusinessProfileRequest.md +1 -1
- data/docs/UpdateWhatsAppDisplayNameRequest.md +1 -1
- data/docs/UpdateWhatsAppFlowRequest.md +1 -1
- data/docs/UpdateWhatsAppTemplateByIdRequest.md +1 -1
- data/docs/UpdateWhatsAppTemplateRequest.md +1 -1
- data/docs/UpdateWorkflowRequest.md +1 -1
- data/docs/UploadWhatsAppFlowJsonRequest.md +1 -1
- data/docs/UploadWhatsAppProfilePhotoRequest1.md +1 -1
- data/docs/UploadedOrDerivedAudience.md +2 -2
- data/docs/UsageApi.md +12 -12
- data/docs/UsageMetering.md +1 -1
- data/docs/UsageStats.md +1 -1
- data/docs/UsageStatsSpend.md +1 -1
- data/docs/UsageStatsUsage.md +2 -2
- data/docs/UsersApi.md +1 -1
- data/docs/ValidateApi.md +3 -3
- data/docs/VerifyApi.md +1 -1
- data/docs/VoiceApi.md +2 -2
- data/docs/WebhookEventsApi.md +76 -7
- data/docs/WebhookPayloadAdStatusChangedError.md +3 -3
- data/docs/WebhookPayloadAdStatusChangedStatus.md +1 -1
- data/docs/WebhookPayloadCommentAccount.md +2 -2
- data/docs/WebhookPayloadCommentPost.md +1 -1
- data/docs/WebhookPayloadConversationControlChanged.md +30 -0
- data/docs/WebhookPayloadConversationControlChangedControl.md +22 -0
- data/docs/WebhookPayloadLeadAccount.md +2 -2
- data/docs/WebhookPayloadMessageMessageSender.md +3 -3
- data/docs/WebhookPayloadMessageMetadata.md +3 -1
- data/docs/WebhookPayloadMessageSentMessage.md +1 -1
- data/docs/WebhookPayloadReviewNewAccount.md +1 -1
- data/docs/WhatsAppApi.md +51 -51
- data/docs/WhatsAppCallingApi.md +3 -3
- data/docs/WhatsAppFlowsApi.md +18 -18
- data/docs/WhatsAppPhoneNumbersApi.md +12 -12
- data/docs/WhatsAppSandboxApi.md +2 -2
- data/docs/WhatsAppTemplatesApi.md +2 -2
- data/docs/WorkflowEdge.md +1 -1
- data/docs/WorkflowExecutionEvent.md +1 -1
- data/docs/WorkflowsApi.md +3 -3
- data/docs/XApiOperation.md +2 -2
- data/docs/XApiOperationTriggeredByInner.md +1 -1
- data/docs/XApiPricing.md +1 -1
- data/lib/zernio-sdk/api/account_groups_api.rb +2 -2
- data/lib/zernio-sdk/api/accounts_api.rb +10 -10
- data/lib/zernio-sdk/api/ad_accounts_api.rb +12 -12
- data/lib/zernio-sdk/api/ad_audiences_api.rb +6 -6
- data/lib/zernio-sdk/api/ad_campaigns_api.rb +60 -60
- data/lib/zernio-sdk/api/ad_creatives_api.rb +20 -20
- data/lib/zernio-sdk/api/ad_insights_api.rb +4 -4
- data/lib/zernio-sdk/api/ad_library_api.rb +2 -2
- data/lib/zernio-sdk/api/ad_targeting_api.rb +6 -6
- data/lib/zernio-sdk/api/analytics_api.rb +22 -22
- data/lib/zernio-sdk/api/comments_api.rb +20 -20
- data/lib/zernio-sdk/api/connect_api.rb +91 -34
- data/lib/zernio-sdk/api/conversions_api.rb +12 -12
- data/lib/zernio-sdk/api/discord_api.rb +18 -18
- data/lib/zernio-sdk/api/gmb_attributes_api.rb +4 -4
- data/lib/zernio-sdk/api/gmb_food_menus_api.rb +4 -4
- data/lib/zernio-sdk/api/gmb_location_details_api.rb +4 -4
- data/lib/zernio-sdk/api/gmb_media_api.rb +2 -2
- data/lib/zernio-sdk/api/gmb_place_actions_api.rb +2 -2
- data/lib/zernio-sdk/api/gmb_reviews_api.rb +8 -8
- data/lib/zernio-sdk/api/inbox_analytics_api.rb +10 -10
- data/lib/zernio-sdk/api/instagram_api.rb +2 -2
- data/lib/zernio-sdk/api/lead_gen_api.rb +4 -4
- data/lib/zernio-sdk/api/linked_in_mentions_api.rb +2 -2
- data/lib/zernio-sdk/api/logs_api.rb +2 -2
- data/lib/zernio-sdk/api/mentions_api.rb +4 -4
- data/lib/zernio-sdk/api/messages_api.rb +104 -30
- data/lib/zernio-sdk/api/messaging_ads_api.rb +2 -2
- data/lib/zernio-sdk/api/phone_numbers_api.rb +24 -24
- data/lib/zernio-sdk/api/posts_api.rb +8 -8
- data/lib/zernio-sdk/api/profiles_api.rb +2 -2
- data/lib/zernio-sdk/api/reach_and_frequency_api.rb +4 -4
- data/lib/zernio-sdk/api/reviews_api.rb +8 -8
- data/lib/zernio-sdk/api/sms_api.rb +20 -20
- data/lib/zernio-sdk/api/tracking_tags_api.rb +12 -12
- data/lib/zernio-sdk/api/twitter_engagement_api.rb +12 -12
- data/lib/zernio-sdk/api/usage_api.rb +14 -14
- data/lib/zernio-sdk/api/users_api.rb +2 -2
- data/lib/zernio-sdk/api/validate_api.rb +4 -4
- data/lib/zernio-sdk/api/verify_api.rb +2 -2
- data/lib/zernio-sdk/api/voice_api.rb +4 -4
- data/lib/zernio-sdk/api/webhook_events_api.rb +80 -14
- data/lib/zernio-sdk/api/whats_app_api.rb +54 -54
- data/lib/zernio-sdk/api/whats_app_calling_api.rb +4 -4
- data/lib/zernio-sdk/api/whats_app_flows_api.rb +20 -20
- data/lib/zernio-sdk/api/whats_app_phone_numbers_api.rb +20 -20
- data/lib/zernio-sdk/api/whats_app_sandbox_api.rb +4 -4
- data/lib/zernio-sdk/api/whats_app_templates_api.rb +2 -2
- data/lib/zernio-sdk/api/workflows_api.rb +6 -6
- data/lib/zernio-sdk/models/account_with_follower_stats_all_of_account_stats.rb +2 -2
- data/lib/zernio-sdk/models/ad.rb +4 -4
- data/lib/zernio-sdk/models/ad_creative.rb +6 -6
- data/lib/zernio-sdk/models/ad_daily_metrics.rb +4 -4
- data/lib/zernio-sdk/models/ad_engagement_counts.rb +1 -1
- data/lib/zernio-sdk/models/ad_funnel_counts.rb +4 -4
- data/lib/zernio-sdk/models/ad_keyword.rb +1 -1
- data/lib/zernio-sdk/models/ad_metrics.rb +4 -4
- data/lib/zernio-sdk/models/ad_tree_ad_set.rb +1 -1
- data/lib/zernio-sdk/models/ad_tree_campaign.rb +4 -4
- data/lib/zernio-sdk/models/add_ad_keywords_request.rb +1 -1
- data/lib/zernio-sdk/models/add_message_reaction_request.rb +1 -1
- data/lib/zernio-sdk/models/adjust_conversions_request_adjustments_inner.rb +4 -4
- data/lib/zernio-sdk/models/adjust_conversions_request_adjustments_inner_user.rb +1 -1
- data/lib/zernio-sdk/models/ads_timeline_response_rows_inner.rb +1 -1
- data/lib/zernio-sdk/models/analytics_delta_entry.rb +1 -1
- data/lib/zernio-sdk/models/analytics_list_response.rb +1 -1
- data/lib/zernio-sdk/models/api_key.rb +1 -1
- data/lib/zernio-sdk/models/appeal_sms_registration_request.rb +1 -1
- data/lib/zernio-sdk/models/assign_google_business_location200_response_account.rb +1 -1
- data/lib/zernio-sdk/models/assign_google_business_location_request.rb +2 -2
- data/lib/zernio-sdk/models/attach_campaign_assets_request.rb +2 -2
- data/lib/zernio-sdk/models/billing_snapshot.rb +1 -1
- data/lib/zernio-sdk/models/billing_snapshot_plan.rb +1 -1
- data/lib/zernio-sdk/models/block_whats_app_users_request.rb +1 -1
- data/lib/zernio-sdk/models/bookmark_post_request.rb +1 -1
- data/lib/zernio-sdk/models/boost_post_request.rb +5 -5
- data/lib/zernio-sdk/models/boost_post_request_platform_specific_data.rb +1 -1
- data/lib/zernio-sdk/models/business_center.rb +2 -2
- data/lib/zernio-sdk/models/call_record.rb +2 -2
- data/lib/zernio-sdk/models/campaign_analytics_response_analytics_daily_inner.rb +4 -4
- data/lib/zernio-sdk/models/check_phone_number_availability200_response.rb +1 -1
- data/lib/zernio-sdk/models/check_phone_number_portability200_response_results_inner.rb +2 -2
- data/lib/zernio-sdk/models/connect_whats_app_embedded_signup_request.rb +4 -3
- data/lib/zernio-sdk/models/conversation.rb +334 -0
- data/lib/zernio-sdk/models/conversion_destination.rb +1 -1
- data/lib/zernio-sdk/models/conversion_event.rb +1 -1
- data/lib/zernio-sdk/models/create_ad_campaign_request.rb +1 -1
- data/lib/zernio-sdk/models/create_ad_creative_request.rb +1 -1
- data/lib/zernio-sdk/models/create_api_key_request.rb +1 -1
- data/lib/zernio-sdk/models/create_inbox_conversation201_response_data.rb +2 -2
- data/lib/zernio-sdk/models/create_inbox_conversation_request.rb +3 -3
- data/lib/zernio-sdk/models/create_phone_number_port_in_request_end_user.rb +3 -3
- data/lib/zernio-sdk/models/create_standalone_ad201_response_one_of.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad201_response_one_of1.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request.rb +22 -22
- data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request_placement_assets_rules_inner_placements.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request_placements.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request_platform_specific_data.rb +1 -1
- data/lib/zernio-sdk/models/create_standalone_ad_request_video.rb +3 -3
- data/lib/zernio-sdk/models/create_whats_app_flow_request.rb +1 -1
- data/lib/zernio-sdk/models/create_whats_app_group_chat_request.rb +1 -1
- data/lib/zernio-sdk/models/create_whats_app_template_request.rb +1 -1
- data/lib/zernio-sdk/models/ctwa_ad_request_body_video.rb +1 -1
- data/lib/zernio-sdk/models/custom_conversion.rb +1 -1
- data/lib/zernio-sdk/models/delete_whatsapp_business_username_request.rb +1 -1
- data/lib/zernio-sdk/models/discord_scheduled_event.rb +2 -2
- data/lib/zernio-sdk/models/edit_inbox_comment_request.rb +1 -1
- data/lib/zernio-sdk/models/edit_inbox_message_request.rb +1 -1
- data/lib/zernio-sdk/models/enable_sms_on_number200_response.rb +1 -1
- data/lib/zernio-sdk/models/error_response.rb +1 -1
- data/lib/zernio-sdk/models/estimate_ad_reach_request.rb +1 -1
- data/lib/zernio-sdk/models/external_post_webhook_post.rb +2 -2
- data/lib/zernio-sdk/models/follow_user_request.rb +2 -2
- data/lib/zernio-sdk/models/geo_restriction.rb +1 -1
- data/lib/zernio-sdk/models/get_ad_comments200_response_meta.rb +4 -4
- data/lib/zernio-sdk/models/get_ad_media200_response.rb +1 -1
- data/lib/zernio-sdk/models/get_ad_media200_response_media_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_ads_search_terms200_response_data_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_google_business_location_details200_response_location.rb +1 -1
- data/lib/zernio-sdk/models/get_inbox_conversation200_response_data.rb +1 -1
- data/lib/zernio-sdk/models/get_inbox_conversation_messages200_response_messages_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_inbox_post_comments200_response_comments_inner.rb +2 -2
- data/lib/zernio-sdk/models/get_inbox_post_comments200_response_comments_inner_from.rb +1 -1
- data/lib/zernio-sdk/models/get_inbox_post_comments200_response_meta_ad_comments.rb +1 -1
- data/lib/zernio-sdk/models/get_inbox_top_accounts200_response_accounts_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_linked_in_bid_pricing_request.rb +1 -1
- data/lib/zernio-sdk/models/get_phone_number200_response_phone_number.rb +1 -1
- data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable.rb +1 -1
- data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable_options_inner.rb +2 -2
- data/lib/zernio-sdk/models/get_phone_number_kyc_form200_response_reusable_options_inner_details_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_phone_number_port_in_requirements200_response.rb +1 -1
- data/lib/zernio-sdk/models/get_whats_app_number_kyc_form200_response_fields_inner.rb +1 -1
- data/lib/zernio-sdk/models/get_whats_app_sdk_config200_response.rb +219 -0
- data/lib/zernio-sdk/models/google_business_platform_data.rb +2 -2
- data/lib/zernio-sdk/models/hide_inbox_comment_request.rb +1 -1
- data/lib/zernio-sdk/models/inbox_webhook_account.rb +3 -3
- data/lib/zernio-sdk/models/inbox_webhook_conversation.rb +1 -1
- data/lib/zernio-sdk/models/inbox_webhook_message_sender.rb +3 -3
- data/lib/zernio-sdk/models/like_inbox_comment_request.rb +1 -1
- data/lib/zernio-sdk/models/like_post_request.rb +1 -1
- data/lib/zernio-sdk/models/linked_in_ads_platform_data_thought_leader.rb +1 -1
- data/lib/zernio-sdk/models/linked_in_platform_data.rb +1 -1
- data/lib/zernio-sdk/models/list_ad_audiences200_response_audiences_inner.rb +1 -1
- data/lib/zernio-sdk/models/list_calls200_response_calls_inner.rb +2 -2
- data/lib/zernio-sdk/models/list_discord_pinned_messages200_response_data_inner.rb +1 -1
- data/lib/zernio-sdk/models/list_google_business_locations200_response_locations_inner.rb +1 -1
- data/lib/zernio-sdk/models/list_inbox_comments200_response_data_inner.rb +3 -3
- data/lib/zernio-sdk/models/list_inbox_conversations200_response_data_inner.rb +24 -2
- data/lib/zernio-sdk/models/list_inbox_reviews200_response_data_inner.rb +6 -6
- data/lib/zernio-sdk/models/list_phone_numbers200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_phone_numbers200_response_numbers_inner.rb +3 -3
- data/lib/zernio-sdk/models/list_sip_trunks200_response.rb +1 -1
- data/lib/zernio-sdk/models/list_sms_sender_ids200_response_budget.rb +1 -1
- data/lib/zernio-sdk/models/list_whats_app_account_events200_response_events_inner.rb +1 -1
- data/lib/zernio-sdk/models/media_item.rb +1 -1
- data/lib/zernio-sdk/models/pinterest_platform_data.rb +1 -1
- data/lib/zernio-sdk/models/post_analytics.rb +1 -1
- data/lib/zernio-sdk/models/purchase_phone_number_request.rb +1 -1
- data/lib/zernio-sdk/models/purchase_whats_app_phone_number_request.rb +1 -1
- data/lib/zernio-sdk/models/recycling_config.rb +2 -2
- data/lib/zernio-sdk/models/reply_to_mention_request.rb +1 -1
- data/lib/zernio-sdk/models/retweet_post_request.rb +1 -1
- data/lib/zernio-sdk/models/review_webhook_review.rb +1 -1
- data/lib/zernio-sdk/models/review_webhook_review_reviewer.rb +1 -1
- data/lib/zernio-sdk/models/saved_targeting_audience.rb +1 -1
- data/lib/zernio-sdk/models/select_google_business_location200_response_account.rb +1 -1
- data/lib/zernio-sdk/models/select_google_business_location_request.rb +2 -2
- data/lib/zernio-sdk/models/send_discord_direct_message200_response.rb +1 -1
- data/lib/zernio-sdk/models/send_inbox_message200_response_data.rb +1 -1
- data/lib/zernio-sdk/models/send_inbox_message_request.rb +3 -3
- data/lib/zernio-sdk/models/send_private_reply_to_comment_request.rb +2 -2
- data/lib/zernio-sdk/models/send_typing_indicator_request.rb +1 -1
- data/lib/zernio-sdk/models/send_whats_app_flow_message_request.rb +1 -1
- data/lib/zernio-sdk/models/set_comment_moderation_request.rb +1 -1
- data/lib/zernio-sdk/models/set_conversation_thread_control200_response.rb +156 -0
- data/lib/zernio-sdk/models/set_conversation_thread_control200_response_control.rb +181 -0
- data/lib/zernio-sdk/models/set_conversation_thread_control_request.rb +266 -0
- data/lib/zernio-sdk/models/set_whats_app_flows_encryption_key_request.rb +1 -1
- data/lib/zernio-sdk/models/set_whatsapp_business_username_request.rb +1 -1
- data/lib/zernio-sdk/models/slack_platform_data.rb +1 -1
- data/lib/zernio-sdk/models/start_sms_registration_request.rb +1 -1
- data/lib/zernio-sdk/models/start_sms_registration_request_campaign.rb +2 -2
- data/lib/zernio-sdk/models/submit_phone_number_kyc_request.rb +1 -1
- data/lib/zernio-sdk/models/submit_whats_app_number_kyc_request.rb +1 -1
- data/lib/zernio-sdk/models/sync_external_posts200_response.rb +1 -1
- data/lib/zernio-sdk/models/sync_external_posts_request.rb +1 -1
- data/lib/zernio-sdk/models/tracking_tag.rb +3 -3
- data/lib/zernio-sdk/models/unblock_whats_app_users_request.rb +1 -1
- data/lib/zernio-sdk/models/update_account_request_x_capabilities.rb +2 -2
- data/lib/zernio-sdk/models/update_ad_account_request.rb +1 -1
- data/lib/zernio-sdk/models/update_ad_request_creative.rb +1 -1
- data/lib/zernio-sdk/models/update_ad_set_request_platform_specific_data.rb +1 -1
- data/lib/zernio-sdk/models/update_ad_tracking_tags_request_creative.rb +1 -1
- data/lib/zernio-sdk/models/update_conversion_destination_request.rb +1 -1
- data/lib/zernio-sdk/models/update_gmb_location_request.rb +1 -1
- data/lib/zernio-sdk/models/update_inbox_conversation_request.rb +1 -1
- data/lib/zernio-sdk/models/update_post_metadata_request.rb +1 -1
- data/lib/zernio-sdk/models/update_whats_app_business_profile_request.rb +1 -1
- data/lib/zernio-sdk/models/update_whats_app_display_name_request.rb +1 -1
- data/lib/zernio-sdk/models/update_whats_app_flow_request.rb +1 -1
- data/lib/zernio-sdk/models/update_whats_app_template_by_id_request.rb +1 -1
- data/lib/zernio-sdk/models/update_whats_app_template_request.rb +1 -1
- data/lib/zernio-sdk/models/update_workflow_request.rb +1 -1
- data/lib/zernio-sdk/models/upload_whats_app_flow_json_request.rb +1 -1
- data/lib/zernio-sdk/models/upload_whats_app_profile_photo_request1.rb +1 -1
- data/lib/zernio-sdk/models/uploaded_or_derived_audience.rb +2 -2
- data/lib/zernio-sdk/models/usage_metering.rb +2 -2
- data/lib/zernio-sdk/models/usage_metering_peaks.rb +1 -1
- data/lib/zernio-sdk/models/usage_stats.rb +2 -2
- data/lib/zernio-sdk/models/usage_stats_limits.rb +1 -1
- data/lib/zernio-sdk/models/usage_stats_spend.rb +2 -2
- data/lib/zernio-sdk/models/usage_stats_usage.rb +3 -3
- data/lib/zernio-sdk/models/usage_stats_usage_x_api_calls.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_ad_status_changed_error.rb +3 -3
- data/lib/zernio-sdk/models/webhook_payload_ad_status_changed_status.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_analytics_synced.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_analytics_synced_sync.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_comment.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_comment_account.rb +2 -2
- data/lib/zernio-sdk/models/webhook_payload_comment_post.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_conversation_control_changed.rb +347 -0
- data/lib/zernio-sdk/models/webhook_payload_conversation_control_changed_control.rb +224 -0
- data/lib/zernio-sdk/models/webhook_payload_conversation_started.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_lead_account.rb +2 -2
- data/lib/zernio-sdk/models/webhook_payload_message_message_sender.rb +3 -3
- data/lib/zernio-sdk/models/webhook_payload_message_metadata.rb +13 -3
- data/lib/zernio-sdk/models/webhook_payload_message_sent_message.rb +3 -3
- data/lib/zernio-sdk/models/webhook_payload_post_platform.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_post_platform_account.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_post_platform_platform.rb +1 -1
- data/lib/zernio-sdk/models/webhook_payload_review_new_account.rb +1 -1
- data/lib/zernio-sdk/models/workflow_edge.rb +1 -1
- data/lib/zernio-sdk/models/workflow_execution_event.rb +1 -1
- data/lib/zernio-sdk/models/x_api_operation.rb +2 -2
- data/lib/zernio-sdk/models/x_api_operation_triggered_by_inner.rb +1 -1
- data/lib/zernio-sdk/models/x_api_pricing.rb +2 -2
- data/lib/zernio-sdk/version.rb +1 -1
- data/lib/zernio-sdk.rb +7 -0
- data/openapi.yaml +1073 -853
- data/spec/api/account_groups_api_spec.rb +1 -1
- data/spec/api/accounts_api_spec.rb +5 -5
- data/spec/api/ad_accounts_api_spec.rb +6 -6
- data/spec/api/ad_audiences_api_spec.rb +3 -3
- data/spec/api/ad_campaigns_api_spec.rb +30 -30
- data/spec/api/ad_creatives_api_spec.rb +10 -10
- data/spec/api/ad_insights_api_spec.rb +2 -2
- data/spec/api/ad_library_api_spec.rb +1 -1
- data/spec/api/ad_targeting_api_spec.rb +3 -3
- data/spec/api/analytics_api_spec.rb +11 -11
- data/spec/api/comments_api_spec.rb +10 -10
- data/spec/api/connect_api_spec.rb +28 -17
- data/spec/api/conversions_api_spec.rb +6 -6
- data/spec/api/discord_api_spec.rb +9 -9
- data/spec/api/gmb_attributes_api_spec.rb +2 -2
- data/spec/api/gmb_food_menus_api_spec.rb +2 -2
- data/spec/api/gmb_location_details_api_spec.rb +2 -2
- data/spec/api/gmb_media_api_spec.rb +1 -1
- data/spec/api/gmb_place_actions_api_spec.rb +1 -1
- data/spec/api/gmb_reviews_api_spec.rb +4 -4
- data/spec/api/inbox_analytics_api_spec.rb +5 -5
- data/spec/api/instagram_api_spec.rb +1 -1
- data/spec/api/lead_gen_api_spec.rb +2 -2
- data/spec/api/linked_in_mentions_api_spec.rb +1 -1
- data/spec/api/logs_api_spec.rb +1 -1
- data/spec/api/mentions_api_spec.rb +2 -2
- data/spec/api/messages_api_spec.rb +28 -15
- data/spec/api/messaging_ads_api_spec.rb +1 -1
- data/spec/api/phone_numbers_api_spec.rb +12 -12
- data/spec/api/posts_api_spec.rb +4 -4
- data/spec/api/profiles_api_spec.rb +1 -1
- data/spec/api/reach_and_frequency_api_spec.rb +2 -2
- data/spec/api/reviews_api_spec.rb +4 -4
- data/spec/api/sms_api_spec.rb +10 -10
- data/spec/api/tracking_tags_api_spec.rb +6 -6
- data/spec/api/twitter_engagement_api_spec.rb +6 -6
- data/spec/api/usage_api_spec.rb +7 -7
- data/spec/api/users_api_spec.rb +1 -1
- data/spec/api/validate_api_spec.rb +2 -2
- data/spec/api/verify_api_spec.rb +1 -1
- data/spec/api/voice_api_spec.rb +2 -2
- data/spec/api/whats_app_api_spec.rb +27 -27
- data/spec/api/whats_app_calling_api_spec.rb +2 -2
- data/spec/api/whats_app_flows_api_spec.rb +10 -10
- data/spec/api/whats_app_phone_numbers_api_spec.rb +10 -10
- data/spec/api/whats_app_sandbox_api_spec.rb +2 -2
- data/spec/api/whats_app_templates_api_spec.rb +1 -1
- data/spec/api/workflows_api_spec.rb +3 -3
- data/spec/models/conversation_spec.rb +92 -0
- data/spec/models/create_webhook_settings_request_spec.rb +1 -1
- data/spec/models/get_whats_app_sdk_config200_response_spec.rb +48 -0
- data/spec/models/list_inbox_conversations200_response_data_inner_spec.rb +10 -0
- data/spec/models/set_conversation_thread_control200_response_control_spec.rb +40 -0
- data/spec/models/set_conversation_thread_control200_response_spec.rb +42 -0
- data/spec/models/set_conversation_thread_control_request_spec.rb +62 -0
- data/spec/models/update_webhook_settings_request_spec.rb +1 -1
- data/spec/models/webhook_payload_conversation_control_changed_control_spec.rb +56 -0
- data/spec/models/webhook_payload_conversation_control_changed_spec.rb +76 -0
- data/spec/models/webhook_payload_message_metadata_spec.rb +6 -0
- data/spec/models/webhook_payload_message_sent_message_spec.rb +1 -1
- data/spec/models/webhook_spec.rb +1 -1
- data/zernio-sdk-0.0.873.gem +0 -0
- metadata +30 -2
- data/zernio-sdk-0.0.871.gem +0 -0
|
@@ -72,7 +72,7 @@ describe 'AdTargetingApi' do
|
|
|
72
72
|
# Search targeting interests
|
|
73
73
|
# Deprecated alias for `GET /v1/ads/targeting/search?dimension=interest`. Kept for backward compatibility, it returns the legacy `{ interests: [...] }` shape rather than the normalized `{ results: [...] }`. New integrations should use `GET /v1/ads/targeting/search` with `dimension=interest`.
|
|
74
74
|
# @param q Search query
|
|
75
|
-
# @param account_id
|
|
75
|
+
# @param account_id Account ID
|
|
76
76
|
# @param [Hash] opts the optional parameters
|
|
77
77
|
# @return [SearchAdInterests200Response]
|
|
78
78
|
describe 'search_ad_interests test' do
|
|
@@ -83,8 +83,8 @@ describe 'AdTargetingApi' do
|
|
|
83
83
|
|
|
84
84
|
# unit tests for search_ad_targeting
|
|
85
85
|
# Search targeting options
|
|
86
|
-
# Resolve a human-readable query into the platform's opaque targeting ids used in the `TargetingSpec` (`countries`/`regions`/`cities`/`zips`/`metros` geo keys, and `interests`/`behaviors` entity ids) on `POST /v1/ads/create`, `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences. The `dimension` param selects what is searched
|
|
87
|
-
# @param account_id
|
|
86
|
+
# Resolve a human-readable query into the platform's opaque targeting ids used in the `TargetingSpec` (`countries`/`regions`/`cities`/`zips`/`metros` geo keys, and `interests`/`behaviors` entity ids) on `POST /v1/ads/create`, `POST /v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences. The `dimension` param selects what is searched: - `geo`: locations, further scoped by `geoType` - `interest` - `behavior` - `income` - `language`: Google-only - `workPosition`, `workEmployer`, `workIndustry`: the Meta-only work demographics, whose ids feed `TargetingSpec.workPositions`/`workEmployers`/`workIndustries` Availability of each dimension varies by platform (e.g. behaviours are Meta/TikTok only). Work industries are a fixed ~30-entry Meta catalog with no server-side query, so `workIndustry` matching, ranking and `limit` happen in Zernio. `language` is likewise a fixed, checked-in table of Google's targetable `language_constant` rows (id, ISO code, name) matched by name or code, capped at 20, with no network call; its ids feed `TargetingSpec.languages`. Results are normalized across platforms into a single shape, so the same client code consumes Meta, TikTok, LinkedIn, X, Pinterest, and Google results. TikTok geo searches return every matching level in one list (`type` is `country`, `region`, `city`, `district`, or `metro` for DMA areas), and `geoType` is not applied. Results are scoped to the advertiser's targetable markets, and every id is usable in `regions`/`cities`/`metros` keys on `POST /v1/ads/create`. LinkedIn geo searches also return every matching level in one list, and neither `geoType` nor `countryCode` is applied: LinkedIn's typeahead only returns a name and a URN per result, with no level or country field to filter on. Every result has `type` set to `location`, and its id is a `urn:li:geo:*` URN usable as a `regions[].key` on `POST /v1/ads/create`, `POST /v1/ads/boost` and `POST /v1/ads/targeting/reach-estimate`. Google geo searches resolve against Google's geoTargetConstants and return every matching level in one list; `geoType` is not applied (Google's `target_type` is an open taxonomy that does not map one-to-one onto the `geoType` enum), so filter client-side on the returned `type` (`country`, `region`, `city`, `zip`, `metro`, or the lowercased Google target type for rarer levels). `countryCode` scopes the search to one country. Each id is Google's numeric criterion id, usable as a `regions`/`cities`/`zips`/`metros` `key` on `POST /v1/ads/create`. Google city radius is not supported (pass a `customLocations` lat/lng pin for a radius); country targeting also accepts plain ISO codes via `countries` with no search call. Pinterest resolves against three whole-catalog endpoints (interests, locations, regions) with no server-side query or pagination, so matching, ranking and the `limit` cutoff all happen in Zernio; the catalog is independent of any ad account and results never carry `audienceSize`. Names come back localized to the connected Pinterest account's language (there is no way to force a locale), so match against whatever language that account returns. `geoType` routes to a different Pinterest catalog: - `country` and `metro_area` read the locations catalog (`type` is `country` or `metro`) - `region` reads the regions catalog (`type` is `region`, its id a `regions[].key` on `POST /v1/ads/create`) - `all` and the default `city` merge both catalogs with honest per-entry `type`s, since Pinterest has no city-level catalog and `city` is an alias for `all`, not a literal city search - `zip`, `subcity`, `neighborhood`, `place` and `geo_market` return a 400: Pinterest exposes no postal-code catalog, pass postal codes directly as `targeting.zips: [{ key }]` on `POST /v1/ads/create` For geo queries, `q` should contain only the locality name (e.g. `\"Amsterdam\"`, not `\"Amsterdam, NL\"`). Use `countryCode` to disambiguate.
|
|
87
|
+
# @param account_id Account ID (a connected account on the target ad platform).
|
|
88
88
|
# @param q Search query. For geo, the locality name only (no region/country suffix).
|
|
89
89
|
# @param [Hash] opts the optional parameters
|
|
90
90
|
# @option opts [String] :dimension What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities, `income` resolves income-tier options, `language` resolves Google's targetable language_constant table (Google only), `workPosition`/`workEmployer`/`workIndustry` resolve Meta work demographics. Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
|
|
@@ -39,7 +39,7 @@ describe 'AnalyticsApi' do
|
|
|
39
39
|
# @option opts [String] :post_id Returns analytics for a single post. Accepts both Zernio Post IDs and External Post IDs. Zernio IDs are auto-resolved to External Post analytics.
|
|
40
40
|
# @option opts [String] :platform Filter by platform (default \"all\")
|
|
41
41
|
# @option opts [String] :profile_id Filter by profile ID (default \"all\")
|
|
42
|
-
# @option opts [String] :account_id Filter by
|
|
42
|
+
# @option opts [String] :account_id Filter by account ID
|
|
43
43
|
# @option opts [String] :source Filter by post source: late (posted via Zernio API), external (synced from platform), all (default)
|
|
44
44
|
# @option opts [Date] :from_date Inclusive lower bound (YYYY-MM-DD). Defaults to 90 days ago if omitted. Max range is 366 days.
|
|
45
45
|
# @option opts [Date] :to_date Inclusive upper bound (YYYY-MM-DD). Defaults to today if omitted.
|
|
@@ -56,7 +56,7 @@ describe 'AnalyticsApi' do
|
|
|
56
56
|
|
|
57
57
|
# unit tests for get_analytics_delta
|
|
58
58
|
# Analytics changed since a cursor
|
|
59
|
-
# Cursor feed of the analytics snapshots that CHANGED, across every account you can read, in one paginated stream. Built for integrations that would otherwise call `GET /v1/analytics` once per connected account. Each page carries changes from many accounts at once, so your call count scales with how much actually changed rather than with how many accounts you have. Measured against a fleet of roughly 1,600 connected accounts: about 1,599 per-account analytics calls an hour became about 205 delta calls an hour, a 7.8x reduction. **Bootstrap once, then stay in sync.** Load your baseline from `GET /v1/analytics`, which is the historical endpoint. This one is a rolling 7-day change log and cannot replay history. Then call this endpoint with NO `cursor`: it answers with an empty `data` array plus the feed's current position in `nextCursor`. Send that `nextCursor` back on the next call and you receive everything written since. `nextCursor` is present on every response, empty pages included, so you always have something to advance with. **Ordering.** Entries come back oldest first, in the order the feed received them. That order is NOT `syncedAt`: `syncedAt` is stamped when an account's sync cycle started, and a slow cycle writes its rows after a faster cycle that started later, so `syncedAt` can go backwards between consecutive entries. Do not sort, filter or resume on it. The cursor is the only stable position, and it is opaque: pass it back verbatim, and do not parse, construct or compare cursors. **`hasMore: false` does not mean the feed ended.** This stream has no end and `nextCursor` is never null. `hasMore: true` means more changes are already waiting, so call again straight away. `hasMore: false` means you are caught up: keep the cursor and poll again on your normal interval. **The newest changes settle before they are served.** The feed deliberately holds back its last few seconds of writes, so that a row can never become visible behind a cursor you have already advanced past. A read issued the instant an `analytics.synced` webhook lands will therefore often return an empty page for that account. Do not read an empty page as \"nothing changed\": poll again with the SAME cursor you
|
|
59
|
+
# Cursor feed of the analytics snapshots that CHANGED, across every account you can read, in one paginated stream. Built for integrations that would otherwise call `GET /v1/analytics` once per connected account. Each page carries changes from many accounts at once, so your call count scales with how much actually changed rather than with how many accounts you have. Measured against a fleet of roughly 1,600 connected accounts: about 1,599 per-account analytics calls an hour became about 205 delta calls an hour, a 7.8x reduction. **Bootstrap once, then stay in sync.** Load your baseline from `GET /v1/analytics`, which is the historical endpoint. This one is a rolling 7-day change log and cannot replay history. Then call this endpoint with NO `cursor`: it answers with an empty `data` array plus the feed's current position in `nextCursor`. Send that `nextCursor` back on the next call and you receive everything written since. `nextCursor` is present on every response, empty pages included, so you always have something to advance with. **Ordering.** Entries come back oldest first, in the order the feed received them. That order is NOT `syncedAt`: `syncedAt` is stamped when an account's sync cycle started, and a slow cycle writes its rows after a faster cycle that started later, so `syncedAt` can go backwards between consecutive entries. Do not sort, filter or resume on it. The cursor is the only stable position, and it is opaque: pass it back verbatim, and do not parse, construct or compare cursors. **`hasMore: false` does not mean the feed ended.** This stream has no end and `nextCursor` is never null. `hasMore: true` means more changes are already waiting, so call again straight away. `hasMore: false` means you are caught up: keep the cursor and poll again on your normal interval. **The newest changes settle before they are served.** The feed deliberately holds back its last few seconds of writes, so that a row can never become visible behind a cursor you have already advanced past. A read issued the instant an `analytics.synced` webhook lands will therefore often return an empty page for that account. Do not read an empty page as \"nothing changed\": poll again with the SAME cursor you last used rather than advancing. **Repeats inside one instant.** A sync cycle occasionally records the same post twice at the same feed position. When that happens the feed delivers one of those rows, not both. Measured over a day of production traffic, about 1.3% of rows fall in such a group and 99.4% of those groups are identical rows, so this is far more often deduplication than loss. Metrics are absolute values rather than increments, so a later entry for the same post supersedes an earlier one. **Retention is 7 days.** Changes older than that leave the feed. A cursor older than 6 days is rejected with a `400` (a day of margin, because expiry is lazy). Recover by re-bootstrapping from `GET /v1/analytics` and taking a fresh cursor from a call to this endpoint with no `cursor`. A consumer that polls at least daily never reaches this. Pairs with the `analytics.synced` webhook, so changes can be read on notification instead of on a timer. That event carries no cursor of its own: keep using the `nextCursor` this endpoint gave you. Requires the same analytics access as `GET /v1/analytics`, and shares the stricter per-second rate-limit window applied to analytics endpoints.
|
|
60
60
|
# @param [Hash] opts the optional parameters
|
|
61
61
|
# @option opts [String] :cursor Opaque cursor from a previous response's `nextCursor`. Omit it to start from now: the response is then an empty page carrying the feed's current position. Rejected with a `400` when malformed, or when older than the retention window.
|
|
62
62
|
# @option opts [Integer] :limit Page size. Out-of-range values are a 400, never a silent clamp.
|
|
@@ -75,7 +75,7 @@ describe 'AnalyticsApi' do
|
|
|
75
75
|
# @param [Hash] opts the optional parameters
|
|
76
76
|
# @option opts [String] :platform Filter by platform (e.g. \"instagram\", \"tiktok\"). Omit for all platforms.
|
|
77
77
|
# @option opts [String] :profile_id Filter by profile ID. Omit for all profiles.
|
|
78
|
-
# @option opts [String] :account_id Filter by
|
|
78
|
+
# @option opts [String] :account_id Filter by account ID. Omit for all accounts.
|
|
79
79
|
# @option opts [String] :source Filter by post origin. \"late\" for posts published via Zernio, \"external\" for posts imported from platforms.
|
|
80
80
|
# @return [GetBestTimeToPost200Response]
|
|
81
81
|
describe 'get_best_time_to_post test' do
|
|
@@ -90,7 +90,7 @@ describe 'AnalyticsApi' do
|
|
|
90
90
|
# @param [Hash] opts the optional parameters
|
|
91
91
|
# @option opts [String] :platform Filter by platform (e.g. \"instagram\", \"tiktok\"). Omit for all platforms.
|
|
92
92
|
# @option opts [String] :profile_id Filter by profile ID. Omit for all profiles.
|
|
93
|
-
# @option opts [String] :account_id Filter by
|
|
93
|
+
# @option opts [String] :account_id Filter by account ID. Omit for all accounts.
|
|
94
94
|
# @option opts [String] :source Filter by post origin. \"late\" for posts published via Zernio, \"external\" for posts imported from platforms.
|
|
95
95
|
# @return [GetContentDecay200Response]
|
|
96
96
|
describe 'get_content_decay test' do
|
|
@@ -105,7 +105,7 @@ describe 'AnalyticsApi' do
|
|
|
105
105
|
# @param [Hash] opts the optional parameters
|
|
106
106
|
# @option opts [String] :platform Filter by platform (e.g. \"instagram\", \"tiktok\"). Omit for all platforms.
|
|
107
107
|
# @option opts [String] :profile_id Filter by profile ID. Omit for all profiles.
|
|
108
|
-
# @option opts [String] :account_id Filter by
|
|
108
|
+
# @option opts [String] :account_id Filter by account ID
|
|
109
109
|
# @option opts [Time] :from_date Inclusive start date (ISO 8601). Defaults to 180 days ago.
|
|
110
110
|
# @option opts [Time] :to_date Inclusive end date (ISO 8601). Defaults to now.
|
|
111
111
|
# @option opts [String] :source Filter by post origin. \"late\" for posts published via Zernio, \"external\" for posts imported from platforms.
|
|
@@ -149,7 +149,7 @@ describe 'AnalyticsApi' do
|
|
|
149
149
|
|
|
150
150
|
# unit tests for get_facebook_post_reactions
|
|
151
151
|
# Get Facebook post reactions
|
|
152
|
-
# Returns the reaction breakdown for a Facebook Page post: a count per reaction type plus the overall total. The whole breakdown is fetched in a single Graph call.
|
|
152
|
+
# Returns the reaction breakdown for a Facebook Page post: a count per reaction type plus the overall total. The whole breakdown is fetched in a single Graph call. The post analytics endpoint reports only an aggregate reaction count (surfaced there as `likes`), so use this endpoint when you need per-type counts.
|
|
153
153
|
# @param account_id The ID of the Facebook Page account
|
|
154
154
|
# @param post_id The Facebook post ID
|
|
155
155
|
# @param [Hash] opts the optional parameters
|
|
@@ -162,7 +162,7 @@ describe 'AnalyticsApi' do
|
|
|
162
162
|
|
|
163
163
|
# unit tests for get_follower_stats
|
|
164
164
|
# Get follower stats
|
|
165
|
-
# Returns follower count history and growth metrics for connected
|
|
165
|
+
# Returns follower count history and growth metrics for connected accounts. Requires analytics add-on subscription. Follower counts are refreshed once per day.
|
|
166
166
|
# @param [Hash] opts the optional parameters
|
|
167
167
|
# @option opts [String] :account_ids Comma-separated list of account IDs (optional, defaults to all user's accounts)
|
|
168
168
|
# @option opts [String] :profile_id Filter by profile ID
|
|
@@ -177,7 +177,7 @@ describe 'AnalyticsApi' do
|
|
|
177
177
|
end
|
|
178
178
|
|
|
179
179
|
# unit tests for get_google_business_performance
|
|
180
|
-
# Get
|
|
180
|
+
# Get Google Business Profile performance metrics
|
|
181
181
|
# Returns daily performance metrics for a Google Business Profile location. Metrics include impressions (Maps/Search, desktop/mobile), website clicks, call clicks, direction requests, conversations, bookings, and food orders. Data may be delayed 2-3 days. Max 18 months of historical data. Requires the Analytics add-on.
|
|
182
182
|
# @param account_id The Zernio SocialAccount ID for the Google Business Profile account.
|
|
183
183
|
# @param [Hash] opts the optional parameters
|
|
@@ -192,7 +192,7 @@ describe 'AnalyticsApi' do
|
|
|
192
192
|
end
|
|
193
193
|
|
|
194
194
|
# unit tests for get_google_business_search_keywords
|
|
195
|
-
# Get
|
|
195
|
+
# Get Google Business Profile search keywords
|
|
196
196
|
# Returns search keywords that triggered impressions for a Google Business Profile location. Data is aggregated monthly. Keywords below a minimum impression threshold set by Google are excluded. Max 18 months of historical data. Requires the Analytics add-on.
|
|
197
197
|
# @param account_id The Zernio SocialAccount ID for the Google Business Profile account.
|
|
198
198
|
# @param [Hash] opts the optional parameters
|
|
@@ -333,7 +333,7 @@ describe 'AnalyticsApi' do
|
|
|
333
333
|
# @param [Hash] opts the optional parameters
|
|
334
334
|
# @option opts [String] :platform Filter by platform (e.g. \"instagram\", \"tiktok\"). Omit for all platforms.
|
|
335
335
|
# @option opts [String] :profile_id Filter by profile ID. Omit for all profiles.
|
|
336
|
-
# @option opts [String] :account_id Filter by
|
|
336
|
+
# @option opts [String] :account_id Filter by account ID. Omit for all accounts.
|
|
337
337
|
# @option opts [String] :source Filter by post origin. \"late\" for posts published via Zernio, \"external\" for posts imported from platforms.
|
|
338
338
|
# @return [GetPostingFrequency200Response]
|
|
339
339
|
describe 'get_posting_frequency test' do
|
|
@@ -422,7 +422,7 @@ describe 'AnalyticsApi' do
|
|
|
422
422
|
|
|
423
423
|
# unit tests for sync_external_posts
|
|
424
424
|
# Sync an external post
|
|
425
|
-
# Fetch an account's latest external posts (published directly on the platform, not through Zernio) on demand, so a
|
|
425
|
+
# Fetch an account's latest external posts (published directly on the platform, not through Zernio) on demand, so a newly published post is retrievable within seconds instead of waiting for the background sync (which refreshes each account at most every ~90 minutes). Primary use case: verifying a submitted post. When a user publishes on the platform and immediately pastes the post URL into your app, call this with `accountId` plus `url` (or `postId`) to confirm the post exists and return its metadata. Behavior: - We check our stored copy first and return immediately if the post is already known (no platform call). - Otherwise we fetch the account's latest posts live from the platform, then match and return the submitted post. - Requests are debounced per account (~15s): if the account was synced inside that window, the live fetch is skipped. `accountId` is required, because a post URL or id alone cannot be resolved to an account, and the account must be connected to Zernio (we use its token to read the platform). Supported for every platform with a listing API (Instagram, Facebook, TikTok, YouTube, X, Threads, Pinterest, Reddit, Bluesky, Google Business Profile, and LinkedIn organization accounts). LinkedIn personal profiles: LinkedIn has no listing API for personal profiles, so a `url` is REQUIRED and imports that single post. Pass any LinkedIn post URL (`linkedin.com/posts/…`, `linkedin.com/feed/update/urn:li:activity:…`) or a `urn:li:share:…` / `urn:li:ugcPost:…` URN. Works for posts published outside Zernio and before the account was connected, any age; the post must be authored by the connected member. Imported posts return full analytics (impressions, reach, reactions, comments, reshares, saves) and keep refreshing on the background analytics cycle, but carry no content/media (LinkedIn does not expose them for personal profiles). `url` accepts any format the platform uses (e.g. `instagram.com/p/…`, `instagram.com/reel/…`, `youtu.be/…`, `youtube.com/shorts/…`, `tiktok.com/@user/video/…`, `vm.tiktok.com` short links, `pinterest.com/pin/…` on any regional domain, and `pin.it` short links). Pass `postId` (the platform media/video/pin id) as an alternative locator. Note: post-level analytics (reach, impressions) still carry the platform's own delay (e.g. ~24h on Instagram). This endpoint confirms the post exists and returns its metadata plus basic engagement (likes, comments), not delayed insights.
|
|
426
426
|
# @param sync_external_posts_request
|
|
427
427
|
# @param [Hash] opts the optional parameters
|
|
428
428
|
# @return [SyncExternalPosts200Response]
|
|
@@ -79,7 +79,7 @@ describe 'CommentsApi' do
|
|
|
79
79
|
|
|
80
80
|
# unit tests for hide_inbox_comment
|
|
81
81
|
# Hide comment
|
|
82
|
-
# Hide a comment on a post. Supported by Facebook, Instagram, Threads, and X
|
|
82
|
+
# Hide a comment on a post. Supported by Facebook, Instagram, Threads, and X. Hidden comments are only visible to the commenter and page admin. For X, the reply must belong to a conversation started by the authenticated user.
|
|
83
83
|
# @param post_id
|
|
84
84
|
# @param comment_id
|
|
85
85
|
# @param hide_inbox_comment_request
|
|
@@ -93,7 +93,7 @@ describe 'CommentsApi' do
|
|
|
93
93
|
|
|
94
94
|
# unit tests for like_inbox_comment
|
|
95
95
|
# Like comment
|
|
96
|
-
# Like or upvote a comment on a post. Supported platforms: Facebook,
|
|
96
|
+
# Like or upvote a comment on a post. Supported platforms: Facebook, X, Bluesky, Reddit, LinkedIn, and Instagram in limited release (see below). For Bluesky, the cid (content identifier) is required in the request body. For LinkedIn, pass the composite comment URN returned by the comments endpoints as commentId; an optional reactionType picks the reaction (defaults to LIKE), and accounts connected before the social-feed scopes were requested get a 403 with code `linkedin_reconnect_required`. Instagram is in LIMITED RELEASE and not generally available: the call needs `instagram_manage_engagement`, which Meta has so far granted this app only under Standard Access, so it works for app admins, developers and testers of our Meta app and returns a 403 with code `PLATFORM_BETA_RESTRICTED` for every other account. That restriction lifts when Meta App Review grants Advanced Access; the constraints below apply once it does. Instagram covers comments and replies on feed posts, reels and carousels. Only an account connected through Facebook Login can be granted `instagram_manage_engagement`: an Instagram Login connection returns a 400 with code `instagram_likes_require_facebook_login`, and an account whose token predates the permission returns a 403 with code `reconnect_required`. Content from private accounts cannot be liked. Instagram also enforces a burst limit of 50 like or unlike calls per 5 seconds per Instagram account, and exceeding it locks that account out of the like API for an hour, so pace bulk loops.
|
|
97
97
|
# @param post_id
|
|
98
98
|
# @param comment_id
|
|
99
99
|
# @param like_inbox_comment_request
|
|
@@ -107,7 +107,7 @@ describe 'CommentsApi' do
|
|
|
107
107
|
|
|
108
108
|
# unit tests for like_post
|
|
109
109
|
# Like post
|
|
110
|
-
# Like (or react to) a post as a connected account. Supported platforms: LinkedIn,
|
|
110
|
+
# Like (or react to) a post as a connected account. Supported platforms: LinkedIn, X, Facebook, YouTube, Bluesky, and Instagram in limited release (see below). Threads, TikTok and Pinterest expose no like endpoint in their APIs and return 400. Reddit returns 400 too, pointing at `POST /v1/accounts/{accountId}/reddit-vote`, which covers upvote, downvote and clear on both posts and comments. The account does not have to be the one that published the post, which is what makes executive engagement possible: pass an exec's `accountId` and the brand post's ID. `postId` accepts either a Zernio post ID or the platform's native post ID. A Zernio post ID resolves to the entry for `accountId`, falling back to the post's single entry on the same platform (two entries on that platform is a 400, so pass the native ID). LinkedIn requires the `w_member_social_feed` / `w_organization_social_feed` scopes, which are not retroactive: accounts connected before those were requested get a 403 with code `linkedin_reconnect_required` until the user reconnects the account. YouTube spends 50 quota units per call. Instagram is in LIMITED RELEASE and not generally available: the call needs `instagram_manage_engagement`, which Meta has so far granted this app only under Standard Access, so it works for app admins, developers and testers of our Meta app and returns a 403 with code `PLATFORM_BETA_RESTRICTED` for every other account. That restriction lifts when Meta App Review grants Advanced Access; the constraints below apply once it does. Instagram covers feed images, reels and carousels (stories and private-account media are not likeable). Only an account connected through Facebook Login can be granted `instagram_manage_engagement`: an Instagram Login connection returns a 400 with code `instagram_likes_require_facebook_login`, and an account whose token predates the permission returns a 403 with code `reconnect_required`. Instagram also enforces a burst limit of 50 like or unlike calls per 5 seconds per Instagram account, and exceeding it locks that account out of the like API for an hour, so pace bulk loops.
|
|
111
111
|
# @param post_id Zernio post ID or the platform's native post ID
|
|
112
112
|
# @param like_post_request
|
|
113
113
|
# @param [Hash] opts the optional parameters
|
|
@@ -120,7 +120,7 @@ describe 'CommentsApi' do
|
|
|
120
120
|
|
|
121
121
|
# unit tests for list_inbox_comments
|
|
122
122
|
# List commented posts
|
|
123
|
-
# Returns posts with comment counts from all connected accounts. Aggregates data across multiple accounts. Responses are cached for up to 10 minutes, so the feed may lag new comments by that window. Do not poll this endpoint for real-time updates: subscribe to the `comment.received` webhook, which fires for every new comment across your posts and carries the post reference needed to keep this list current. For users with the Ads add-on (
|
|
123
|
+
# Returns posts with comment counts from all connected accounts. Aggregates data across multiple accounts. Responses are cached for up to 10 minutes, so the feed may lag new comments by that window. Do not poll this endpoint for real-time updates: subscribe to the `comment.received` webhook, which fires for every new comment across your posts and carries the post reference needed to keep this list current. For users with the Ads add-on (accounts on usage-based billing always qualify), the user's Meta ads (boosted/dark posts) are included too. There's one row per (ad, placement-with-comments): an ad that runs on both Facebook feed and Instagram feed produces up to two rows (the Page dark post and the IG media have separate comment threads), each flagged `isAd: true` with `adId` and `placement` (`id` is `{adId}:{placement}`). Use `?platform=metaads` to return *only* ad rows; passing `facebook`/`instagram` returns *organic* posts only (no ads); omitting `platform` returns both. Fetch a row's thread from GET /v1/ads/{adId}/comments?placement={placement}. Ad comment counts are read with the Marketing API token (Facebook side) or the connected Instagram account's token (Instagram side); a row whose count can't be read is omitted. Pagination walks each account's platform listing. Following `nextCursor` reaches past the first page on Facebook, Instagram, Threads, LinkedIn and YouTube, since they are the platforms that support a server-side date window; on the others the listing stops at its first page. Cursor pagination is only coherent for the default sort (`sortBy=date`, `sortOrder=desc`): with `sortOrder=asc`, or with `sortBy=comments`, the cursor filter does not match the sort order and the second page is unreliable. `nextCursor` is opaque: pass it back verbatim, never construct or parse it, its composition may change without notice. Because each page re-queries a live window, results can still shift between requests, so dedupe by `id` on the client. `commentCount` semantics differ by platform: YouTube's includes replies, Facebook's counts top-level comments only.
|
|
124
124
|
# @param [Hash] opts the optional parameters
|
|
125
125
|
# @option opts [String] :profile_id Filter by profile ID
|
|
126
126
|
# @option opts [String] :platform Filter by platform. `metaads` is a synthetic value meaning the user's ads (boosted/dark posts) only; `facebook`/`instagram` return organic posts only.
|
|
@@ -130,7 +130,7 @@ describe 'CommentsApi' do
|
|
|
130
130
|
# @option opts [String] :sort_order Sort order
|
|
131
131
|
# @option opts [Integer] :limit
|
|
132
132
|
# @option opts [String] :cursor
|
|
133
|
-
# @option opts [String] :account_id Filter by specific
|
|
133
|
+
# @option opts [String] :account_id Filter by specific account ID
|
|
134
134
|
# @return [ListInboxComments200Response]
|
|
135
135
|
describe 'list_inbox_comments test' do
|
|
136
136
|
it 'should work' do
|
|
@@ -154,7 +154,7 @@ describe 'CommentsApi' do
|
|
|
154
154
|
|
|
155
155
|
# unit tests for send_private_reply_to_comment
|
|
156
156
|
# Send private reply
|
|
157
|
-
# Send a
|
|
157
|
+
# Send a direct message to the author of a comment. Supported on Instagram and Facebook only. One reply per comment, must be sent within 7 days. Optionally attach interactive elements: `quickReplies` (chips above the keyboard, max 13) or `buttons` (1-3 inline postback/url buttons rendered in the same bubble via Meta's button_template). Chips do not render in the Instagram Message Requests folder. Since late August 2026 Instagram refuses buttons, cards and attachments to commenters who do not follow the account (Meta code 2, subcode 1545133, returned here as a non-retryable 400 that says so), and the failed call still consumes the comment's single private reply. To reach non-followers send plain text and add buttons once they reply. `quickReplies` and `buttons` are mutually exclusive. When the comment's single private reply is spent (by this call or an earlier one) the 400 carries `details.privateReplyConsumed: true`; never retry it.
|
|
158
158
|
# @param post_id The media/post ID (Instagram media ID or Facebook post ID)
|
|
159
159
|
# @param comment_id The comment ID to send a private reply to
|
|
160
160
|
# @param send_private_reply_to_comment_request
|
|
@@ -168,7 +168,7 @@ describe 'CommentsApi' do
|
|
|
168
168
|
|
|
169
169
|
# unit tests for set_comment_moderation
|
|
170
170
|
# Set comment moderation status
|
|
171
|
-
# Set a comment's moderation status. Supported on YouTube only. Use this to work a moderation queue: approve a held comment (`published`), reject it (`rejected`), or send it back for review (`heldForReview`). The request must be authorized by the owner of the channel or video the comment belongs to. You cannot moderate comments on videos you do not own. This is distinct from `POST /v1/inbox/comments/{postId}/{commentId}/hide`, which covers Facebook, Instagram, Threads, and X
|
|
171
|
+
# Set a comment's moderation status. Supported on YouTube only. Use this to work a moderation queue: approve a held comment (`published`), reject it (`rejected`), or send it back for review (`heldForReview`). The request must be authorized by the owner of the channel or video the comment belongs to. You cannot moderate comments on videos you do not own. This is distinct from `POST /v1/inbox/comments/{postId}/{commentId}/hide`, which covers Facebook, Instagram, Threads, and X and does not apply to YouTube.
|
|
172
172
|
# @param post_id
|
|
173
173
|
# @param comment_id
|
|
174
174
|
# @param set_comment_moderation_request
|
|
@@ -182,7 +182,7 @@ describe 'CommentsApi' do
|
|
|
182
182
|
|
|
183
183
|
# unit tests for unhide_inbox_comment
|
|
184
184
|
# Unhide comment
|
|
185
|
-
# Unhide a previously hidden comment. Supported by Facebook, Instagram, Threads, and X
|
|
185
|
+
# Unhide a previously hidden comment. Supported by Facebook, Instagram, Threads, and X.
|
|
186
186
|
# @param post_id
|
|
187
187
|
# @param comment_id
|
|
188
188
|
# @param account_id
|
|
@@ -196,7 +196,7 @@ describe 'CommentsApi' do
|
|
|
196
196
|
|
|
197
197
|
# unit tests for unlike_inbox_comment
|
|
198
198
|
# Unlike comment
|
|
199
|
-
# Remove a like from a comment. Supported platforms: Facebook,
|
|
199
|
+
# Remove a like from a comment. Supported platforms: Facebook, X, Bluesky, Reddit, LinkedIn, and Instagram in limited release. For Bluesky, the likeUri query parameter is required. Instagram has the same limited release, Facebook Login, `instagram_manage_engagement` and burst-limit constraints as liking.
|
|
200
200
|
# @param post_id
|
|
201
201
|
# @param comment_id
|
|
202
202
|
# @param account_id
|
|
@@ -211,7 +211,7 @@ describe 'CommentsApi' do
|
|
|
211
211
|
|
|
212
212
|
# unit tests for unlike_post
|
|
213
213
|
# Unlike post
|
|
214
|
-
# Remove this account's like from a post. Supported platforms: LinkedIn,
|
|
214
|
+
# Remove this account's like from a post. Supported platforms: LinkedIn, X, Facebook, YouTube, Bluesky, and Instagram in limited release. On YouTube this clears the rating. Instagram has the same limited release, Facebook Login, `instagram_manage_engagement` and burst-limit constraints as liking. For Bluesky, `likeUri` (returned when the post was liked) is required. Reddit uses `POST /v1/accounts/{accountId}/reddit-vote` with `direction: 0`.
|
|
215
215
|
# @param post_id Zernio post ID or the platform's native post ID
|
|
216
216
|
# @param account_id
|
|
217
217
|
# @param [Hash] opts the optional parameters
|
|
@@ -33,9 +33,9 @@ describe 'ConnectApi' do
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# unit tests for assign_google_business_location
|
|
36
|
-
# Assign
|
|
37
|
-
# Connect a Google Business location onto a DIFFERENT profile by reusing the OAuth grant from an already-connected
|
|
38
|
-
# @param account_id A source connected
|
|
36
|
+
# Assign Google Business Profile location to another profile
|
|
37
|
+
# Connect a Google Business Profile location onto a DIFFERENT profile by reusing the OAuth grant from an already-connected Google Business Profile account, with no browser and no re-authorization. Built for agencies whose single Google account has manager access to many client locations and who run one profile per client: connect one location the normal way (browser OAuth), then bulk-assign the rest onto each client's profile via this endpoint. The path `accountId` is a SOURCE connected Google Business Profile account (the token holder); the body `profileId` is the TARGET profile. Returns 409 if the target profile already has a Google Business Profile connection (switch its location with PUT gmb-locations instead).
|
|
38
|
+
# @param account_id A source connected Google Business Profile account whose OAuth grant is reused.
|
|
39
39
|
# @param assign_google_business_location_request
|
|
40
40
|
# @param [Hash] opts the optional parameters
|
|
41
41
|
# @return [AssignGoogleBusinessLocation200Response]
|
|
@@ -84,12 +84,12 @@ describe 'ConnectApi' do
|
|
|
84
84
|
|
|
85
85
|
# unit tests for connect_ads
|
|
86
86
|
# Connect ads for a platform
|
|
87
|
-
# Unified ads connection endpoint. Creates a dedicated ads SocialAccount for the specified platform. Same-token platforms (facebook, instagram, linkedin, pinterest)
|
|
87
|
+
# Unified ads connection endpoint. Creates a dedicated ads SocialAccount for the specified platform. **Same-token platforms (facebook, instagram, linkedin, pinterest).** The ads SocialAccount (metaads, linkedinads, pinterestads) reuses the OAuth token of the parent posting account, but only when an active parent exists and, for facebook and instagram, its stored token carries ads_management and ads_read (linkedin and pinterest need no extra scope). In that case no extra OAuth happens and the response is alreadyConnected: true. When no such parent exists, or the scopes are missing, the endpoint returns an authUrl and a full OAuth round trip is required. When a parent exists but carries no token usable for ad accounts, the call fails with 400 RECONNECT_REQUIRED. Independently of the branch, the call can return 403 ADS_ADDON_REQUIRED without the ads add-on and 402 PAYMENT_REQUIRED when the billing gate is closed. Meta Ads prerequisite: connecting Meta Ads (via facebook or instagram) requires a Facebook Page. Not because the ad account is read through a Page, but because both parent posting accounts are: the facebook flow only offers Pages you manage, and the instagram flow with loginMethod=facebook_login only offers Instagram accounts linked to one of those Pages. Without a Page there is no parent account to inherit a token from. A user who manages no Facebook Page cannot complete this connection, and the facebook flow ends with error=no_facebook_pages. **Separate-token platforms (tiktok, twitter).** Starts the platform-specific marketing API OAuth flow and creates an ads SocialAccount (tiktokads, xads) with its own token. If the ads account already exists, returns alreadyConnected: true. - tiktok: accountId is OPTIONAL. With accountId, the new tiktokads account links to that posting account (parentAccountId set), so Spark Ads + standalone ads using the posting TT_USER identity become available. Without accountId, ads-only mode kicks in: the new tiktokads account has parentAccountId=null and standalone ads use a synthetic CUSTOMIZED_USER (\"Brand Identity\"); Spark Ads are unavailable because TikTok requires a posting account for them. The Brand Identity is configured separately via PATCH /v1/connect/tiktok-ads (or inline on POST /v1/ads/create via the brandIdentity field). - twitter (X Ads): accountId is REQUIRED. There's no ads-only mode, because tweets need to be authored by a real X user. **Standalone platforms (googleads).** Starts the Google Ads OAuth flow and creates a standalone ads SocialAccount (googleads) with no parent. If the account already exists, returns alreadyConnected: true. Ads accounts appear as regular SocialAccount documents with ads platform values (e.g., metaads, tiktokads) in GET /v1/accounts.
|
|
88
88
|
# @param platform Platform to connect ads for. Only platforms with ads support are accepted. `instagram` requires an Instagram account connected with loginMethod=facebook_login whose token carries ads_management and ads_read. With an account connected through the default instagram_login flow no ads account can be created; do not use this value for those accounts.
|
|
89
89
|
# @param profile_id Your Zernio profile ID
|
|
90
90
|
# @param [Hash] opts the optional parameters
|
|
91
|
-
# @option opts [String] :account_id Existing SocialAccount ID. Required for `twitter` (X Ads). Optional for `tiktok`
|
|
92
|
-
# @option opts [String] :redirect_url Custom URL the browser is sent to once the OAuth flow finishes. Honored on every ads platform, including the separate-token (`tiktok`, `twitter`) and standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is rejected with 400 INVALID_REDIRECT_URL. On success `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`) append `connected`, `profileId`, `accountId`, `username` and, on API-key calls, `connect_token`. On failure the same error contract applies as on GET /v1/connect/{platform}: `error` and `platform` are always appended, other params are optional, and the value list there is not exhaustive.
|
|
91
|
+
# @option opts [String] :account_id Existing SocialAccount ID. Required for `twitter` (X Ads). Optional for `tiktok`: omit to enter ads-only mode (no TikTok posting account linked; ad creation uses a Brand Identity instead of a TT_USER). Ignored for same-token (`facebook`, `instagram`, `linkedin`, `pinterest`) and standalone (`googleads`) platforms.
|
|
92
|
+
# @option opts [String] :redirect_url Custom URL the browser is sent to once the OAuth flow finishes. Honored on every ads platform, including the separate-token (`tiktok`, `twitter`) and standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is rejected with 400 INVALID_REDIRECT_URL. On success `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`) append `connected`, `profileId`, `accountId`, `username` and, on API-key calls, `connect_token`. On failure the same error contract applies as on GET /v1/connect/{platform}: `error` and `platform` are always appended, other params are optional, and the value list there is not exhaustive. On the tiktok, twitter and googleads flows `platform` carries the ads platform id (`tiktokads`, `xads`, `googleads`), not the value used in the request path. When omitted, the browser lands on the Zernio dashboard.
|
|
93
93
|
# @option opts [Boolean] :headless Enable headless mode (same-token platforms only)
|
|
94
94
|
# @option opts [Boolean] :force Force a fresh OAuth even when an account already exists. Normally the endpoint returns `alreadyConnected: true` whenever a connected account is found, keying off its active state rather than token liveness. Set `force=true` to bypass that and always receivean `authUrl`. Completing the returned OAuth refreshes the stored token on the existing posting and ads accounts in place.
|
|
95
95
|
# @option opts [String] :ad_account_id Scope ad sync to a single platform ad account. Without this param, sync covers every ad account the connected token can see. Supported on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare numeric sponsored-account id), `googleads` (bare customer id digits) and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers at OAuth and `pinterest` has no ads discovery, so both ignore it. Meta ids are additionally validated against the connected token; unreachable IDs return 400. Setting a scope also removes already synced ads from de-scoped ad accounts. For multiple accounts use `adAccountIds` instead.
|
|
@@ -175,7 +175,7 @@ describe 'ConnectApi' do
|
|
|
175
175
|
|
|
176
176
|
# unit tests for connect_whats_app_embedded_signup
|
|
177
177
|
# Connect WhatsApp from Embedded Signup
|
|
178
|
-
#
|
|
178
|
+
# Finish a WhatsApp connection started with Meta's Embedded Signup in your own page (Facebook JavaScript SDK). The code never passes through a `redirect_url`, so `POST /v1/connect/{platform}` cannot accept it. The flow: call `GET /v1/connect/whatsapp/sdk-config`, run `FB.login` with that `configId`, `response_type: 'code'`, `override_default_response_type: true` and `extras: { sessionInfoVersion: '3' }`, read `waba_id` and `phone_number_id` from the `WA_EMBEDDED_SIGNUP` message event Meta posts to your window, then send the `code` from the login response here together with those ids. Always forward `wabaId` and `phoneNumberId`: Zernio connects exactly that number and no picker is shown. Without them Zernio falls back to the first number of the first WhatsApp Business Account the token can reach, which may not be the one the user picked. The Zernio Meta app must list the domain that hosts the popup before `FB.login` will open there. Available on request: send the domains to support.
|
|
179
179
|
# @param connect_whats_app_embedded_signup_request
|
|
180
180
|
# @param [Hash] opts the optional parameters
|
|
181
181
|
# @return [nil]
|
|
@@ -229,7 +229,7 @@ describe 'ConnectApi' do
|
|
|
229
229
|
end
|
|
230
230
|
|
|
231
231
|
# unit tests for get_gmb_locations
|
|
232
|
-
# List
|
|
232
|
+
# List Google Business Profile locations
|
|
233
233
|
# Returns Google Business Profile locations the connected account can access, plus the currently selected location. The list is bounded (see hasMore); for accounts that own many locations, use the search or filter query params to find a specific one instead of loading them all, or raise limit to enumerate an account with more than 100 locations.
|
|
234
234
|
# @param account_id
|
|
235
235
|
# @param [Hash] opts the optional parameters
|
|
@@ -257,7 +257,7 @@ describe 'ConnectApi' do
|
|
|
257
257
|
|
|
258
258
|
# unit tests for get_pending_o_auth_data
|
|
259
259
|
# Get pending OAuth data
|
|
260
|
-
# Fetch pending OAuth data for headless mode using the pendingDataToken from the redirect URL. **Scope**: This endpoint is used for LinkedIn organizations, Google Business locations, Slack channels, Snapchat profiles, and Pinterest boards, where the selection list is too large to fit in URL params. The redirect carries a `pendingDataToken` instead of the full payload; the response includes the corresponding selection array (e.g. `boards` for Pinterest). WhatsApp, Facebook and other platforms pass selection state directly via URL query params on the redirect (`profileId`, `tempToken`, `step`), no pending record is created, so this endpoint will return 404 for those flows. Use the platform-specific selection endpoint instead (e.g. `/v1/connect/whatsapp/select-phone-number`). Reading the token does not consume it, so this fetch is repeatable until the token expires 1 hour after issuance. Completing the platform selection deletes the pending record, so the token stops working from then on. No authentication required.
|
|
260
|
+
# Fetch pending OAuth data for headless mode using the pendingDataToken from the redirect URL. **Scope**: This endpoint is used for LinkedIn organizations, Google Business Profile locations, Slack channels, Snapchat profiles, and Pinterest boards, where the selection list is too large to fit in URL params. The redirect carries a `pendingDataToken` instead of the full payload; the response includes the corresponding selection array (e.g. `boards` for Pinterest). WhatsApp, Facebook and other platforms pass selection state directly via URL query params on the redirect (`profileId`, `tempToken`, `step`), no pending record is created, so this endpoint will return 404 for those flows. Use the platform-specific selection endpoint instead (e.g. `/v1/connect/whatsapp/select-phone-number`). Reading the token does not consume it, so this fetch is repeatable until the token expires 1 hour after issuance. Completing the platform selection deletes the pending record, so the token stops working from then on. No authentication required.
|
|
261
261
|
# @param token The pending data token from the OAuth redirect URL (pendingDataToken parameter)
|
|
262
262
|
# @param [Hash] opts the optional parameters
|
|
263
263
|
# @return [GetPendingOAuthData200Response]
|
|
@@ -343,6 +343,17 @@ describe 'ConnectApi' do
|
|
|
343
343
|
end
|
|
344
344
|
end
|
|
345
345
|
|
|
346
|
+
# unit tests for get_whats_app_sdk_config
|
|
347
|
+
# Get Embedded Signup SDK config
|
|
348
|
+
# The public values needed to run Meta's Embedded Signup inside your own page with the Facebook JavaScript SDK instead of the redirect flow: pass `appId` and `graphApiVersion` to `FB.init`, and `configId` as `config_id` to `FB.login`. The popup then reports the WhatsApp Business Account and phone number the user picked through the `WA_EMBEDDED_SIGNUP` message event, and you finish the connection with `POST /v1/connect/whatsapp/embedded-signup`. Because the number comes back from the popup, the user never sees a second number picker. Available on request: `FB.login` only opens on HTTPS domains listed in the Zernio Meta app, so send the domains that will host the popup to support before going live.
|
|
349
|
+
# @param [Hash] opts the optional parameters
|
|
350
|
+
# @return [GetWhatsAppSdkConfig200Response]
|
|
351
|
+
describe 'get_whats_app_sdk_config test' do
|
|
352
|
+
it 'should work' do
|
|
353
|
+
# assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
|
|
346
357
|
# unit tests for get_youtube_captions
|
|
347
358
|
# Get a YouTube video transcript
|
|
348
359
|
# Returns the caption track YouTube already holds for one of the connected channel's own videos, as plain text plus timed cues. Use it instead of downloading and transcribing the video yourself. Auto-generated (ASR) tracks are included: YouTube serves them to the channel owner, which is what the connected account is. Uploaded tracks win over auto-generated ones when both exist for a language. Caching: we store the transcript on first read and serve it from there afterwards, so you do not need to cache it yourself. A cached read costs no YouTube quota and does not call YouTube at all. `source` tells you which happened (`youtube` on the first read, `cache` after). Pass `refresh=true` only when the captions actually changed on YouTube, since that re-downloads. Notes: - Only videos owned by this connected channel. Anything else returns 404. - `contentDetails.caption` in YouTube's own API reads `false` on videos that DO have a serving auto-generated track, so it is not a usable availability signal. Call this endpoint and handle the 404. - YouTube generates auto-captions only for videos with recognisable speech, and can take a few hours after upload to publish them.
|
|
@@ -373,7 +384,7 @@ describe 'ConnectApi' do
|
|
|
373
384
|
|
|
374
385
|
# unit tests for handle_o_auth_callback
|
|
375
386
|
# Complete OAuth callback
|
|
376
|
-
# Exchange the OAuth authorization code for tokens and connect the account to the specified profile. Facebook, Google Business, Snapchat and WhatsApp are not accepted here: their account identity is a destination chosen after OAuth, which this single-shot exchange cannot do. Connect them through the redirect flow from `GET /v1/connect/{platform}`, or, for WhatsApp Embedded Signup, through `POST /v1/connect/whatsapp/embedded-signup`.
|
|
387
|
+
# Exchange the OAuth authorization code for tokens and connect the account to the specified profile. Facebook, Google Business Profile, Snapchat and WhatsApp are not accepted here: their account identity is a destination chosen after OAuth, which this single-shot exchange cannot do. Connect them through the redirect flow from `GET /v1/connect/{platform}`, or, for WhatsApp Embedded Signup, through `POST /v1/connect/whatsapp/embedded-signup`.
|
|
377
388
|
# @param platform Social platform to complete the connect for. Discord, Slack and Telegram are absent because they are served by their own dedicated routes, documented separately.
|
|
378
389
|
# @param handle_o_auth_callback_request
|
|
379
390
|
# @param [Hash] opts the optional parameters
|
|
@@ -410,8 +421,8 @@ describe 'ConnectApi' do
|
|
|
410
421
|
end
|
|
411
422
|
|
|
412
423
|
# unit tests for list_google_business_locations
|
|
413
|
-
# List
|
|
414
|
-
# For headless flows. Returns the list of
|
|
424
|
+
# List Google Business Profile locations
|
|
425
|
+
# For headless flows. Returns the list of Google Business Profile locations the user can manage. Use pendingDataToken (from the OAuth callback redirect) to list locations without consuming the token, so it remains available for select-location. Use X-Connect-Token header if connecting via API key.
|
|
415
426
|
# @param [Hash] opts the optional parameters
|
|
416
427
|
# @option opts [String] :profile_id Profile ID from your connection flow. Required for auth validation when provided.
|
|
417
428
|
# @option opts [String] :pending_data_token Token from the OAuth callback redirect. Preferred over tempToken because it preserves server-side token storage. One of pendingDataToken or tempToken is required.
|
|
@@ -440,7 +451,7 @@ describe 'ConnectApi' do
|
|
|
440
451
|
|
|
441
452
|
# unit tests for list_linked_in_organizations
|
|
442
453
|
# List LinkedIn orgs
|
|
443
|
-
# Fetch full LinkedIn organization details (logos, vanity names, websites) for custom UI. No authentication required,
|
|
454
|
+
# Fetch full LinkedIn organization details (logos, vanity names, websites) for custom UI. No authentication required, only the tempToken from OAuth.
|
|
444
455
|
# @param temp_token The temporary LinkedIn access token from the OAuth redirect
|
|
445
456
|
# @param org_ids Comma-separated list of organization IDs to fetch details for (max 100)
|
|
446
457
|
# @param [Hash] opts the optional parameters
|
|
@@ -521,8 +532,8 @@ describe 'ConnectApi' do
|
|
|
521
532
|
end
|
|
522
533
|
|
|
523
534
|
# unit tests for select_google_business_location
|
|
524
|
-
# Select
|
|
525
|
-
# Complete the headless
|
|
535
|
+
# Select Google Business Profile location
|
|
536
|
+
# Complete the headless Google Business Profile flow by saving the user's selected location. The pendingDataToken is returned in your redirect URL after OAuth completes (step=select_location). Tokens and profile data are stored server-side, so only the pendingDataToken is needed here. Use X-Connect-Token header if connecting via API key.
|
|
526
537
|
# @param select_google_business_location_request
|
|
527
538
|
# @param [Hash] opts the optional parameters
|
|
528
539
|
# @return [SelectGoogleBusinessLocation200Response]
|
|
@@ -608,8 +619,8 @@ describe 'ConnectApi' do
|
|
|
608
619
|
end
|
|
609
620
|
|
|
610
621
|
# unit tests for update_gmb_location
|
|
611
|
-
# Update
|
|
612
|
-
# Switch which
|
|
622
|
+
# Update Google Business Profile location
|
|
623
|
+
# Switch which Google Business Profile location is active for a connected account.
|
|
613
624
|
# @param account_id
|
|
614
625
|
# @param update_gmb_location_request
|
|
615
626
|
# @param [Hash] opts the optional parameters
|
|
@@ -48,7 +48,7 @@ describe 'ConversionsApi' do
|
|
|
48
48
|
|
|
49
49
|
# unit tests for adjust_conversions
|
|
50
50
|
# Adjust uploaded conversions
|
|
51
|
-
# Adjust conversions that were previously uploaded via `POST /v1/ads/conversions`
|
|
51
|
+
# Adjust conversions that were previously uploaded via `POST /v1/ads/conversions`: retract them, restate their value, or enhance them with first-party data. Requires the Ads add-on. **Google Ads only.** Google handles adjustments through the classic Google Ads API (`ConversionAdjustmentUploadService`); the Data Manager `ingestEvents` path used for sending conversions is ingest-only. Meta and LinkedIn have no equivalent, so this endpoint returns `405` for those platforms. Adjustment types: - `RETRACTION`: remove the conversion entirely (refund, chargeback, cancelled order, churn). - `RESTATEMENT`: change the conversion's value (upgrade / downgrade / partial refund). Send the corrected **total** value in `restatementValue` (not a delta). - `ENHANCEMENT`: attach first-party identifiers (hashed email / phone) to an existing conversion (enhanced conversions applied after the fact). Identifying the original conversion (per adjustment): - `orderId`: the transaction ID you sent as `eventId` on the original conversion. Recommended, and **required** for `ENHANCEMENT`. - or `gclid` + `conversionTime`: the click ID and the original conversion's time (unix seconds). Not available for `ENHANCEMENT`. `destinationId` is the conversion action resource name, e.g. `customers/1234567890/conversionActions/987654321` (same value you send to `POST /v1/ads/conversions`). PII in `user` is hashed with SHA-256 server-side (Gmail-specific normalization included). Send plaintext. Times are unix seconds; we convert to Google's required `yyyy-MM-dd HH:mm:ss+00:00` format. Up to 2000 adjustments per request; partial failure is supported (inspect `adjustmentsFailed` / `failures[]`).
|
|
52
52
|
# @param adjust_conversions_request
|
|
53
53
|
# @param [Hash] opts the optional parameters
|
|
54
54
|
# @return [AdjustConversions200Response]
|
|
@@ -85,7 +85,7 @@ describe 'ConversionsApi' do
|
|
|
85
85
|
|
|
86
86
|
# unit tests for delete_conversion_destination
|
|
87
87
|
# Delete a conversion destination
|
|
88
|
-
# LinkedIn-only today. LinkedIn does not expose hard-delete on conversion rules
|
|
88
|
+
# LinkedIn-only today. LinkedIn does not expose hard-delete on conversion rules; what their UI calls \"delete\" is the same `enabled: false` flip we apply here. The rule remains fetchable via GET with `status: 'inactive'`; the unified discovery endpoint hides it by default. `adAccountId` may be passed as a query parameter (recommended) or as a JSON body field for clients that can send DELETE bodies.
|
|
89
89
|
# @param account_id
|
|
90
90
|
# @param destination_id
|
|
91
91
|
# @param [Hash] opts the optional parameters
|
|
@@ -157,7 +157,7 @@ describe 'ConversionsApi' do
|
|
|
157
157
|
|
|
158
158
|
# unit tests for list_conversion_associations
|
|
159
159
|
# List associated campaigns
|
|
160
|
-
# LinkedIn-only today. Returns the campaigns currently associated with this conversion rule.
|
|
160
|
+
# LinkedIn-only today. Returns the campaigns currently associated with this conversion rule. Auto-association on rule creation runs once at create time; campaigns created after the rule still need explicit association.
|
|
161
161
|
# @param account_id
|
|
162
162
|
# @param destination_id
|
|
163
163
|
# @param ad_account_id
|
|
@@ -171,7 +171,7 @@ describe 'ConversionsApi' do
|
|
|
171
171
|
|
|
172
172
|
# unit tests for list_conversion_destinations
|
|
173
173
|
# List conversion destinations
|
|
174
|
-
# Returns the list of pixels (Meta), conversion actions (Google), conversion rules (LinkedIn), or pixels (OpenAI Ads) accessible to the connected ads account. Use the returned `id` as `destinationId` when posting to `POST /v1/ads/conversions`. For Google and LinkedIn, each destination's `type` reflects the conversion type (PURCHASE, LEAD, SIGN_UP, etc.)
|
|
174
|
+
# Returns the list of pixels (Meta), conversion actions (Google), conversion rules (LinkedIn), or pixels (OpenAI Ads) accessible to the connected ads account. Use the returned `id` as `destinationId` when posting to `POST /v1/ads/conversions`. For Google and LinkedIn, each destination's `type` reflects the conversion type (PURCHASE, LEAD, SIGN_UP, etc.), and the event type is locked to the destination. For Meta and OpenAI Ads, `type` is absent: pixels accept any event name per request. For LinkedIn, destinations are returned across every sponsored ad account the connected token can access; the `adAccountId` field on each destination identifies the parent ad account and is required for subsequent CRUD calls (update, delete, associations, metrics).
|
|
175
175
|
# @param account_id SocialAccount ID (metaads, googleads, linkedinads, tiktokads, or openaiads).
|
|
176
176
|
# @param [Hash] opts the optional parameters
|
|
177
177
|
# @return [ListConversionDestinations200Response]
|
|
@@ -198,7 +198,7 @@ describe 'ConversionsApi' do
|
|
|
198
198
|
|
|
199
199
|
# unit tests for send_conversions
|
|
200
200
|
# Send conversion events
|
|
201
|
-
# Relay one or more conversion events to the target ad platform's native Conversions API. Platform is inferred from the provided `accountId`. Requires the Ads add-on. Supported platforms: - Meta (`metaads`) via Graph API - Google Ads (`googleads`) via Data Manager API `ingestEvents` - LinkedIn (`linkedinads`) via `/rest/conversionEvents` - TikTok (`tiktokads`) via the Offline Events API `/offline/batch/`
|
|
201
|
+
# Relay one or more conversion events to the target ad platform's native Conversions API. Platform is inferred from the provided `accountId`. Requires the Ads add-on. Supported platforms: - Meta (`metaads`) via Graph API - Google Ads (`googleads`) via Data Manager API `ingestEvents` - LinkedIn (`linkedinads`) via `/rest/conversionEvents` - TikTok (`tiktokads`) via the Offline Events API `/offline/batch/` (OFFLINE conversions only) - OpenAI Ads (`openaiads`) via its Conversions API (a separate host, `bzr.openai.com`) `destinationId` semantics differ per platform: - Meta: pixel (dataset) ID, e.g. `123456789012345` - Google: conversion action resource name, e.g. `customers/1234567890/conversionActions/987654321` - LinkedIn: conversion rule ID or URN, e.g. `104012` or `urn:lla:llaPartnerConversion:104012` - TikTok: Offline Event Set ID, e.g. `7057103914977558530` - OpenAI Ads: pixel wire id (numeric `pixel_id`, distinct from the internal pixel id), as returned by `GET /v1/accounts/{accountId}/conversion-destinations` TikTok notes: this path sends OFFLINE conversions (in-store / CRM / call-center), not web-pixel events. Each event must carry an email or phone (TikTok requires at least one). The connected TikTok ads account must have granted the Offline Events permission; older grants must reconnect. OpenAI Ads notes: requires a tracking tag (pixel) to already exist on the account. Returns 422 with code `TRACKING_TAG_REQUIRED` if `POST /v1/accounts/{accountId}/tracking-tags` hasn't been called yet. Callers can list valid destinations via `GET /v1/accounts/{accountId}/conversion-destinations`. All PII (email, phone, names, external IDs) is hashed with SHA-256 server-side per each platform's normalization spec, including Google's Gmail-specific dot/plus-suffix stripping. Send plaintext. LinkedIn `externalIds` are passed through as plaintext per LinkedIn's spec; only emails and phones are hashed. For LinkedIn, the connected account must have been authorized after the Conversions API rollout (i.e. the OAuth grant must include `rw_conversions`). Older accounts must reconnect. Batching is handled automatically. Meta caps at 1000 events per request and rejects the entire batch if any event is malformed. Google caps at 2000. LinkedIn caps at 5000 and is also all-or-nothing per chunk. OpenAI Ads caps at 1000 per request; larger submissions are split into 1000-event chunks, each all-or-nothing (a malformed event fails every event in that chunk, not the whole request). Dedup: pass a stable `eventId` on every event. Meta and LinkedIn use it to dedupe against browser-side pixel/Insight Tag events; Google maps it to `transactionId`. Per-platform `eventName` semantics: - Meta: free-form. Standard names (Purchase, Lead, ...) match Meta's built-in events; custom strings are accepted. - Google: ignored. The conversion action's category determines the event type. Send the standard name closest to your action for documentation, but the platform will not branch on it. - LinkedIn: ignored. The conversion rule's `type` (LEAD, PURCHASE, etc.) is locked to the destination at rule-creation time. Send the standard name for documentation; LinkedIn does not branch on it. - OpenAI Ads: a fixed subset of standard names (Purchase, Lead, AddToCart, ViewContent, InitiateCheckout, CompleteRegistration, Subscribe, StartTrial, Schedule) maps 1:1 onto OpenAI's own event-type enum; any other standard name or custom string is sent as `type: custom` with the name preserved.
|
|
202
202
|
# @param send_conversions_request
|
|
203
203
|
# @param [Hash] opts the optional parameters
|
|
204
204
|
# @return [SendConversions200Response]
|
|
@@ -210,7 +210,7 @@ describe 'ConversionsApi' do
|
|
|
210
210
|
|
|
211
211
|
# unit tests for update_conversion_destination
|
|
212
212
|
# Update a conversion destination
|
|
213
|
-
# Partial-update a conversion rule. LinkedIn-only today. Whitelisted fields: `name`, `enabled`, attribution windows, `valueType`, `value`, `attributionType`. The rule's `type` and parent ad account are intentionally not exposed for update
|
|
213
|
+
# Partial-update a conversion rule. LinkedIn-only today. Whitelisted fields: `name`, `enabled`, attribution windows, `valueType`, `value`, `attributionType`. The rule's `type` and parent ad account are intentionally not exposed for update. Recreate the rule if those need to change.
|
|
214
214
|
# @param account_id
|
|
215
215
|
# @param destination_id
|
|
216
216
|
# @param update_conversion_destination_request
|