Zernio | Developer News
707 subscribers
1 photo
1 video
509 links
This channel is for recurrent updates and announcements on https://zernio.com.

Zernio is a Social API for Posting and Analytics on 14 platforms.
Download Telegram
4 new Inbox APIs just shipped

1. Contacts
Auto-created from every DM across all your connected accounts. Add tags, custom fields, bulk import.

POST /v1/contacts · POST /v1/contacts/bulk · GET /v1/contacts · GET /v1/contacts/:id · PATCH /v1/contacts/:id · DELETE /v1/contacts/:id

2. Broadcasts
Send one message to thousands of contacts. Segment by tag or custom field. Supports Instagram, Facebook, Telegram, WhatsApp, Twitter, Bluesky, Reddit. Schedule or send immediately. Real-time delivery + read tracking.

POST /v1/broadcasts · POST /v1/broadcasts/:id/send · POST /v1/broadcasts/:id/schedule · POST /v1/broadcasts/:id/cancel · POST /v1/broadcasts/:id/recipients

3. Sequences
Drip campaigns for social DMs. Set delays between steps (hours, days). Auto-exit on reply or unsubscribe.

POST /v1/sequences · POST /v1/sequences/:id/activate · POST /v1/sequences/:id/pause · POST /v1/sequences/:id/enroll · GET /v1/sequences/:id/enrollments

4. Comment Automations
Set a keyword on any Instagram or Facebook post. When someone comments it, they get a DM instantly. Add an optional public reply too.

POST /v1/comment-automations · GET /v1/comment-automations/:id/logs

All official platform APIs. Requires the Inbox add-on.

https://docs.zernio.com/
3🔥3👎1👏1😁1
YouTube analytics now supports audience demographics via GET /v1/analytics/youtube/demographics.

Fetch demographic insights for a YouTube channel broken down by age/gender (percentages) and country (view counts). Requires the Analytics add-on and YouTube Analytics scope.

Key params:
accountId (required)
breakdown = age, gender, country (comma-separated; defaults to all)
startDate, endDate

WhatsApp now supports Flows (create/manage/publish and send interactive flow messages).

Manage flows:
GET /v1/whatsapp/flows (accountId)
POST /v1/whatsapp/flows (accountId, name, categories, optional cloneFlowId)
GET /v1/whatsapp/flows/{flowId} (accountId, optional fields)
PATCH /v1/whatsapp/flows/{flowId} (accountId, name/categories; DRAFT only)
DELETE /v1/whatsapp/flows/{flowId} (accountId; DRAFT only)

Flow JSON asset:
GET /v1/whatsapp/flows/{flowId}/json (accountId)
PUT /v1/whatsapp/flows/{flowId}/json (accountId, flow_json; DRAFT only)

Lifecycle:
POST /v1/whatsapp/flows/{flowId}/publish (accountId; irreversible)
POST /v1/whatsapp/flows/{flowId}/deprecate (accountId; irreversible)

Send a flow message:
POST /v1/whatsapp/flows/send with accountId, to, flow_id, flow_cta, body
• Optional flow_action = navigate | data_exchange, flow_token, flow_action_payload, draft

View documentation
2👎1🔥1👏1
New Google Business Profile analytics endpoints are available.

Fetch daily performance metrics (impressions, clicks, calls, directions, etc.) via GET /v1/analytics/googlebusiness/performance. Requires accountId and the Analytics add-on; data may be delayed 2–3 days; up to 18 months history.

Key params:
accountId (required)
metrics (comma-separated; defaults to all): BUSINESS_IMPRESSIONS_DESKTOP_MAPS, BUSINESS_IMPRESSIONS_DESKTOP_SEARCH, BUSINESS_IMPRESSIONS_MOBILE_MAPS, BUSINESS_IMPRESSIONS_MOBILE_SEARCH, BUSINESS_CONVERSATIONS, BUSINESS_DIRECTION_REQUESTS, CALL_CLICKS, WEBSITE_CLICKS, BUSINESS_BOOKINGS, BUSINESS_FOOD_ORDERS, BUSINESS_FOOD_MENU_CLICKS
startDate, endDate (YYYY-MM-DD)

Fetch monthly search keywords via GET /v1/analytics/googlebusiness/search-keywords. Requires accountId and the Analytics add-on; up to 18 months history.

Key params:
accountId (required)
startMonth, endMonth (YYYY-MM)

Note: keywords below Google’s minimum impression threshold are excluded.

View documentation
🔥21
You can now edit a published X (Twitter) post via POST /v1/posts/{postId}/edit.

This updates the post on X and stores edit history in Zernio. X constraints apply (Premium required, 1-hour edit window, max 5 edits, text-only).

Request body:
platform: twitter
content: new text

Response includes:
id (new tweet ID after edit)
url

You can now start/send X DMs via POST /v1/inbox/conversations.

If a thread already exists, the message is appended. If the recipient doesn’t accept DMs, you’ll get 422 with code=DM_NOT_ALLOWED (or bypass the pre-check with skipDmCheck).

Key fields:
accountId
participantId or participantUsername
message (or attachment via multipart/form-data)
skipDmCheck

