{"id":47659631,"url":"https://github.com/zernio-dev/zernio-node","last_synced_at":"2026-07-06T18:00:32.518Z","repository":{"id":332814454,"uuid":"1135089868","full_name":"zernio-dev/zernio-node","owner":"zernio-dev","description":"Zernio's Official Node.js SDK","archived":false,"fork":false,"pushed_at":"2026-07-03T18:58:13.000Z","size":2908,"stargazers_count":31,"open_issues_count":1,"forks_count":6,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T20:28:16.644Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://zernio.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zernio-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-15T16:14:29.000Z","updated_at":"2026-07-03T18:58:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"7bb2b5ed-7605-4454-9ec5-14fd1e16e2c4","html_url":"https://github.com/zernio-dev/zernio-node","commit_stats":null,"previous_names":["getlatedev/late-node","getlate-dev/late-node","zernio-dev/zernio-node"],"tags_count":363,"template":false,"template_full_name":null,"purl":"pkg:github/zernio-dev/zernio-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zernio-dev","download_url":"https://codeload.github.com/zernio-dev/zernio-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35201088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-02T10:47:00.726Z","updated_at":"2026-07-06T18:00:32.498Z","avatar_url":"https://github.com/zernio-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://zernio.com\"\u003e\n    \u003cimg src=\"https://zernio.com/brand/icon-primary.png\" alt=\"Zernio\" width=\"60\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eZernio Node.js SDK\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@zernio/node\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@zernio/node.svg\" alt=\"npm version\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eOne API to post everywhere. 14 platforms, zero headaches.\u003c/strong\u003e\n\u003c/p\u003e\n\nThe official Node.js SDK for the [Zernio API](https://zernio.com) — schedule and publish social media posts across Instagram, TikTok, YouTube, LinkedIn, X/Twitter, Facebook, Pinterest, Threads, Bluesky, Reddit, Snapchat, Telegram, WhatsApp, and Google Business Profile with a single integration.\n\n## Installation\n\n```bash\nnpm install @zernio/node\n```\n\n## Quick Start\n\n```typescript\nimport Zernio from '@zernio/node';\n\nconst zernio = new Zernio(); // Uses ZERNIO_API_KEY env var\n\n// Publish to multiple platforms with one call\nconst { data: post } = await zernio.posts.createPost({\n  body: {\n    content: 'Hello world from Zernio!',\n    platforms: [\n      { platform: 'twitter', accountId: 'acc_xxx' },\n      { platform: 'linkedin', accountId: 'acc_yyy' },\n      { platform: 'instagram', accountId: 'acc_zzz' },\n    ],\n    publishNow: true,\n  },\n});\n\nconsole.log(`Published to ${post.platforms.length} platforms!`);\n```\n\n## Configuration\n\n```typescript\nconst zernio = new Zernio({\n  apiKey: 'your-api-key', // Defaults to process.env['ZERNIO_API_KEY']\n  baseURL: 'https://zernio.com/api',\n  timeout: 60000,\n});\n```\n\n## Examples\n\n### Schedule a Post\n\n```typescript\nconst { data: post } = await zernio.posts.createPost({\n  body: {\n    content: 'This post will go live tomorrow at 10am',\n    platforms: [{ platform: 'instagram', accountId: 'acc_xxx' }],\n    scheduledFor: '2025-02-01T10:00:00Z',\n  },\n});\n```\n\n### Platform-Specific Content\n\nCustomize content per platform while posting to all at once:\n\n```typescript\nconst { data: post } = await zernio.posts.createPost({\n  body: {\n    content: 'Default content',\n    platforms: [\n      {\n        platform: 'twitter',\n        accountId: 'acc_twitter',\n        platformSpecificContent: 'Short \u0026 punchy for X',\n      },\n      {\n        platform: 'linkedin',\n        accountId: 'acc_linkedin',\n        platformSpecificContent: 'Professional tone for LinkedIn with more detail.',\n      },\n    ],\n    publishNow: true,\n  },\n});\n```\n\n### Upload Media\n\n```typescript\n// 1. Get presigned upload URL\nconst { data: presign } = await zernio.media.getMediaPresignedUrl({\n  body: { filename: 'video.mp4', contentType: 'video/mp4' },\n});\n\n// 2. Upload your file\nawait fetch(presign.uploadUrl, {\n  method: 'PUT',\n  body: videoBuffer,\n  headers: { 'Content-Type': 'video/mp4' },\n});\n\n// 3. Create post with media\nconst { data: post } = await zernio.posts.createPost({\n  body: {\n    content: 'Check out this video!',\n    mediaUrls: [presign.publicUrl],\n    platforms: [\n      { platform: 'tiktok', accountId: 'acc_xxx' },\n      { platform: 'youtube', accountId: 'acc_yyy', youtubeTitle: 'My Video' },\n    ],\n    publishNow: true,\n  },\n});\n```\n\n### Get Analytics\n\n```typescript\nconst { data } = await zernio.analytics.getAnalytics({\n  query: { postId: 'post_xxx' },\n});\n\nconsole.log('Views:', data.analytics.views);\nconsole.log('Likes:', data.analytics.likes);\nconsole.log('Engagement Rate:', data.analytics.engagementRate);\n```\n\n### List Connected Accounts\n\n```typescript\nconst { data } = await zernio.accounts.listAccounts();\n\nfor (const account of data.accounts) {\n  console.log(`${account.platform}: @${account.username}`);\n}\n```\n\n## Error Handling\n\n```typescript\nimport Zernio, { ZernioApiError, RateLimitError, ValidationError } from '@zernio/node';\n\ntry {\n  await zernio.posts.createPost({ body: { /* ... */ } });\n} catch (error) {\n  if (error instanceof RateLimitError) {\n    console.log(`Rate limited. Retry in ${error.getSecondsUntilReset()}s`);\n  } else if (error instanceof ValidationError) {\n    console.log('Invalid request:', error.fields);\n  } else if (error instanceof ZernioApiError) {\n    console.log(`Error ${error.statusCode}: ${error.message}`);\n  }\n}\n```\n\n## SDK Reference\n\n### Posts\n| Method | Description |\n|--------|-------------|\n| `posts.listPosts()` | List posts |\n| `posts.bulkUploadPosts()` | Bulk upload from CSV |\n| `posts.createPost()` | Create post |\n| `posts.getPost()` | Get post |\n| `posts.updatePost()` | Update post |\n| `posts.updatePostMetadata()` | Update post metadata |\n| `posts.deletePost()` | Delete post |\n| `posts.editPost()` | Edit published post |\n| `posts.retryPost()` | Retry failed post |\n| `posts.unpublishPost()` | Unpublish post |\n\n### Accounts\n| Method | Description |\n|--------|-------------|\n| `accounts.getAllAccountsHealth()` | Check accounts health |\n| `accounts.listAccounts()` | List accounts |\n| `accounts.getAccountHealth()` | Check account health |\n| `accounts.getFollowerStats()` | Get follower stats |\n| `accounts.getGoogleBusinessReviews()` | Get reviews |\n| `accounts.getLinkedInMentions()` | Resolve LinkedIn mention |\n| `accounts.getTikTokCreatorInfo()` | Get TikTok creator info |\n| `accounts.updateAccount()` | Update account |\n| `accounts.deleteAccount()` | Disconnect account |\n| `accounts.deleteGoogleBusinessReviewReply()` | Delete a review reply |\n| `accounts.batchGetGoogleBusinessReviews()` | Batch get reviews |\n| `accounts.moveAccountToProfile()` | Move account to another profile |\n| `accounts.replyToGoogleBusinessReview()` | Reply to a review |\n\n### Profiles\n| Method | Description |\n|--------|-------------|\n| `profiles.listProfiles()` | List profiles |\n| `profiles.createProfile()` | Create profile |\n| `profiles.getProfile()` | Get profile |\n| `profiles.updateProfile()` | Update profile |\n| `profiles.deleteProfile()` | Delete profile |\n\n### Analytics\n| Method | Description |\n|--------|-------------|\n| `analytics.getAnalytics()` | Get post analytics |\n| `analytics.getBestTimeToPost()` | Get best times to post |\n| `analytics.getContentDecay()` | Get content performance decay |\n| `analytics.getDailyMetrics()` | Get daily aggregated metrics |\n| `analytics.getFacebookPageInsights()` | Get Facebook Page insights |\n| `analytics.getGoogleBusinessPerformance()` | Get GBP performance metrics |\n| `analytics.getGoogleBusinessSearchKeywords()` | Get GBP search keywords |\n| `analytics.getInstagramAccountInsights()` | Get Instagram insights |\n| `analytics.getInstagramDemographics()` | Get Instagram demographics |\n| `analytics.getInstagramFollowerHistory()` | Get Instagram follower history |\n| `analytics.getLinkedInAggregateAnalytics()` | Get LinkedIn aggregate stats |\n| `analytics.getLinkedInOrgAggregateAnalytics()` | Get LinkedIn org analytics |\n| `analytics.getLinkedInPostAnalytics()` | Get LinkedIn post stats |\n| `analytics.getLinkedInPostReactions()` | Get LinkedIn post reactions |\n| `analytics.getPostingFrequency()` | Get frequency vs engagement |\n| `analytics.getPostTimeline()` | Get post analytics timeline |\n| `analytics.getTikTokAccountInsights()` | Get TikTok account-level insights |\n| `analytics.getYouTubeChannelInsights()` | Get YouTube channel insights |\n| `analytics.getYouTubeDailyViews()` | Get YouTube daily views |\n| `analytics.getYouTubeDemographics()` | Get YouTube demographics |\n| `analytics.getYouTubeVideoRetention()` | Get YouTube video retention curve |\n| `analytics.syncExternalPosts()` | Sync an external post |\n\n### Account Groups\n| Method | Description |\n|--------|-------------|\n| `accountGroups.listAccountGroups()` | List groups |\n| `accountGroups.createAccountGroup()` | Create group |\n| `accountGroups.updateAccountGroup()` | Update group |\n| `accountGroups.deleteAccountGroup()` | Delete group |\n\n### Queue\n| Method | Description |\n|--------|-------------|\n| `queue.listQueueSlots()` | List schedules |\n| `queue.createQueueSlot()` | Create schedule |\n| `queue.getNextQueueSlot()` | Get next available slot |\n| `queue.updateQueueSlot()` | Update schedule |\n| `queue.deleteQueueSlot()` | Delete schedule |\n| `queue.previewQueue()` | Preview upcoming slots |\n\n### Webhooks\n| Method | Description |\n|--------|-------------|\n| `webhooks.createWebhookSettings()` | Create webhook |\n| `webhooks.getWebhookLogs()` | List webhook delivery logs |\n| `webhooks.getWebhookSettings()` | List webhooks |\n| `webhooks.updateWebhookSettings()` | Update webhook |\n| `webhooks.deleteWebhookSettings()` | Delete webhook |\n| `webhooks.testWebhook()` | Send test webhook |\n\n### API Keys\n| Method | Description |\n|--------|-------------|\n| `apiKeys.listApiKeys()` | List keys |\n| `apiKeys.createApiKey()` | Create key |\n| `apiKeys.deleteApiKey()` | Delete key |\n\n### Media\n| Method | Description |\n|--------|-------------|\n| `media.getMediaPresignedUrl()` | Get upload URL |\n\n### Users\n| Method | Description |\n|--------|-------------|\n| `users.listUsers()` | List users |\n| `users.getUser()` | Get user |\n\n### Usage\n| Method | Description |\n|--------|-------------|\n| `usage.getCallsUsage()` | Calling usage (volumes + billable cost) |\n| `usage.getSmsUsage()` | SMS usage (volumes) |\n| `usage.getUsage()` | Get plan and usage snapshot |\n| `usage.getUsageStats()` | Get plan and usage stats |\n| `usage.getXApiPricing()` | Get X/Twitter API pricing table |\n\n### Logs\n| Method | Description |\n|--------|-------------|\n| `logs.listLogs()` | List activity logs |\n\n### Connect (OAuth)\n| Method | Description |\n|--------|-------------|\n| `connect.listFacebookPages()` | List Facebook pages |\n| `connect.listGoogleBusinessLocations()` | List GBP locations |\n| `connect.listLinkedInOrganizations()` | List LinkedIn orgs |\n| `connect.listPinterestBoardsForSelection()` | List Pinterest boards |\n| `connect.listSnapchatProfiles()` | List Snapchat profiles |\n| `connect.listWhatsAppPhoneNumbers()` | List numbers for selection |\n| `connect.getConnectUrl()` | Get OAuth connect URL |\n| `connect.getFacebookPages()` | List Facebook pages |\n| `connect.getGmbLocations()` | List GBP locations |\n| `connect.getLinkedInOrganizations()` | List LinkedIn orgs |\n| `connect.getPendingOAuthData()` | Get pending OAuth data |\n| `connect.getPinterestBoards()` | List Pinterest boards |\n| `connect.getRedditFlairs()` | List subreddit flairs |\n| `connect.getRedditSubreddits()` | List Reddit subreddits |\n| `connect.getTelegramConnectStatus()` | Generate Telegram code |\n| `connect.getYoutubePlaylists()` | List YouTube playlists |\n| `connect.updateFacebookPage()` | Update Facebook page |\n| `connect.updateGmbLocation()` | Update GBP location |\n| `connect.updateLinkedInOrganization()` | Switch LinkedIn account type |\n| `connect.updatePinterestBoards()` | Set default Pinterest board |\n| `connect.updateRedditSubreddits()` | Set default subreddit |\n| `connect.updateYoutubeDefaultPlaylist()` | Set default YouTube playlist |\n| `connect.completeTelegramConnect()` | Check Telegram status |\n| `connect.completeWhatsAppPhoneSelection()` | Complete number selection |\n| `connect.configureTikTokAdsBrandIdentity()` | Set TikTok brand identity |\n| `connect.connectAds()` | Connect ads for a platform |\n| `connect.connectBlueskyCredentials()` | Connect Bluesky account |\n| `connect.connectWhatsAppCredentials()` | Connect WhatsApp via credentials |\n| `connect.handleOAuthCallback()` | Complete OAuth callback |\n| `connect.initiateTelegramConnect()` | Connect Telegram directly |\n| `connect.selectFacebookPage()` | Select Facebook page |\n| `connect.selectGoogleBusinessLocation()` | Select GBP location |\n| `connect.selectLinkedInOrganization()` | Select LinkedIn org |\n| `connect.selectPinterestBoard()` | Select Pinterest board |\n| `connect.selectSnapchatProfile()` | Select Snapchat profile |\n\n### Reddit\n| Method | Description |\n|--------|-------------|\n| `reddit.getRedditFeed()` | Get subreddit feed |\n| `reddit.searchReddit()` | Search posts |\n\n### Account Settings\n| Method | Description |\n|--------|-------------|\n| `accountSettings.getInstagramIceBreakers()` | Get IG ice breakers |\n| `accountSettings.getMessengerMenu()` | Get FB persistent menu |\n| `accountSettings.getTelegramCommands()` | Get TG bot commands |\n| `accountSettings.deleteInstagramIceBreakers()` | Delete IG ice breakers |\n| `accountSettings.deleteMessengerMenu()` | Delete FB persistent menu |\n| `accountSettings.deleteTelegramCommands()` | Delete TG bot commands |\n| `accountSettings.setInstagramIceBreakers()` | Set IG ice breakers |\n| `accountSettings.setMessengerMenu()` | Set FB persistent menu |\n| `accountSettings.setTelegramCommands()` | Set TG bot commands |\n\n### Ad Audiences\n| Method | Description |\n|--------|-------------|\n| `adAudiences.listAdAudiences()` | List custom audiences |\n| `adAudiences.createAdAudience()` | Create custom audience |\n| `adAudiences.getAdAudience()` | Get audience details |\n| `adAudiences.deleteAdAudience()` | Delete custom audience |\n| `adAudiences.addUsersToAdAudience()` | Add users to audience |\n\n### Ad Campaigns\n| Method | Description |\n|--------|-------------|\n| `adCampaigns.listAdCampaigns()` | List campaigns |\n| `adCampaigns.bulkUpdateAdCampaignStatus()` | Pause or resume many campaigns |\n| `adCampaigns.getAdsTimeline()` | Get daily account metrics |\n| `adCampaigns.getAdTree()` | Get campaign tree |\n| `adCampaigns.updateAdCampaign()` | Update a campaign |\n| `adCampaigns.updateAdCampaignStatus()` | Pause or resume a campaign |\n| `adCampaigns.updateAdSet()` | Update an ad set |\n| `adCampaigns.updateAdSetStatus()` | Pause or resume a single ad set |\n| `adCampaigns.deleteAdCampaign()` | Delete a campaign |\n| `adCampaigns.duplicateAdCampaign()` | Duplicate a campaign |\n\n### Ads\n| Method | Description |\n|--------|-------------|\n| `ads.listAdAccounts()` | List ad accounts |\n| `ads.listAdCatalogProductSets()` | List a catalog's product sets |\n| `ads.listAdCatalogs()` | List Meta product catalogs |\n| `ads.listAds()` | List ads |\n| `ads.listAdsBusinessCenters()` | List TikTok Business Centers |\n| `ads.listConversionAssociations()` | List associated campaigns |\n| `ads.listConversionDestinations()` | List conversion destinations |\n| `ads.listFormLeads()` | List leads for a single form |\n| `ads.listLeadForms()` | List lead forms |\n| `ads.listLeads()` | List submitted leads |\n| `ads.createConversionDestination()` | Create a conversion destination |\n| `ads.createCtwaAd()` | Create Click-to-WhatsApp ad |\n| `ads.createLeadForm()` | Create a lead form |\n| `ads.createStandaloneAd()` | Create standalone ad |\n| `ads.createTestLead()` | Create a test lead |\n| `ads.getAd()` | Get ad details |\n| `ads.getAdAnalytics()` | Get ad analytics |\n| `ads.getAdComments()` | List comments on an ad |\n| `ads.getAdTrackingTags()` | Get ad tracking tags |\n| `ads.getCampaignAnalytics()` | Get campaign analytics |\n| `ads.getConversionDestination()` | Get a conversion destination |\n| `ads.getConversionMetrics()` | Get attribution metrics |\n| `ads.getConversionsQuality()` | Get Event Match Quality |\n| `ads.getLeadForm()` | Get a lead form |\n| `ads.updateAd()` | Update ad |\n| `ads.updateAdTrackingTags()` | Set ad tracking tags |\n| `ads.updateConversionDestination()` | Update a conversion destination |\n| `ads.deleteAd()` | Cancel an ad |\n| `ads.deleteConversionDestination()` | Delete a conversion destination |\n| `ads.addConversionAssociations()` | Associate campaigns |\n| `ads.adjustConversions()` | Adjust uploaded conversions |\n| `ads.archiveLeadForm()` | Archive a lead form |\n| `ads.boostPost()` | Boost post as ad |\n| `ads.estimateAdReach()` | Estimate audience reach |\n| `ads.removeConversionAssociations()` | Remove associated campaigns |\n| `ads.searchAdInterests()` | Search targeting interests |\n| `ads.searchAdTargeting()` | Search targeting options |\n| `ads.sendConversions()` | Send conversion events |\n\n### Broadcasts\n| Method | Description |\n|--------|-------------|\n| `broadcasts.listBroadcastRecipients()` | List broadcast recipients |\n| `broadcasts.listBroadcasts()` | List broadcasts |\n| `broadcasts.createBroadcast()` | Create broadcast draft |\n| `broadcasts.getBroadcast()` | Get broadcast details |\n| `broadcasts.updateBroadcast()` | Update broadcast |\n| `broadcasts.deleteBroadcast()` | Delete broadcast |\n| `broadcasts.addBroadcastRecipients()` | Add recipients to a broadcast |\n| `broadcasts.cancelBroadcast()` | Cancel broadcast |\n| `broadcasts.scheduleBroadcast()` | Schedule broadcast for later |\n| `broadcasts.sendBroadcast()` | Send broadcast now |\n\n### Calls\n| Method | Description |\n|--------|-------------|\n| `calls.listCalls()` | List all calls (unified history) |\n| `calls.getCall()` | Get a call (any channel) |\n| `calls.getCallRecording()` | Get a call recording (any channel) |\n\n### Comment Automations\n| Method | Description |\n|--------|-------------|\n| `commentAutomations.listCommentAutomationLogs()` | List automation logs |\n| `commentAutomations.listCommentAutomations()` | List comment-to-DM automations |\n| `commentAutomations.createCommentAutomation()` | Create comment-to-DM automation |\n| `commentAutomations.getCommentAutomation()` | Get automation details |\n| `commentAutomations.updateCommentAutomation()` | Update automation settings |\n| `commentAutomations.deleteCommentAutomation()` | Delete automation |\n\n### Comments (Inbox)\n| Method | Description |\n|--------|-------------|\n| `comments.listInboxComments()` | List commented posts |\n| `comments.getInboxPostComments()` | Get post comments |\n| `comments.deleteInboxComment()` | Delete comment |\n| `comments.hideInboxComment()` | Hide comment |\n| `comments.likeInboxComment()` | Like comment |\n| `comments.replyToInboxPost()` | Reply to comment |\n| `comments.sendPrivateReplyToComment()` | Send private reply |\n| `comments.unhideInboxComment()` | Unhide comment |\n| `comments.unlikeInboxComment()` | Unlike comment |\n\n### Contacts\n| Method | Description |\n|--------|-------------|\n| `contacts.listContacts()` | List contacts |\n| `contacts.bulkCreateContacts()` | Bulk create contacts |\n| `contacts.createContact()` | Create contact |\n| `contacts.getContact()` | Get contact |\n| `contacts.getContactChannels()` | List channels for a contact |\n| `contacts.updateContact()` | Update contact |\n| `contacts.deleteContact()` | Delete contact |\n\n### Custom Fields\n| Method | Description |\n|--------|-------------|\n| `customFields.listCustomFields()` | List custom field definitions |\n| `customFields.createCustomField()` | Create custom field |\n| `customFields.updateCustomField()` | Update custom field |\n| `customFields.deleteCustomField()` | Delete custom field |\n| `customFields.clearContactFieldValue()` | Clear custom field value |\n| `customFields.setContactFieldValue()` | Set custom field value |\n\n### Discord\n| Method | Description |\n|--------|-------------|\n| `discord.listDiscordGuildMembers()` | List Discord guild members |\n| `discord.listDiscordGuildRoles()` | List Discord guild roles |\n| `discord.listDiscordPinnedMessages()` | List pinned messages |\n| `discord.listDiscordScheduledEvents()` | List Discord scheduled events |\n| `discord.createDiscordScheduledEvent()` | Create a Discord scheduled event |\n| `discord.getDiscordChannels()` | List Discord guild channels |\n| `discord.getDiscordScheduledEvent()` | Get a Discord scheduled event |\n| `discord.getDiscordSettings()` | Get Discord account settings |\n| `discord.updateDiscordScheduledEvent()` | Update a Discord scheduled event |\n| `discord.updateDiscordSettings()` | Update Discord settings |\n| `discord.deleteDiscordScheduledEvent()` | Delete a Discord scheduled event |\n| `discord.addDiscordMemberRole()` | Assign a role to a guild member |\n| `discord.pinDiscordMessage()` | Pin a Discord message |\n| `discord.removeDiscordMemberRole()` | Remove a role from a guild member |\n| `discord.sendDiscordDirectMessage()` | Send a Discord Direct Message |\n| `discord.unpinDiscordMessage()` | Unpin a Discord message |\n\n### GMB Attributes\n| Method | Description |\n|--------|-------------|\n| `gmbAttributes.getGmbAttributeMetadata()` | Get attribute metadata |\n| `gmbAttributes.getGoogleBusinessAttributes()` | Get attributes |\n| `gmbAttributes.updateGoogleBusinessAttributes()` | Update attributes |\n\n### GMB Food Menus\n| Method | Description |\n|--------|-------------|\n| `gmbFoodMenus.getGoogleBusinessFoodMenus()` | Get food menus |\n| `gmbFoodMenus.updateGoogleBusinessFoodMenus()` | Update food menus |\n\n### GMB Location Details\n| Method | Description |\n|--------|-------------|\n| `gmbLocationDetails.getGoogleBusinessLocationDetails()` | Get location details |\n| `gmbLocationDetails.updateGoogleBusinessLocationDetails()` | Update location details |\n\n### GMB Media\n| Method | Description |\n|--------|-------------|\n| `gmbMedia.listGoogleBusinessMedia()` | List media |\n| `gmbMedia.createGoogleBusinessMedia()` | Upload photo |\n| `gmbMedia.deleteGoogleBusinessMedia()` | Delete photo |\n\n### GMB Place Actions\n| Method | Description |\n|--------|-------------|\n| `gmbPlaceActions.listGoogleBusinessPlaceActions()` | List action links |\n| `gmbPlaceActions.createGoogleBusinessPlaceAction()` | Create action link |\n| `gmbPlaceActions.updateGoogleBusinessPlaceAction()` | Update action link |\n| `gmbPlaceActions.deleteGoogleBusinessPlaceAction()` | Delete action link |\n\n### GMB Services\n| Method | Description |\n|--------|-------------|\n| `gmbServices.getGoogleBusinessServices()` | Get services |\n| `gmbServices.updateGoogleBusinessServices()` | Replace services |\n\n### GMB Verifications\n| Method | Description |\n|--------|-------------|\n| `gmbVerifications.getGoogleBusinessVerifications()` | Get verification state |\n| `gmbVerifications.completeGoogleBusinessVerification()` | Complete a verification |\n| `gmbVerifications.fetchGoogleBusinessVerificationOptions()` | Fetch verification options |\n| `gmbVerifications.startGoogleBusinessVerification()` | Start a verification |\n\n### Inbox Analytics\n| Method | Description |\n|--------|-------------|\n| `inboxAnalytics.listInboxConversationAnalytics()` | List conversation analytics |\n| `inboxAnalytics.getInboxConversationAnalytics()` | Get conversation analytics |\n| `inboxAnalytics.getInboxHeatmap()` | Get day × hour heatmap |\n| `inboxAnalytics.getInboxResponseTime()` | Get inbox response-time stats |\n| `inboxAnalytics.getInboxSourceBreakdown()` | Get inbox source breakdown |\n| `inboxAnalytics.getInboxTopAccounts()` | Get top accounts by inbox volume |\n| `inboxAnalytics.getInboxVolume()` | Get inbox messaging volume |\n\n### Instagram\n| Method | Description |\n|--------|-------------|\n| `instagram.listInstagramStories()` | List active Instagram stories |\n| `instagram.getInstagramStoryInsights()` | Get Instagram story insights |\n\n### Mentions\n| Method | Description |\n|--------|-------------|\n| `mentions.listInboxMentions()` | List mentions |\n\n### Messages (Inbox)\n| Method | Description |\n|--------|-------------|\n| `messages.listInboxConversations()` | List conversations |\n| `messages.createInboxConversation()` | Create conversation |\n| `messages.getInboxConversation()` | Get conversation |\n| `messages.getInboxConversationMessages()` | List messages |\n| `messages.updateInboxConversation()` | Update conversation status |\n| `messages.deleteInboxMessage()` | Delete message |\n| `messages.addMessageReaction()` | Add reaction |\n| `messages.editInboxMessage()` | Edit message |\n| `messages.markConversationRead()` | Mark a conversation as read |\n| `messages.removeMessageReaction()` | Remove reaction |\n| `messages.searchInboxConversations()` | Search conversations |\n| `messages.sendInboxMessage()` | Send message |\n| `messages.sendTypingIndicator()` | Send typing indicator |\n| `messages.uploadMediaDirect()` | Upload media file |\n\n### Phone Numbers\n| Method | Description |\n|--------|-------------|\n| `phoneNumbers.listPhoneNumberCountries()` | List offerable number countries |\n| `phoneNumbers.listPhoneNumberPortIns()` | List port-in orders |\n| `phoneNumbers.listPhoneNumbers()` | List phone numbers |\n| `phoneNumbers.createPhoneNumberKycLink()` | Create a hosted KYC link |\n| `phoneNumbers.createPhoneNumberPortIn()` | Port numbers in |\n| `phoneNumbers.getPhoneNumber()` | Get phone number |\n| `phoneNumbers.getPhoneNumberKycForm()` | Get KYC form spec |\n| `phoneNumbers.getPhoneNumberRemediation()` | Get declined requirements |\n| `phoneNumbers.cancelPhoneNumberPortIn()` | Cancel a port-in |\n| `phoneNumbers.checkPhoneNumberAvailability()` | Check country availability |\n| `phoneNumbers.checkPhoneNumberPortability()` | Check portability |\n| `phoneNumbers.purchasePhoneNumber()` | Purchase phone number |\n| `phoneNumbers.releasePhoneNumber()` | Release phone number |\n| `phoneNumbers.remediatePhoneNumber()` | Resubmit a declined number |\n| `phoneNumbers.reviewPhoneNumberKycPacket()` | Pre-review a KYC packet |\n| `phoneNumbers.searchAvailablePhoneNumbers()` | Search available numbers |\n| `phoneNumbers.submitPhoneNumberKyc()` | Submit KYC |\n| `phoneNumbers.uploadPhoneNumberKycDocument()` | Upload a KYC document |\n| `phoneNumbers.uploadPhoneNumberPortInDocument()` | Upload a porting document |\n| `phoneNumbers.validatePhoneNumberKycAddress()` | Pre-validate KYC address |\n\n### Reviews (Inbox)\n| Method | Description |\n|--------|-------------|\n| `reviews.listInboxReviews()` | List reviews |\n| `reviews.deleteInboxReviewReply()` | Delete review reply |\n| `reviews.replyToInboxReview()` | Reply to review |\n\n### Sequences\n| Method | Description |\n|--------|-------------|\n| `sequences.listSequenceEnrollments()` | List enrollments for a sequence |\n| `sequences.listSequences()` | List sequences |\n| `sequences.createSequence()` | Create sequence |\n| `sequences.getSequence()` | Get sequence with steps |\n| `sequences.updateSequence()` | Update sequence |\n| `sequences.deleteSequence()` | Delete sequence |\n| `sequences.activateSequence()` | Activate sequence |\n| `sequences.enrollContacts()` | Enroll contacts in a sequence |\n| `sequences.pauseSequence()` | Pause sequence |\n| `sequences.unenrollContact()` | Unenroll contact |\n\n### SMS\n| Method | Description |\n|--------|-------------|\n| `sms.listSmsOptOuts()` | List SMS opt-outs |\n| `sms.listSmsRegistrations()` | List carrier registrations |\n| `sms.getSmsRegistration()` | Get a carrier registration |\n| `sms.appealSmsRegistration()` | Appeal a rejected campaign |\n| `sms.disableSmsOnNumber()` | Disable SMS on a number |\n| `sms.enableSmsOnNumber()` | Enable SMS on a number |\n| `sms.lookupSmsNumber()` | Look up carrier + line type |\n| `sms.reuseSmsRegistrationForNumber()` | Add a number to an existing registration |\n| `sms.sendSms()` | Send an SMS/MMS |\n| `sms.shareSmsRegistration()` | Create a registration share link |\n| `sms.startSmsRegistration()` | Start a carrier registration |\n| `sms.verifySmsRegistrationOtp()` | Submit the sole-prop OTP |\n\n### Tracking Tags\n| Method | Description |\n|--------|-------------|\n| `trackingTags.listTrackingTags()` | List tracking tags |\n| `trackingTags.listTrackingTagSharedAccounts()` | List accounts it is shared with |\n| `trackingTags.createTrackingTag()` | Create a tracking tag |\n| `trackingTags.getTrackingTag()` | Get a tracking tag |\n| `trackingTags.getTrackingTagStats()` | Get aggregated event stats |\n| `trackingTags.updateTrackingTag()` | Update a tracking tag |\n| `trackingTags.addTrackingTagSharedAccount()` | Share with an ad account |\n| `trackingTags.removeTrackingTagSharedAccount()` | Stop sharing with an account |\n\n### Twitter Engagement\n| Method | Description |\n|--------|-------------|\n| `twitterEngagement.bookmarkPost()` | Bookmark a tweet |\n| `twitterEngagement.followUser()` | Follow a user |\n| `twitterEngagement.removeBookmark()` | Remove bookmark |\n| `twitterEngagement.retweetPost()` | Retweet a post |\n| `twitterEngagement.undoRetweet()` | Undo retweet |\n| `twitterEngagement.unfollowUser()` | Unfollow a user |\n\n### Validate\n| Method | Description |\n|--------|-------------|\n| `validate.validateMedia()` | Validate media URL |\n| `validate.validatePost()` | Validate post content |\n| `validate.validatePostLength()` | Validate character count |\n| `validate.validateSubreddit()` | Check subreddit existence |\n\n### Voice\n| Method | Description |\n|--------|-------------|\n| `voice.listVoiceCalls()` | List phone calls |\n| `voice.createVoiceCall()` | Place an outbound phone call |\n| `voice.createVoiceWebSession()` | Mint a browser softphone session |\n| `voice.getVoiceCall()` | Get a phone call |\n| `voice.getVoiceCallEstimate()` | Estimate call cost |\n| `voice.getVoiceCallRecording()` | Get a call recording |\n| `voice.dialVoiceWebCall()` | Dial from the browser softphone |\n| `voice.disableVoiceOnNumber()` | Disable phone calling on a number |\n| `voice.enableVoiceOnNumber()` | Enable phone calling on a number |\n| `voice.endVoiceCall()` | Hang up a live call |\n| `voice.transferVoiceCall()` | Blind-transfer a live call |\n\n### WhatsApp\n| Method | Description |\n|--------|-------------|\n| `whatsapp.listWhatsAppConversions()` | List conversion events |\n| `whatsapp.listWhatsAppGroupChats()` | List active groups |\n| `whatsapp.listWhatsAppGroupJoinRequests()` | List join requests |\n| `whatsapp.createWhatsAppDataset()` | Provision CTWA dataset |\n| `whatsapp.createWhatsAppGroupChat()` | Create group |\n| `whatsapp.createWhatsAppGroupInviteLink()` | Create invite link |\n| `whatsapp.createWhatsAppTemplate()` | Create template |\n| `whatsapp.getWhatsAppBlockedUsers()` | List blocked users |\n| `whatsapp.getWhatsAppBlockStatus()` | Check if a user is blocked |\n| `whatsapp.getWhatsAppBusinessProfile()` | Get business profile |\n| `whatsapp.getWhatsappBusinessUsername()` | Get business username |\n| `whatsapp.getWhatsappBusinessUsernameSuggestions()` | Get username suggestions |\n| `whatsapp.getWhatsAppDataset()` | Get CTWA conversions dataset |\n| `whatsapp.getWhatsAppDisplayName()` | Get display name status |\n| `whatsapp.getWhatsAppGroupChat()` | Get group info |\n| `whatsapp.getWhatsAppTemplate()` | Get template |\n| `whatsapp.getWhatsAppTemplates()` | List templates |\n| `whatsapp.updateWhatsAppBusinessProfile()` | Update business profile |\n| `whatsapp.updateWhatsAppDisplayName()` | Request display name change |\n| `whatsapp.updateWhatsAppGroupChat()` | Update group settings |\n| `whatsapp.updateWhatsAppTemplate()` | Update template |\n| `whatsapp.deleteWhatsappBusinessUsername()` | Delete business username |\n| `whatsapp.deleteWhatsAppGroupChat()` | Delete group |\n| `whatsapp.deleteWhatsAppTemplate()` | Delete template |\n| `whatsapp.addWhatsAppGroupParticipants()` | Add participants |\n| `whatsapp.approveWhatsAppGroupJoinRequests()` | Approve join requests |\n| `whatsapp.blockWhatsAppUsers()` | Block users |\n| `whatsapp.rejectWhatsAppGroupJoinRequests()` | Reject join requests |\n| `whatsapp.removeWhatsAppGroupParticipants()` | Remove participants |\n| `whatsapp.sendWhatsAppConversion()` | Send WhatsApp conversion event |\n| `whatsapp.setWhatsappBusinessUsername()` | Set business username |\n| `whatsapp.unblockWhatsAppUsers()` | Unblock users |\n| `whatsapp.uploadWhatsAppProfilePhoto()` | Upload profile picture |\n\n### WhatsApp Calling\n| Method | Description |\n|--------|-------------|\n| `whatsappCalling.listWhatsAppCalls()` | List call history for an account |\n| `whatsappCalling.getWhatsAppCall()` | Get a single call |\n| `whatsappCalling.getWhatsAppCallEstimate()` | Estimate per-minute cost |\n| `whatsappCalling.getWhatsAppCalling()` | Get calling config for a number |\n| `whatsappCalling.getWhatsAppCallingConfig()` | Get calling config for an account |\n| `whatsappCalling.getWhatsAppCallPermissions()` | Check call permission |\n| `whatsappCalling.getWhatsAppCallRecording()` | Get a call recording |\n| `whatsappCalling.updateWhatsAppCalling()` | Update calling config |\n| `whatsappCalling.updateWhatsAppCallingLegacy()` | Update calling config |\n| `whatsappCalling.disableWhatsAppCalling()` | Disable calling on a number |\n| `whatsappCalling.disableWhatsAppCallingLegacy()` | Disable calling on a number |\n| `whatsappCalling.enableWhatsAppCalling()` | Enable calling on a number |\n| `whatsappCalling.enableWhatsAppCallingLegacy()` | Enable calling on a number |\n| `whatsappCalling.initiateWhatsAppCall()` | Initiate outbound call |\n\n### WhatsApp Flows\n| Method | Description |\n|--------|-------------|\n| `whatsappFlows.listWhatsAppFlowResponses()` | List flow responses |\n| `whatsappFlows.listWhatsAppFlows()` | List flows |\n| `whatsappFlows.listWhatsAppFlowVersions()` | List flow versions |\n| `whatsappFlows.createWhatsAppFlow()` | Create flow |\n| `whatsappFlows.getWhatsAppFlow()` | Get flow |\n| `whatsappFlows.getWhatsAppFlowJson()` | Get flow JSON asset |\n| `whatsappFlows.getWhatsAppFlowPreview()` | Get flow preview URL |\n| `whatsappFlows.updateWhatsAppFlow()` | Update flow |\n| `whatsappFlows.deleteWhatsAppFlow()` | Delete flow |\n| `whatsappFlows.deprecateWhatsAppFlow()` | Deprecate flow |\n| `whatsappFlows.publishWhatsAppFlow()` | Publish flow |\n| `whatsappFlows.sendWhatsAppFlowMessage()` | Send flow message |\n| `whatsappFlows.uploadWhatsAppFlowJson()` | Upload flow JSON |\n\n### WhatsApp Phone Numbers\n| Method | Description |\n|--------|-------------|\n| `whatsappPhoneNumbers.listWhatsAppNumberCountries()` | List offerable number countries |\n| `whatsappPhoneNumbers.createWhatsAppNumberKycLink()` | Create a hosted KYC link |\n| `whatsappPhoneNumbers.getWhatsAppNumberInfo()` | Get number status |\n| `whatsappPhoneNumbers.getWhatsAppNumberKycForm()` | Get KYC form spec |\n| `whatsappPhoneNumbers.getWhatsAppNumberRemediation()` | Get declined requirements |\n| `whatsappPhoneNumbers.getWhatsAppPhoneNumber()` | Get phone number |\n| `whatsappPhoneNumbers.getWhatsAppPhoneNumbers()` | List phone numbers |\n| `whatsappPhoneNumbers.checkWhatsAppNumberAvailability()` | Check country availability |\n| `whatsappPhoneNumbers.purchaseWhatsAppPhoneNumber()` | Purchase phone number |\n| `whatsappPhoneNumbers.releaseWhatsAppPhoneNumber()` | Release phone number |\n| `whatsappPhoneNumbers.remediateWhatsAppNumber()` | Resubmit a declined number |\n| `whatsappPhoneNumbers.searchAvailableWhatsAppNumbers()` | Search available numbers |\n| `whatsappPhoneNumbers.submitWhatsAppNumberKyc()` | Submit KYC |\n| `whatsappPhoneNumbers.uploadWhatsAppNumberKycDocument()` | Upload a KYC document |\n| `whatsappPhoneNumbers.validateWhatsAppNumberKycAddress()` | Pre-validate KYC address |\n\n### WhatsApp Sandbox\n| Method | Description |\n|--------|-------------|\n| `whatsappSandbox.listWhatsAppSandboxSessions()` | List your sandbox sessions |\n| `whatsappSandbox.createWhatsAppSandboxSession()` | Start a sandbox activation |\n| `whatsappSandbox.deleteWhatsAppSandboxSession()` | Revoke a sandbox session |\n\n### WhatsApp Templates\n| Method | Description |\n|--------|-------------|\n| `whatsappTemplates.getWhatsAppLibraryTemplate()` | Look up a library template |\n\n### Workflows\n| Method | Description |\n|--------|-------------|\n| `workflows.listWorkflowExecutionEvents()` | Get an execution's timeline |\n| `workflows.listWorkflowExecutions()` | List workflow runs |\n| `workflows.listWorkflows()` | List workflows |\n| `workflows.listWorkflowVersions()` | List a workflow's version history |\n| `workflows.createWorkflow()` | Create workflow |\n| `workflows.getWorkflow()` | Get workflow with graph |\n| `workflows.getWorkflowVersion()` | Get a specific workflow version |\n| `workflows.updateWorkflow()` | Update workflow |\n| `workflows.deleteWorkflow()` | Delete workflow |\n| `workflows.activateWorkflow()` | Activate workflow |\n| `workflows.duplicateWorkflow()` | Duplicate a workflow |\n| `workflows.pauseWorkflow()` | Pause workflow |\n| `workflows.restoreWorkflowVersion()` | Restore a workflow version |\n| `workflows.triggerWorkflow()` | Manually start a workflow run |\n\n### Invites\n| Method | Description |\n|--------|-------------|\n| `invites.createInviteToken()` | Create invite token |\n\n## Requirements\n\n- Node.js 18+\n- [Zernio API key](https://zernio.com) (free tier available)\n\n## Links\n\n- [Documentation](https://docs.zernio.com)\n- [Dashboard](https://zernio.com/dashboard)\n- [Changelog](https://docs.zernio.com/changelog)\n\n## License\n\nApache-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzernio-dev%2Fzernio-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzernio-dev%2Fzernio-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzernio-dev%2Fzernio-node/lists"}