Also added:
• Root-level facebookSettings on POST /v1/posts and PUT /v1/posts/{postId} (e.g. facebookSettings.draft=true to create an unpublished draft in Facebook Publishing Tools)
TwitterPlatformData.longVideo=true to enable long video uploads (requires X Premium; may require allowlisting).

View documentation
2🔥2💯1
Facebook now supports posting an optional first comment for Reels as well as feed posts.

Use platformSpecificData.facebook.firstComment to add a comment immediately after publishing (not supported for contentType=story). Skipped when draft is true.

Applies when contentType is reel (or omitted for feed posts).

View documentation
🔥3
Webhooks now support message sent events via message.sent.

Use this to get notified when a message is sent via the API, including message + conversation context.

Subscribe by adding message.sent to Webhook.events.

You can also filter/view deliveries in logs with GET /v1/webhooks/logs using event=message.sent.

Payload schema: WebhookPayloadMessageSent (includes message, conversation, account, timestamp).

View documentation
2👍2👏1
Discord is now supported as a platform in several endpoints and response schemas.

You can now use platform=discord to connect accounts, validate content, and filter account health.

Updated enums:
GET /v1/connect/{platform}: {platform} includes discord
POST /v1/tools/validate/post: platforms[].platform includes discord
GET /v1/accounts/health: query platform includes discord
• Schemas: SocialAccount.platform, PostLog.platform, ConnectionLog.platform include discord

View documentation
2
Meta ads now return additional campaign/ad set details in ad reporting responses.

You can use these fields to display objective/optimization/bidding context and conversion event setup alongside metrics.

New fields:
• On Ad: platformObjective, optimizationGoal, bidStrategy, promotedObject
• On AdTreeCampaign and AdCampaign: platformObjective, optimizationGoal (can be string or string[]), bidStrategy, promotedObject
• On AdTreeAdSet: optimizationGoal, bidStrategy, promotedObject

promotedObject may include custom_event_type, pixel_id, page_id (and on Ad also application_id, product_set_id). Fields are null when not applicable and are only present for Meta ads.

View documentation
3🔥2
Campaign-level optimizationGoal is now always a string in ads campaign responses.

If ad sets have different optimization goals, the API now returns a comma-separated string instead of an array.

Applies to:
GET /v1/ads/campaigns (AdCampaign.optimizationGoal)
GET /v1/ads/tree (AdTreeCampaign.optimizationGoal)

Example: "OFFSITE_CONVERSIONS, VALUE, LEAD_GENERATION"

View documentation
2
New Ads Conversions API endpoints are available: POST /v1/ads/conversions and GET /v1/accounts/{accountId}/conversion-destinations.

You can now relay conversion events to Meta or Google Ads; platform is inferred from accountId. List valid destinations first, then send a batch of events.

Use GET /v1/accounts/{accountId}/conversion-destinations to get destinations[].id (use as destinationId) and destinations[].status (active/inactive). For Google, destinations[].type is present (event type locked to the conversion action).

Send events via POST /v1/ads/conversions with accountId, destinationId, events[] (each requires eventName, eventTime, eventId, user). Optional: testCode (Meta only) and batch-level consent (adUserData/adPersonalization: GRANTED/DENIED, Google only).

Response includes platform (metaads/googleads), eventsReceived, eventsFailed, failures[], and traceId. Requires the Ads add-on.

View documentation
🔥4👏1
Discord support has been added: you can now manage Discord account settings, list available guild channels, and post to Discord with Discord-specific options.

Manage Discord connection settings:
GET /v1/accounts/{accountId}/discord-settings (read current channel/guild + webhook identity)
PATCH /v1/accounts/{accountId}/discord-settings (update webhookUsername/webhookAvatarUrl and/or switch channelId)
GET /v1/accounts/{accountId}/discord-channels (discover channels: type = 0/5/15)

Post to Discord via POST /v1/posts using platformSpecificData = DiscordPlatformData:
• Required: channelId
• Optional: embeds, poll, crosspost, forumThreadName, forumAppliedTags, threadFromMessage, tts, webhookUsername, webhookAvatarUrl

Analytics responses now include platformPostId per platform in GET /v1/analytics.

Ads goals have been expanded in POST /v1/ads/boost and POST /v1/ads/create: goal now supports engagement, traffic, awareness, video_views, lead_generation, conversions, app_promotion (availability varies by platform).

View documentation
2🔥2
Webhook comment.received payloads may now include null for Zernio internal post IDs when the post was not published through Zernio.

Handle missing internal IDs by relying on the platform IDs instead.

Fields that can now be null:
comment.postId
post.id

Use comment.platformPostId / post.platformPostId as the stable identifiers in these cases.

View documentation
1
Google Business Platform posts now support EVENT and OFFER types via topicType in GoogleBusinessPlatformData.

This lets you publish event and offer posts (in addition to standard updates) to Google Search/Maps/GBP.

Set topicType to: STANDARD | EVENT | OFFER (default: STANDARD)

When topicType is EVENT, include event (required): event.title, event.schedule.startDate, event.schedule.endDate (optional: startTime, endTime).

When topicType is OFFER, include offer (recommended): offer.offerType (OFFER | BUY_ONE_GET_ONE), offer.redeemOnlineUrl, offer.termsConditions, offer.couponCode.

View documentation
2🔥1
New Google Business Profile (GBP) capabilities are available: manage Services, update Place Action links, and fetch Reviews across multiple locations in one call.

Manage location services:
GET /v1/accounts/{accountId}/gmb-services (optional locationId)
PUT /v1/accounts/{accountId}/gmb-services replaces the full list via serviceItems (structured or free-form, optional price)

Update a Place Action link:
PATCH /v1/accounts/{accountId}/gmb-place-actions with name (required), and optionally uri and/or placeActionType
placeActionType: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, SHOP_ONLINE

Batch fetch reviews for multi-location accounts:
POST /v1/accounts/{accountId}/gmb-reviews/batch with locationNames, optional pageSize (max 50) and pageToken

View documentation
1
Webhooks now support review events via events: review.new, review.updated (in POST /v1/webhooks/settings and PUT /v1/webhooks/settings).

Sending inbox messages now supports WhatsApp rich interactive messages via interactive in POST /v1/inbox/conversations/{conversationId}/messages.

Set interactive.type to: list, cta_url, or flow (WhatsApp only). When interactive is set, it takes priority over buttons and quickReplies.

Interactive taps/submissions are delivered in the message.received webhook under metadata: interactiveType (button_reply | list_reply | nfm_reply), interactiveId, flowResponseJson, flowResponseData.

View documentation
🔥1
Reddit posting now supports native video submissions via new fields in RedditPlatformData.

You can upload videos to Reddit’s CDN for an embedded player (with automatic fallback to a link post if video posts aren’t allowed), or submit silent looping clips.

New fields:
nativeVideo (boolean, default true) - use Reddit native video flow; set false to fall back to a legacy link post
videogif (boolean) - submit as silent videogif when nativeVideo is active
videoPosterUrl (uri) - optional thumbnail/poster image for native video posts

View documentation
🔥1
PUT /v1/inbox/conversations/{conversationId} can now return 404.

This happens when the conversation isn’t found on WhatsApp (other platforms upsert instead of returning not found).

Handle the new response: 404 Conversation not found.

View documentation
🔥1
Meta ads now support Advantage Audience controls when creating/boosting ads and when updating Meta targeting.

This lets you explicitly enable/disable Meta’s targeting automation during ad set creation, and optionally preserve the current setting on updates.

Use:
POST /v1/ads/boost: targeting.advantage_audience = 0 | 1
PUT /v1/ads/{adId}: targeting.advantage_audience = 0 | 1 (omit to keep existing)
POST /v1/ads/create: advantageAudience = 0 | 1

View documentation
🔥2
Ad metrics now include conversion reporting and raw action breakdowns via new fields on AdMetrics.

This lets you read conversion counts/cost directly and also extract any Meta action/conversion type from Insights without relying only on derived metrics.

New fields:
conversions (integer) — conversion events matching the campaign’s promoted event type (Meta-only for now; others return 0)
costPerConversion (number) — spend / conversions (0 when conversions is 0)
actions (object<string, integer>) — per action_type counts (e.g. link_click, offsite_conversion.fb_pixel_purchase)

View documentation
4
New Ads API write endpoints are available for managing campaigns and ad sets (budget updates, pause/resume, duplication, deletion). This adds first-class support for CBO vs ABO budget routing and bulk status changes.

Campaign budget updates (CBO): PUT /v1/ads/campaigns/{campaignId}
• Body: platform (facebook|instagram), budget.amount, budget.type (daily|lifetime)
• If the campaign is ABO, returns 409 (BUDGET_LEVEL_MISMATCH) — update the ad set instead

Ad set updates (ABO budget and/or status): PUT /v1/ads/ad-sets/{adSetId}
• Body: platform, optional budget, optional status (active|paused)
• If parent campaign is CBO and you try to update budget here, returns 409 (BUDGET_LEVEL_MISMATCH)

Convenience ad set status toggle: PUT /v1/ads/ad-sets/{adSetId}/status
• Body: platform, status (active|paused)

Bulk pause/resume campaigns (up to 50): POST /v1/ads/campaigns/bulk-status
• Body: status (active|paused), campaigns[] with platformCampaignId + platform
• Returns per-campaign results so one failure doesn’t fail the whole batch

Duplicate a campaign (Meta async copy + optional discovery): POST /v1/ads/campaigns/{campaignId}/duplicate
• Key options: deepCopy (default true), statusOption (ACTIVE|PAUSED|INHERITED_FROM_SOURCE), syncAfter (default true)

Delete a campaign (cascades to ad sets/ads): DELETE /v1/ads/campaigns/{campaignId}
• Body: platform (facebook|instagram)

Also added to campaign responses (GET /v1/ads/campaigns and GET /v1/ads/tree):
reviewStatus (in_review|approved|rejected|with_issues)
budgetLevel (campaign|adset), campaignBudget, and currency to disambiguate CBO vs ABO budgets

Meta-only for now where noted; other platforms may return 501 for unsupported operations.

View documentation
5🔥1