{
  "markdown": "<p align=\"center\">\n  <a href=\"https://zernio.com\">\n    <img src=\"https://zernio.com/brand/icon-primary.png\" alt=\"Zernio\" width=\"60\">\n  </a>\n</p>\n\n<h1 align=\"center\">Zernio Python SDK</h1>\n\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/zernio-sdk/\"><img src=\"https://img.shields.io/pypi/v/zernio-sdk.svg\" alt=\"PyPI version\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg\" alt=\"License\"></a>\n</p>\n\n<p align=\"center\">\n  <strong>One API to post everywhere. 16 platforms, zero headaches.</strong>\n</p>\n\nThe official Python 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\npip install zernio-sdk\n```\n\n## Quick Start\n\n```python\nfrom zernio import Zernio\n\n# Reads ZERNIO_API_KEY from environment (or pass explicitly)\nclient = Zernio()\n\n# Publish to multiple platforms with one call\npost = client.posts.create(\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    publish_now=True,\n)\n\nprint(f\"Published to {len(post['post']['platforms'])} platforms!\")\n```\n\n## Configuration\n\n```python\nclient = Zernio(\n    api_key=\"your-api-key\",  # Or set ZERNIO_API_KEY env var\n    base_url=\"https://zernio.com/api\",  # Optional, this is the default\n    timeout=30.0,  # Optional, request timeout in seconds\n)\n```\n\n## Examples\n\n### Schedule a Post\n\n```python\npost = client.posts.create(\n    content=\"This post will go live tomorrow at 10am\",\n    platforms=[{\"platform\": \"instagram\", \"accountId\": \"acc_xxx\"}],\n    scheduled_for=\"2025-02-01T10:00:00Z\",\n)\n```\n\n### Platform-Specific Content\n\nCustomize content per platform while posting to all at once:\n\n```python\npost = client.posts.create(\n    content=\"Default content\",\n    platforms=[\n        {\n            \"platform\": \"twitter\",\n            \"accountId\": \"acc_twitter\",\n            \"platformSpecificContent\": \"Short & punchy for X\",\n        },\n        {\n            \"platform\": \"linkedin\",\n            \"accountId\": \"acc_linkedin\",\n            \"platformSpecificContent\": \"Professional tone for LinkedIn with more detail.\",\n        },\n    ],\n    publish_now=True,\n)\n```\n\n### Upload Media\n\n```python\n# Option 1: Direct upload (simplest)\nresult = client.media.upload(\"path/to/video.mp4\")\nmedia_url = result[\"publicUrl\"]\n\n# Option 2: Upload from bytes\nresult = client.media.upload_bytes(video_bytes, \"video.mp4\", \"video/mp4\")\nmedia_url = result[\"publicUrl\"]\n\n# Create post with media\npost = client.posts.create(\n    content=\"Check out this video!\",\n    media_urls=[media_url],\n    platforms=[\n        {\"platform\": \"tiktok\", \"accountId\": \"acc_xxx\"},\n        {\"platform\": \"youtube\", \"accountId\": \"acc_yyy\", \"youtubeTitle\": \"My Video\"},\n    ],\n    publish_now=True,\n)\n```\n\n### Get Analytics\n\n```python\ndata = client.analytics.get(period=\"30d\")\n\nprint(\"Analytics:\", data)\n```\n\n### List Connected Accounts\n\n```python\ndata = client.accounts.list()\n\nfor account in data[\"accounts\"]:\n    print(f\"{account['platform']}: @{account['username']}\")\n```\n\n### Async Support\n\n```python\nimport asyncio\nfrom zernio import Zernio\n\nasync def main():\n    async with Zernio(api_key=\"your-api-key\") as client:\n        posts = await client.posts.alist(status=\"scheduled\")\n        print(f\"Found {len(posts['posts'])} scheduled posts\")\n\nasyncio.run(main())\n```\n\n## Error Handling\n\n```python\nfrom zernio import Zernio, ZernioAPIError, ZernioRateLimitError, ZernioValidationError\n\nclient = Zernio(api_key=\"your-api-key\")\n\ntry:\n    client.posts.create(content=\"Hello!\", platforms=[...])\nexcept ZernioRateLimitError as e:\n    print(f\"Rate limited: {e}\")\nexcept ZernioValidationError as e:\n    print(f\"Invalid request: {e}\")\nexcept ZernioAPIError as e:\n    print(f\"API error: {e}\")\n```\n\n## Migration from Late\n\nAll old names continue to work. No code changes are required:\n\n```python\n# Old style (still works)\nfrom late import Late, LateAPIError\nclient = Late(api_key=\"...\")\n\n# New style\nfrom zernio import Zernio, ZernioAPIError\nclient = Zernio()  # reads ZERNIO_API_KEY env var\n```\n\nBoth `from zernio import ...` and `from late import ...` work identically. The `LATE_API_KEY` environment variable is also still supported as a fallback when `ZERNIO_API_KEY` is not set.\n\n## SDK Reference\n\n### Posts\n| Method | Description |\n|--------|-------------|\n| `posts.list_posts()` | List posts |\n| `posts.bulk_upload_posts()` | Bulk upload from CSV |\n| `posts.create_post()` | Create post |\n| `posts.get_post()` | Get post |\n| `posts.update_post()` | Update post |\n| `posts.update_post_metadata()` | Update post metadata |\n| `posts.delete_post()` | Delete post |\n| `posts.edit_post()` | Edit published post |\n| `posts.retry_post()` | Retry failed post |\n| `posts.unpublish_post()` | Unpublish post |\n\n### Accounts\n| Method | Description |\n|--------|-------------|\n| `accounts.get_all_accounts_health()` | Check accounts health |\n| `accounts.list_accounts()` | List accounts |\n| `accounts.get_account_health()` | Check account health |\n| `accounts.get_account_posts()` | List posts published on the platform |\n| `accounts.get_bluesky_settings()` | Get Bluesky account settings |\n| `accounts.get_follower_stats()` | Get follower stats |\n| `accounts.get_google_business_review()` | Get a review |\n| `accounts.get_google_business_reviews()` | Get reviews |\n| `accounts.get_instagram_follow_status()` | Check whether an Instagram user follows the account |\n| `accounts.get_linked_in_mentions()` | Resolve LinkedIn mention |\n| `accounts.get_slack_settings()` | Get Slack account settings |\n| `accounts.get_tik_tok_creator_info()` | Get TikTok creator info |\n| `accounts.update_account()` | Update account |\n| `accounts.update_bluesky_settings()` | Update Bluesky account settings |\n| `accounts.update_slack_settings()` | Update Slack account settings |\n| `accounts.delete_account()` | Disconnect account |\n| `accounts.delete_google_business_review_reply()` | Delete a review reply |\n| `accounts.batch_get_google_business_reviews()` | Batch get reviews |\n| `accounts.move_account_to_profile()` | Move account to another profile |\n| `accounts.reply_to_google_business_review()` | Reply to a review |\n\n### Profiles\n| Method | Description |\n|--------|-------------|\n| `profiles.list_profiles()` | List profiles |\n| `profiles.create_profile()` | Create profile |\n| `profiles.get_profile()` | Get profile |\n| `profiles.update_profile()` | Update profile |\n| `profiles.delete_profile()` | Delete profile |\n\n### Analytics\n| Method | Description |\n|--------|-------------|\n| `analytics.get_analytics()` | Get post analytics |\n| `analytics.get_analytics_delta()` | Analytics changed since a cursor |\n| `analytics.get_best_time_to_post()` | Get best times to post |\n| `analytics.get_content_decay()` | Get content performance decay |\n| `analytics.get_daily_metrics()` | Get daily aggregated metrics |\n| `analytics.get_facebook_page_insights()` | Get Facebook Page insights |\n| `analytics.get_facebook_post_earnings()` | Get Facebook post monetization earnings |\n| `analytics.get_facebook_post_reactions()` | Get Facebook post reactions |\n| `analytics.get_google_business_performance()` | Get GBP performance metrics |\n| `analytics.get_google_business_search_keywords()` | Get GBP search keywords |\n| `analytics.get_instagram_account_insights()` | Get Instagram insights |\n| `analytics.get_instagram_demographics()` | Get Instagram demographics |\n| `analytics.get_instagram_follower_history()` | Get Instagram follower history |\n| `analytics.get_linked_in_aggregate_analytics()` | Get LinkedIn aggregate stats |\n| `analytics.get_linked_in_org_aggregate_analytics()` | Get LinkedIn org analytics |\n| `analytics.get_linked_in_post_analytics()` | Get LinkedIn post stats |\n| `analytics.get_linked_in_post_reactions()` | Get LinkedIn post reactions |\n| `analytics.get_post_timeline()` | Get post analytics timeline |\n| `analytics.get_posting_frequency()` | Get frequency vs engagement |\n| `analytics.get_tik_tok_account_insights()` | Get TikTok account-level insights |\n| `analytics.get_you_tube_channel_insights()` | Get YouTube channel insights |\n| `analytics.get_you_tube_daily_views()` | Get YouTube daily views |\n| `analytics.get_you_tube_demographics()` | Get YouTube demographics |\n| `analytics.get_you_tube_video_retention()` | Get YouTube video retention curve |\n| `analytics.sync_external_posts()` | Sync an external post |\n\n### Account Groups\n| Method | Description |\n|--------|-------------|\n| `account_groups.list_account_groups()` | List groups |\n| `account_groups.create_account_group()` | Create group |\n| `account_groups.update_account_group()` | Update group |\n| `account_groups.delete_account_group()` | Delete group |\n\n### Queue\n| Method | Description |\n|--------|-------------|\n| `queue.list_queue_slots()` | List schedules |\n| `queue.create_queue_slot()` | Create schedule |\n| `queue.get_next_queue_slot()` | Get next available slot |\n| `queue.update_queue_slot()` | Update schedule |\n| `queue.delete_queue_slot()` | Delete schedule |\n| `queue.preview_queue()` | Preview upcoming slots |\n\n### Webhooks\n| Method | Description |\n|--------|-------------|\n| `webhooks.create_webhook_settings()` | Create webhook |\n| `webhooks.get_webhook_logs()` | List webhook delivery logs |\n| `webhooks.get_webhook_settings()` | List webhooks |\n| `webhooks.update_webhook_settings()` | Update webhook |\n| `webhooks.delete_webhook_settings()` | Delete webhook |\n| `webhooks.redeliver_webhook_event()` | Redeliver a webhook event |\n| `webhooks.test_webhook()` | Send test webhook |\n\n### API Keys\n| Method | Description |\n|--------|-------------|\n| `api_keys.list_api_keys()` | List keys |\n| `api_keys.create_api_key()` | Create key |\n| `api_keys.delete_api_key()` | Delete key |\n| `api_keys.verify_credential()` | Verify credential |\n\n### Media\n| Method | Description |\n|--------|-------------|\n| `media.get_media_presigned_url()` | Get upload URL |\n| `media.upload()` | Upload a file from path |\n| `media.upload_bytes()` | Upload file from bytes |\n| `media.upload_large()` | Upload large file with multipart |\n| `media.upload_large_bytes()` | Upload large file from bytes |\n| `media.upload_multiple()` | Upload multiple files |\n\n### Users\n| Method | Description |\n|--------|-------------|\n| `users.list_users()` | List users |\n| `users.get_user()` | Get user |\n\n### Usage\n| Method | Description |\n|--------|-------------|\n| `usage.get_billing()` | Account billing snapshot (plan, cycle, balance, caps, status) |\n| `usage.get_calls_usage()` | Calling usage and cost |\n| `usage.get_sms_usage()` | SMS usage (volumes) |\n| `usage.get_usage()` | Usage snapshot (default) or billed-spend metering (with params) |\n| `usage.get_usage_stats()` | Get plan and usage snapshot (plan, limits, payment status) |\n| `usage.get_x_api_pricing()` | Get X/Twitter API pricing table |\n\n### Logs\n| Method | Description |\n|--------|-------------|\n| `logs.list_logs()` | List activity logs |\n\n### Connect (OAuth)\n| Method | Description |\n|--------|-------------|\n| `connect.list_facebook_pages()` | List Facebook pages |\n| `connect.list_google_business_locations()` | List GBP locations |\n| `connect.list_instagram_pages()` | List Pages with a linked Instagram account |\n| `connect.list_linked_in_organizations()` | List LinkedIn orgs |\n| `connect.list_pinterest_boards_for_selection()` | List Pinterest boards |\n| `connect.list_slack_channels()` | List Slack channels for the channel picker |\n| `connect.list_snapchat_profiles()` | List Snapchat profiles |\n| `connect.list_whats_app_phone_numbers()` | List numbers for selection |\n| `connect.create_pinterest_board()` | Create Pinterest board |\n| `connect.get_connect_url()` | Get OAuth connect URL |\n| `connect.get_facebook_pages()` | List Facebook pages |\n| `connect.get_gmb_locations()` | List GBP locations |\n| `connect.get_linked_in_organizations()` | List LinkedIn orgs |\n| `connect.get_pending_o_auth_data()` | Get pending OAuth data |\n| `connect.get_pinterest_boards()` | List Pinterest boards |\n| `connect.get_reddit_flairs()` | List subreddit flairs |\n| `connect.get_reddit_subreddits()` | List Reddit subreddits |\n| `connect.get_shopify_connect_url()` | Get Shopify OAuth connect URL |\n| `connect.get_subreddit_rules()` | Get subreddit rules |\n| `connect.get_telegram_connect_status()` | Generate Telegram code |\n| `connect.get_youtube_captions()` | Get a YouTube video transcript |\n| `connect.get_youtube_playlists()` | List YouTube playlists |\n| `connect.update_facebook_page()` | Update Facebook page |\n| `connect.update_gmb_location()` | Update GBP location |\n| `connect.update_linked_in_organization()` | Switch LinkedIn account type |\n| `connect.update_pinterest_boards()` | Set default Pinterest board |\n| `connect.update_reddit_subreddits()` | Set default subreddit |\n| `connect.update_youtube_default_playlist()` | Set default YouTube playlist |\n| `connect.assign_google_business_location()` | Assign GBP location to another profile |\n| `connect.complete_telegram_connect()` | Check Telegram status |\n| `connect.complete_whats_app_phone_selection()` | Complete number selection |\n| `connect.configure_tik_tok_ads_brand_identity()` | Set TikTok brand identity |\n| `connect.connect_ads()` | Connect ads for a platform |\n| `connect.connect_bluesky_credentials()` | Connect Bluesky account |\n| `connect.connect_discord_channel()` | Connect a Discord channel |\n| `connect.connect_open_ai_ads_credentials()` | Connect an OpenAI Ads account |\n| `connect.connect_shopify_with_token()` | Connect a Shopify store with a custom-app Admin token |\n| `connect.connect_slack_channel()` | Connect a Slack channel |\n| `connect.connect_whats_app_credentials()` | Connect WhatsApp via credentials |\n| `connect.connect_whats_app_embedded_signup()` | Connect WhatsApp from Embedded Signup |\n| `connect.handle_o_auth_callback()` | Complete OAuth callback |\n| `connect.initiate_telegram_connect()` | Connect Telegram directly |\n| `connect.select_facebook_page()` | Select Facebook page |\n| `connect.select_google_business_location()` | Select GBP location |\n| `connect.select_instagram_account()` | Select the Page whose Instagram account to connect |\n| `connect.select_linked_in_organization()` | Select LinkedIn org |\n| `connect.select_pinterest_board()` | Select Pinterest board |\n| `connect.select_snapchat_profile()` | Select Snapchat profile |\n| `connect.set_reddit_post_flair()` | Set Reddit post flair |\n| `connect.vote_reddit_thing()` | Vote on a Reddit post or comment |\n\n### Reddit\n| Method | Description |\n|--------|-------------|\n| `reddit.get_reddit_feed()` | Get subreddit feed |\n| `reddit.search_reddit()` | Search posts |\n\n### Account Settings\n| Method | Description |\n|--------|-------------|\n| `account_settings.get_instagram_ice_breakers()` | Get IG ice breakers |\n| `account_settings.get_messenger_menu()` | Get FB persistent menu |\n| `account_settings.get_telegram_commands()` | Get TG bot commands |\n| `account_settings.delete_instagram_ice_breakers()` | Delete IG ice breakers |\n| `account_settings.delete_messenger_menu()` | Delete FB persistent menu |\n| `account_settings.delete_telegram_commands()` | Delete TG bot commands |\n| `account_settings.set_instagram_ice_breakers()` | Set IG ice breakers |\n| `account_settings.set_messenger_menu()` | Set FB persistent menu |\n| `account_settings.set_telegram_commands()` | Set TG bot commands |\n\n### Ad Accounts\n| Method | Description |\n|--------|-------------|\n| `ad_accounts.list_account_callouts()` | List account-level callout extensions |\n| `ad_accounts.list_ad_accounts()` | List ad accounts |\n| `ad_accounts.list_ad_labels()` | Ad labels |\n| `ad_accounts.list_ad_studies()` | A/B tests and lift studies |\n| `ad_accounts.list_ads_business_centers()` | List TikTok Business Centers |\n| `ad_accounts.list_custom_conversions()` | List custom conversions |\n| `ad_accounts.list_high_demand_periods()` | High demand periods / budget schedules |\n| `ad_accounts.list_meta_businesses()` | Businesses list |\n| `ad_accounts.list_value_rule_sets()` | List value rule sets |\n| `ad_accounts.create_custom_conversion()` | Create or reuse a custom conversion |\n| `ad_accounts.create_high_demand_period()` | Schedule a budget increase |\n| `ad_accounts.create_value_rule_set()` | Create a value rule set |\n| `ad_accounts.get_ad_account_finance()` | Ad account finances |\n| `ad_accounts.get_ad_comments()` | List comments on an ad |\n| `ad_accounts.get_ads_activity_log()` | Ad account change / audit log |\n| `ad_accounts.get_dsa_defaults()` | Get ad account DSA defaults |\n| `ad_accounts.get_dsa_recommendations()` | List DSA beneficiary/payor suggestions |\n| `ad_accounts.get_value_rule_set()` | Read a value rule set |\n| `ad_accounts.update_ad_account()` | Update ad account settings |\n| `ad_accounts.update_value_rule_set()` | Replace a value rule set |\n| `ad_accounts.delete_value_rule_set()` | Delete a value rule set |\n| `ad_accounts.add_account_callouts()` | Add account-level callout extensions |\n| `ad_accounts.remove_account_callout()` | Remove an account-level callout extension |\n\n### Ad Audiences\n| Method | Description |\n|--------|-------------|\n| `ad_audiences.list_ad_audiences()` | List custom audiences |\n| `ad_audiences.create_ad_audience()` | Create custom audience |\n| `ad_audiences.get_ad_audience()` | Get audience details |\n| `ad_audiences.update_ad_audience()` | Update an audience |\n| `ad_audiences.delete_ad_audience()` | Delete custom audience |\n| `ad_audiences.add_users_to_ad_audience()` | Add users to audience |\n| `ad_audiences.replace_ad_audience_companies()` | Replace audience companies |\n\n### Ad Campaigns\n| Method | Description |\n|--------|-------------|\n| `ad_campaigns.list_ad_campaigns()` | List campaigns |\n| `ad_campaigns.list_ad_keywords()` | List Search keywords |\n| `ad_campaigns.list_ad_sets()` | List ad sets |\n| `ad_campaigns.list_ads()` | List ads |\n| `ad_campaigns.list_bid_strategies()` | List Google Ads portfolio bid strategies |\n| `ad_campaigns.list_campaign_negative_keywords()` | List campaign-level negative keywords |\n| `ad_campaigns.bulk_update_ad_campaign_status()` | Pause or resume many campaigns |\n| `ad_campaigns.create_ad_campaign()` | Create a standalone campaign |\n| `ad_campaigns.create_ad_set()` | Create a standalone ad group |\n| `ad_campaigns.create_bid_strategy()` | Create a Google Ads portfolio bid strategy |\n| `ad_campaigns.create_standalone_ad()` | Create standalone ad |\n| `ad_campaigns.get_ad()` | Get ad details |\n| `ad_campaigns.get_ad_set_details()` | Live ad-set details incl. learning phase |\n| `ad_campaigns.get_ad_tree()` | Get campaign tree |\n| `ad_campaigns.get_ads_timeline()` | Get daily account metrics |\n| `ad_campaigns.get_campaign_bidding()` | Read a campaign's current bidding |\n| `ad_campaigns.get_campaign_targeting()` | Read a Google campaign's device, location, and language targeting |\n| `ad_campaigns.update_ad()` | Update ad |\n| `ad_campaigns.update_ad_campaign()` | Update a campaign |\n| `ad_campaigns.update_ad_campaign_status()` | Pause or resume a campaign |\n| `ad_campaigns.update_ad_keyword()` | Pause or enable a Search keyword |\n| `ad_campaigns.update_ad_set()` | Update an ad set |\n| `ad_campaigns.update_ad_set_status()` | Pause or resume a single ad set |\n| `ad_campaigns.update_ad_status()` | Pause or resume a single ad |\n| `ad_campaigns.update_bid_strategy()` | Update a Google Ads portfolio bid strategy |\n| `ad_campaigns.update_campaign_targeting()` | Edit a Google campaign's device, location, or language targeting |\n| `ad_campaigns.delete_ad()` | Cancel an ad |\n| `ad_campaigns.delete_ad_campaign()` | Delete a campaign |\n| `ad_campaigns.delete_ad_set()` | Delete an ad set |\n| `ad_campaigns.add_ad_keywords()` | Add Search keywords to an ad group |\n| `ad_campaigns.attach_campaign_assets()` | Attach extension assets to a Google Search campaign |\n| `ad_campaigns.boost_post()` | Boost post as ad |\n| `ad_campaigns.duplicate_ad()` | Duplicate an ad |\n| `ad_campaigns.duplicate_ad_campaign()` | Duplicate a campaign |\n| `ad_campaigns.duplicate_ad_set()` | Duplicate an ad set |\n| `ad_campaigns.remove_ad_keyword()` | Remove a Search keyword |\n| `ad_campaigns.replace_campaign_negative_keywords()` | Replace campaign-level negative keywords |\n\n### Ad Creatives\n| Method | Description |\n|--------|-------------|\n| `ad_creatives.list_ad_catalog_product_sets()` | List a catalog's product sets |\n| `ad_creatives.list_ad_catalogs()` | List Meta product catalogs |\n| `ad_creatives.list_ad_creatives()` | Creative library |\n| `ad_creatives.list_ad_images()` | Ad image library |\n| `ad_creatives.list_ad_videos()` | Ad video library |\n| `ad_creatives.create_ad_creative()` | Create a standalone creative |\n| `ad_creatives.get_ad_creative()` | Creative details |\n| `ad_creatives.get_ad_media()` | Direct video and image URLs for an ad |\n| `ad_creatives.get_ad_previews()` | Render previews of an existing ad |\n| `ad_creatives.update_ad_creative()` | Rename a creative |\n| `ad_creatives.delete_ad_creative()` | Delete a creative |\n| `ad_creatives.delete_ad_video()` | Delete an ad video |\n| `ad_creatives.generate_ad_previews()` | Render pre-create ad previews |\n| `ad_creatives.upload_ad_image()` | Upload an ad image from base64 |\n| `ad_creatives.upload_ad_video()` | Upload an ad video |\n\n### Ad Insights\n| Method | Description |\n|--------|-------------|\n| `ad_insights.list_local_services_lead_conversations()` | Conversations of a Local Services lead |\n| `ad_insights.list_local_services_leads()` | Google Local Services Ads leads |\n| `ad_insights.create_ad_insights_report()` | Submit an async insights report run |\n| `ad_insights.get_ad_analytics()` | Get ad analytics |\n| `ad_insights.get_ad_insights_report()` | Poll an async insights report run |\n| `ad_insights.get_ads_search_terms()` | Google Ads search terms report |\n| `ad_insights.get_campaign_analytics()` | Get campaign analytics |\n| `ad_insights.generate_keyword_historical_metrics()` | Historical keyword metrics (Google Keyword Planner) |\n| `ad_insights.generate_keyword_ideas()` | Generate keyword ideas (Google Keyword Planner) |\n| `ad_insights.query_ad_insights()` | Flexible live insights query |\n\n### Ad Library\n| Method | Description |\n|--------|-------------|\n| `ad_library.search_ad_library()` | Search the public Ad Library |\n\n### Ad Targeting\n| Method | Description |\n|--------|-------------|\n| `ad_targeting.get_linked_in_bid_pricing()` | Suggested bid and budget bounds |\n| `ad_targeting.get_linked_in_supply_forecast()` | Impressions, clicks and spend forecast |\n| `ad_targeting.estimate_ad_reach()` | Estimate audience reach |\n| `ad_targeting.search_ad_interests()` | Search targeting interests |\n| `ad_targeting.search_ad_targeting()` | Search targeting options |\n\n### Blogs\n| Method | Description |\n|--------|-------------|\n| `blogs.list_blog_articles()` | List blog articles |\n| `blogs.list_blogs()` | List blogs |\n| `blogs.create_blog()` | Create a blog |\n| `blogs.create_blog_article()` | Create a blog article |\n| `blogs.get_blog()` | Get a blog |\n| `blogs.get_blog_article()` | Get a blog article |\n| `blogs.update_blog()` | Update a blog |\n| `blogs.update_blog_article()` | Update a blog article |\n| `blogs.delete_blog()` | Delete a blog |\n| `blogs.delete_blog_article()` | Delete a blog article |\n\n### Broadcasts\n| Method | Description |\n|--------|-------------|\n| `broadcasts.list_broadcast_recipients()` | List broadcast recipients |\n| `broadcasts.list_broadcasts()` | List broadcasts |\n| `broadcasts.create_broadcast()` | Create broadcast draft |\n| `broadcasts.get_broadcast()` | Get broadcast details |\n| `broadcasts.update_broadcast()` | Update broadcast |\n| `broadcasts.delete_broadcast()` | Delete broadcast |\n| `broadcasts.add_broadcast_recipients()` | Add recipients to a broadcast |\n| `broadcasts.cancel_broadcast()` | Cancel broadcast |\n| `broadcasts.schedule_broadcast()` | Schedule broadcast for later |\n| `broadcasts.send_broadcast()` | Send broadcast now |\n\n### Calls\n| Method | Description |\n|--------|-------------|\n| `calls.list_calls()` | List all calls (unified history) |\n| `calls.get_call()` | Get a call (any channel) |\n| `calls.get_call_recording()` | Get a call recording |\n\n### Comment Automations\n| Method | Description |\n|--------|-------------|\n| `comment_automations.list_comment_automation_logs()` | List automation logs |\n| `comment_automations.list_comment_automations()` | List comment-to-DM automations |\n| `comment_automations.create_comment_automation()` | Create comment-to-DM automation |\n| `comment_automations.get_comment_automation()` | Get automation details |\n| `comment_automations.update_comment_automation()` | Update automation settings |\n| `comment_automations.delete_comment_automation()` | Delete automation |\n\n### Comments (Inbox)\n| Method | Description |\n|--------|-------------|\n| `comments.list_inbox_comments()` | List commented posts |\n| `comments.get_inbox_post_comments()` | Get post comments |\n| `comments.delete_inbox_comment()` | Delete comment |\n| `comments.edit_inbox_comment()` | Edit comment |\n| `comments.hide_inbox_comment()` | Hide comment |\n| `comments.like_inbox_comment()` | Like comment |\n| `comments.like_post()` | Like post |\n| `comments.reply_to_inbox_post()` | Reply to comment |\n| `comments.send_private_reply_to_comment()` | Send private reply |\n| `comments.set_comment_moderation()` | Set comment moderation status |\n| `comments.unhide_inbox_comment()` | Unhide comment |\n| `comments.unlike_inbox_comment()` | Unlike comment |\n| `comments.unlike_post()` | Unlike post |\n\n### Connected Apps\n| Method | Description |\n|--------|-------------|\n| `connected_apps.list_connected_apps()` | List connected apps |\n| `connected_apps.revoke_connected_app()` | Revoke connected app |\n\n### Contacts\n| Method | Description |\n|--------|-------------|\n| `contacts.list_contacts()` | List contacts |\n| `contacts.bulk_create_contacts()` | Bulk create contacts |\n| `contacts.create_contact()` | Create contact |\n| `contacts.get_contact()` | Get contact |\n| `contacts.get_contact_channels()` | List channels for a contact |\n| `contacts.update_contact()` | Update contact |\n| `contacts.delete_contact()` | Delete contact |\n\n### Conversions\n| Method | Description |\n|--------|-------------|\n| `conversions.list_conversion_actions()` | List conversion actions and their tag snippets |\n| `conversions.list_conversion_associations()` | List associated campaigns |\n| `conversions.list_conversion_destinations()` | List conversion destinations |\n| `conversions.create_conversion_action()` | Create a website conversion action |\n| `conversions.create_conversion_destination()` | Create a conversion destination |\n| `conversions.get_conversion_destination()` | Get a conversion destination |\n| `conversions.get_conversion_metrics()` | Get attribution metrics |\n| `conversions.get_conversions_quality()` | Get Event Match Quality |\n| `conversions.update_conversion_destination()` | Update a conversion destination |\n| `conversions.delete_conversion_destination()` | Delete a conversion destination |\n| `conversions.add_conversion_associations()` | Associate campaigns |\n| `conversions.adjust_conversions()` | Adjust uploaded conversions |\n| `conversions.remove_conversion_associations()` | Remove associated campaigns |\n| `conversions.send_conversions()` | Send conversion events |\n\n### Custom Fields\n| Method | Description |\n|--------|-------------|\n| `custom_fields.list_custom_fields()` | List custom field definitions |\n| `custom_fields.create_custom_field()` | Create custom field |\n| `custom_fields.update_custom_field()` | Update custom field |\n| `custom_fields.delete_custom_field()` | Delete custom field |\n| `custom_fields.clear_contact_field_value()` | Clear custom field value |\n| `custom_fields.set_contact_field_value()` | Set custom field value |\n\n### Discord\n| Method | Description |\n|--------|-------------|\n| `discord.list_discord_guild_members()` | List Discord guild members |\n| `discord.list_discord_guild_roles()` | List Discord guild roles |\n| `discord.list_discord_pinned_messages()` | List pinned messages |\n| `discord.list_discord_scheduled_events()` | List Discord scheduled events |\n| `discord.create_discord_guild_role()` | Create a Discord guild role |\n| `discord.create_discord_scheduled_event()` | Create a Discord scheduled event |\n| `discord.create_discord_thread()` | Create a Discord public thread |\n| `discord.get_discord_channels()` | List Discord guild channels |\n| `discord.get_discord_guild_member()` | Get a Discord guild member |\n| `discord.get_discord_scheduled_event()` | Get a Discord scheduled event |\n| `discord.get_discord_settings()` | Get Discord account settings |\n| `discord.update_discord_scheduled_event()` | Update a Discord scheduled event |\n| `discord.update_discord_settings()` | Update Discord settings |\n| `discord.delete_discord_guild_role()` | Delete a Discord guild role |\n| `discord.delete_discord_message()` | Delete a Discord channel message |\n| `discord.delete_discord_scheduled_event()` | Delete a Discord scheduled event |\n| `discord.add_discord_member_role()` | Assign a role to a guild member |\n| `discord.crosspost_discord_message()` | Crosspost Discord message |\n| `discord.edit_discord_guild_role()` | Edit a Discord guild role |\n| `discord.pin_discord_message()` | Pin a Discord message |\n| `discord.remove_discord_member_role()` | Remove a role from a guild member |\n| `discord.search_discord_guild_members()` | Search Discord guild members |\n| `discord.send_discord_direct_message()` | Send a Discord Direct Message |\n| `discord.unpin_discord_message()` | Unpin a Discord message |\n\n### GMB Attributes\n| Method | Description |\n|--------|-------------|\n| `gmb_attributes.get_gmb_attribute_metadata()` | Get attribute metadata |\n| `gmb_attributes.get_google_business_attributes()` | Get attributes |\n| `gmb_attributes.update_google_business_attributes()` | Update attributes |\n\n### GMB Food Menus\n| Method | Description |\n|--------|-------------|\n| `gmb_food_menus.get_google_business_food_menus()` | Get food menus |\n| `gmb_food_menus.update_google_business_food_menus()` | Update food menus |\n\n### GMB Location Details\n| Method | Description |\n|--------|-------------|\n| `gmb_location_details.get_google_business_location_details()` | Get location details |\n| `gmb_location_details.update_google_business_location_details()` | Update location details |\n\n### GMB Media\n| Method | Description |\n|--------|-------------|\n| `gmb_media.list_google_business_media()` | List media |\n| `gmb_media.create_google_business_media()` | Upload photo |\n| `gmb_media.delete_google_business_media()` | Delete photo |\n\n### GMB Place Actions\n| Method | Description |\n|--------|-------------|\n| `gmb_place_actions.list_google_business_place_actions()` | List action links |\n| `gmb_place_actions.create_google_business_place_action()` | Create action link |\n| `gmb_place_actions.update_google_business_place_action()` | Update action link |\n| `gmb_place_actions.delete_google_business_place_action()` | Delete action link |\n\n### GMB Services\n| Method | Description |\n|--------|-------------|\n| `gmb_services.get_google_business_services()` | Get services |\n| `gmb_services.update_google_business_services()` | Replace services |\n\n### GMB Verifications\n| Method | Description |\n|--------|-------------|\n| `gmb_verifications.get_google_business_verifications()` | Get verification state |\n| `gmb_verifications.complete_google_business_verification()` | Complete a verification |\n| `gmb_verifications.fetch_google_business_verification_options()` | Fetch verification options |\n| `gmb_verifications.start_google_business_verification()` | Start a verification |\n\n### Inbox Analytics\n| Method | Description |\n|--------|-------------|\n| `inbox_analytics.list_inbox_conversation_analytics()` | List conversation analytics |\n| `inbox_analytics.get_inbox_conversation_analytics()` | Get conversation analytics |\n| `inbox_analytics.get_inbox_heatmap()` | Get day × hour heatmap |\n| `inbox_analytics.get_inbox_response_time()` | Get inbox response-time stats |\n| `inbox_analytics.get_inbox_source_breakdown()` | Get inbox source breakdown |\n| `inbox_analytics.get_inbox_top_accounts()` | Get top accounts by inbox volume |\n| `inbox_analytics.get_inbox_volume()` | Get inbox messaging volume |\n\n### Instagram\n| Method | Description |\n|--------|-------------|\n| `instagram.list_instagram_stories()` | List active Instagram stories |\n| `instagram.get_instagram_audio()` | Get Instagram audio metadata |\n| `instagram.get_instagram_publishing_limit()` | Get Instagram publishing limit |\n| `instagram.get_instagram_story_insights()` | Get Instagram story insights |\n| `instagram.search_instagram_audio()` | Search Instagram audio |\n\n### Lead Gen\n| Method | Description |\n|--------|-------------|\n| `lead_gen.list_form_leads()` | List leads for a single form |\n| `lead_gen.list_lead_forms()` | List lead forms |\n| `lead_gen.list_leads()` | List submitted leads |\n| `lead_gen.create_lead_form()` | Create a lead form |\n| `lead_gen.create_test_lead()` | Create a test lead |\n| `lead_gen.get_lead_form()` | Get a lead form |\n| `lead_gen.archive_lead_form()` | Archive a lead form |\n\n### Mentions\n| Method | Description |\n|--------|-------------|\n| `mentions.list_inbox_mentions()` | List mentions |\n| `mentions.reply_to_mention()` | Reply to a mention |\n\n### Messages (Inbox)\n| Method | Description |\n|--------|-------------|\n| `messages.list_inbox_conversations()` | List conversations |\n| `messages.create_inbox_conversation()` | Create conversation |\n| `messages.get_inbox_conversation()` | Get conversation |\n| `messages.get_inbox_conversation_messages()` | List messages |\n| `messages.get_message_attachment()` | Resolve message attachment |\n| `messages.update_inbox_conversation()` | Update conversation status |\n| `messages.delete_inbox_message()` | Delete message |\n| `messages.add_message_reaction()` | Add reaction |\n| `messages.edit_inbox_message()` | Edit message |\n| `messages.mark_conversation_read()` | Mark a conversation as read |\n| `messages.remove_message_reaction()` | Remove reaction |\n| `messages.search_inbox_conversations()` | Search conversations |\n| `messages.send_inbox_message()` | Send message |\n| `messages.send_typing_indicator()` | Send typing indicator |\n| `messages.upload_media_direct()` | Upload media file |\n\n### Messaging Ads\n| Method | Description |\n|--------|-------------|\n| `messaging_ads.create_call_ad()` | Create Click-to-Call ad |\n| `messaging_ads.create_ctwa_ad()` | Create Click-to-WhatsApp ad (deprecated) |\n| `messaging_ads.create_messaging_ad()` | Create click-to-message ad (WhatsApp / Messenger / Instagram Direct) |\n\n### Phone Numbers\n| Method | Description |\n|--------|-------------|\n| `phone_numbers.list_phone_number_countries()` | List offerable number countries |\n| `phone_numbers.list_phone_number_port_ins()` | List port-in orders |\n| `phone_numbers.list_phone_number_stock_watches()` | List stock watches |\n| `phone_numbers.list_phone_numbers()` | List phone numbers |\n| `phone_numbers.create_phone_number_kyc_link()` | Create a hosted KYC link |\n| `phone_numbers.create_phone_number_port_in()` | Port numbers in |\n| `phone_numbers.create_phone_number_stock_watch()` | Watch an out-of-stock country |\n| `phone_numbers.get_phone_number()` | Get phone number |\n| `phone_numbers.get_phone_number_kyc_form()` | Get KYC form spec |\n| `phone_numbers.get_phone_number_port_in_order_requirements()` | A port-in order's pending requirements |\n| `phone_numbers.get_phone_number_port_in_requirements()` | Country porting requirements |\n| `phone_numbers.get_phone_number_remediation()` | Get declined requirements |\n| `phone_numbers.delete_phone_number_stock_watch()` | Stop watching a country |\n| `phone_numbers.cancel_phone_number_port_in()` | Cancel a port-in |\n| `phone_numbers.check_phone_number_availability()` | Check country availability |\n| `phone_numbers.check_phone_number_portability()` | Check portability |\n| `phone_numbers.purchase_phone_number()` | Purchase phone number |\n| `phone_numbers.release_phone_number()` | Release phone number |\n| `phone_numbers.remediate_phone_number()` | Resubmit a declined number |\n| `phone_numbers.reply_to_phone_number_reviewer()` | Reply to the regulatory reviewer |\n| `phone_numbers.respond_to_phone_number_reviewer()` | Respond to the regulatory reviewer (message + corrections) |\n| `phone_numbers.review_phone_number_kyc_packet()` | Pre-review a KYC packet |\n| `phone_numbers.search_available_phone_numbers()` | Search available numbers |\n| `phone_numbers.submit_phone_number_kyc()` | Submit KYC |\n| `phone_numbers.upload_phone_number_kyc_document()` | Upload a KYC document |\n| `phone_numbers.upload_phone_number_port_in_document()` | Upload a porting document |\n| `phone_numbers.validate_phone_number_kyc_address()` | Pre-validate KYC address |\n| `phone_numbers.view_phone_number_kyc_document()` | View a KYC document on file |\n\n### Reach and Frequency\n| Method | Description |\n|--------|-------------|\n| `reach_and_frequency.create_rf_prediction()` | Create a Reach & Frequency prediction |\n| `reach_and_frequency.get_rf_prediction()` | Read a Reach & Frequency prediction |\n| `reach_and_frequency.cancel_rf_reservation()` | Cancel a Reach & Frequency reservation |\n| `reach_and_frequency.reserve_rf_prediction()` | Reserve a Reach & Frequency prediction |\n\n### Reviews (Inbox)\n| Method | Description |\n|--------|-------------|\n| `reviews.list_inbox_reviews()` | List reviews |\n| `reviews.delete_inbox_review_reply()` | Delete review reply |\n| `reviews.reply_to_inbox_review()` | Reply to review |\n\n### Sequences\n| Method | Description |\n|--------|-------------|\n| `sequences.list_sequence_enrollments()` | List enrollments for a sequence |\n| `sequences.list_sequences()` | List sequences |\n| `sequences.create_sequence()` | Create sequence |\n| `sequences.get_sequence()` | Get sequence with steps |\n| `sequences.update_sequence()` | Update sequence |\n| `sequences.delete_sequence()` | Delete sequence |\n| `sequences.activate_sequence()` | Activate sequence |\n| `sequences.enroll_contacts()` | Enroll contacts in a sequence |\n| `sequences.pause_sequence()` | Pause sequence |\n| `sequences.unenroll_contact()` | Unenroll contact |\n\n### Slack\n| Method | Description |\n|--------|-------------|\n| `slack.list_slack_members()` | List Slack workspace members |\n\n### SMS\n| Method | Description |\n|--------|-------------|\n| `sms.list_sms_opt_outs()` | List SMS opt-outs |\n| `sms.list_sms_registrations()` | List carrier registrations |\n| `sms.list_sms_sender_ids()` | List alphanumeric sender IDs |\n| `sms.create_sms_sender_id()` | Create an alphanumeric sender ID |\n| `sms.get_sms_registration()` | Get a carrier registration |\n| `sms.delete_sms_sender_id()` | Delete an alphanumeric sender ID |\n| `sms.appeal_sms_registration()` | Appeal a rejected campaign |\n| `sms.deactivate_sms_registration()` | Deactivate a brand/campaign registration |\n| `sms.disable_sms_on_number()` | Disable SMS on a number |\n| `sms.enable_sms_on_number()` | Enable SMS on a number |\n| `sms.lookup_sms_number()` | Look up carrier + line type |\n| `sms.preflight_sms_registration()` | Pre-check a carrier registration |\n| `sms.request_sms_sender_id_limit_increase()` | Request a higher sender ID daily limit |\n| `sms.resend_sms_registration_otp()` | Re-send the sole-prop OTP |\n| `sms.respond_to_sms_registration_review()` | Reply to a change request |\n| `sms.reuse_sms_registration_for_number()` | Add number to SMS registration |\n| `sms.send_sms()` | Send an SMS/MMS |\n| `sms.share_sms_registration()` | Create a registration share link |\n| `sms.start_sms_registration()` | Start a carrier registration |\n| `sms.upload_sms_opt_in_proof()` | Upload opt-in form proof for an appeal |\n| `sms.upload_sms_opt_in_proof_file()` | Upload opt-in form proof |\n| `sms.verify_sms_registration_otp()` | Submit the sole-prop OTP |\n\n### Tracking Tags\n| Method | Description |\n|--------|-------------|\n| `tracking_tags.list_tracking_tag_shared_accounts()` | List accounts it is shared with |\n| `tracking_tags.list_tracking_tags()` | List tracking tags |\n| `tracking_tags.create_tracking_tag()` | Create a tracking tag |\n| `tracking_tags.get_ad_tracking_tags()` | Get ad tracking tags |\n| `tracking_tags.get_tracking_tag()` | Get a tracking tag |\n| `tracking_tags.get_tracking_tag_stats()` | Get aggregated event stats |\n| `tracking_tags.update_ad_tracking_tags()` | Set ad tracking tags |\n| `tracking_tags.update_tracking_tag()` | Update a tracking tag |\n| `tracking_tags.add_tracking_tag_shared_account()` | Share with an ad account |\n| `tracking_tags.remove_tracking_tag_shared_account()` | Stop sharing with an account |\n\n### Twitter Engagement\n| Method | Description |\n|--------|-------------|\n| `twitter_engagement.get_tweet()` | Look up a tweet |\n| `twitter_engagement.bookmark_post()` | Bookmark a tweet |\n| `twitter_engagement.follow_user()` | Follow a user |\n| `twitter_engagement.remove_bookmark()` | Remove bookmark |\n| `twitter_engagement.retweet_post()` | Retweet a post |\n| `twitter_engagement.search_tweets()` | Search recent tweets |\n| `twitter_engagement.undo_retweet()` | Undo retweet |\n| `twitter_engagement.unfollow_user()` | Unfollow a user |\n\n### Validate\n| Method | Description |\n|--------|-------------|\n| `validate.validate_media()` | Validate media URL |\n| `validate.validate_post()` | Validate post content |\n| `validate.validate_post_length()` | Validate character count |\n| `validate.validate_subreddit()` | Check subreddit existence |\n\n### Verify\n| Method | Description |\n|--------|-------------|\n| `verify.create_verification()` | Send a verification code |\n| `verify.get_verification()` | Get a verification |\n| `verify.check_verification()` | Check a verification code |\n\n### Voice\n| Method | Description |\n|--------|-------------|\n| `voice.list_sip_trunks()` | List SIP trunks |\n| `voice.list_voice_calls()` | List phone calls |\n| `voice.create_sip_trunk()` | Create a SIP trunk |\n| `voice.create_voice_call()` | Place an outbound phone call |\n| `voice.create_voice_web_session()` | Mint a browser softphone session |\n| `voice.get_sip_trunk()` | Get a SIP trunk |\n| `voice.get_voice_call()` | Get a phone call |\n| `voice.get_voice_call_estimate()` | Estimate call cost |\n| `voice.get_voice_call_recording()` | Get a call recording |\n| `voice.delete_sip_trunk()` | Delete a SIP trunk |\n| `voice.attach_number_to_sip_trunk()` | Attach a number to a SIP trunk |\n| `voice.detach_number_from_sip_trunk()` | Detach a number from its SIP trunk |\n| `voice.dial_voice_web_call()` | Dial from the browser softphone |\n| `voice.disable_voice_on_number()` | Disable phone calling on a number |\n| `voice.enable_voice_on_number()` | Enable phone calling on a number |\n| `voice.end_voice_call()` | Hang up a live call |\n| `voice.rotate_sip_trunk_credentials()` | Rotate a SIP trunk's password |\n| `voice.transfer_voice_call()` | Blind-transfer a live call |\n\n### WhatsApp\n| Method | Description |\n|--------|-------------|\n| `whatsapp.list_whats_app_account_events()` | List account notifications |\n| `whatsapp.list_whats_app_conversions()` | List conversion events |\n| `whatsapp.list_whats_app_group_chats()` | List active groups |\n| `whatsapp.list_whats_app_group_join_requests()` | List join requests |\n| `whatsapp.create_whats_app_dataset()` | Provision CTWA dataset |\n| `whatsapp.create_whats_app_group_chat()` | Create group |\n| `whatsapp.create_whats_app_group_invite_link()` | Create invite link |\n| `whatsapp.create_whats_app_template()` | Create template |\n| `whatsapp.get_whats_app_block_status()` | Check if a user is blocked |\n| `whatsapp.get_whats_app_blocked_users()` | List blocked users |\n| `whatsapp.get_whats_app_business_profile()` | Get business profile |\n| `whatsapp.get_whats_app_dataset()` | Get CTWA conversions dataset |\n| `whatsapp.get_whats_app_display_name()` | Get display name status |\n| `whatsapp.get_whats_app_group_chat()` | Get group info |\n| `whatsapp.get_whats_app_media()` | Download WhatsApp media |\n| `whatsapp.get_whats_app_template()` | Get template |\n| `whatsapp.get_whats_app_template_by_id()` | Get template by id |\n| `whatsapp.get_whats_app_templates()` | List templates |\n| `whatsapp.get_whatsapp_business_username()` | Get business username |\n| `whatsapp.get_whatsapp_business_username_suggestions()` | Get username suggestions |\n| `whatsapp.update_whats_app_business_profile()` | Update business profile |\n| `whatsapp.update_whats_app_display_name()` | Request display name change |\n| `whatsapp.update_whats_app_group_chat()` | Update group settings |\n| `whatsapp.update_whats_app_template()` | Update template |\n| `whatsapp.update_whats_app_template_by_id()` | Update template by id |\n| `whatsapp.delete_whats_app_group_chat()` | Delete group |\n| `whatsapp.delete_whats_app_template()` | Delete template |\n| `whatsapp.delete_whats_app_template_by_id()` | Delete template by id |\n| `whatsapp.delete_whatsapp_business_username()` | Delete business username |\n| `whatsapp.add_whats_app_group_participants()` | Add participants |\n| `whatsapp.approve_whats_app_group_join_requests()` | Approve join requests |\n| `whatsapp.block_whats_app_users()` | Block users |\n| `whatsapp.register_whats_app_number()` | Register a connected WhatsApp number on the Cloud API |\n| `whatsapp.reject_whats_app_group_join_requests()` | Reject join requests |\n| `whatsapp.remove_whats_app_group_participants()` | Remove participants |\n| `whatsapp.send_whats_app_conversion()` | Send WhatsApp conversion event |\n| `whatsapp.set_whatsapp_business_username()` | Set business username |\n| `whatsapp.unblock_whats_app_users()` | Unblock users |\n| `whatsapp.upload_whats_app_profile_photo()` | Upload profile picture |\n\n### WhatsApp Calling\n| Method | Description |\n|--------|-------------|\n| `whatsapp_calling.list_whats_app_calls()` | List call history for an account |\n| `whatsapp_calling.get_whats_app_call()` | Get a single call |\n| `whatsapp_calling.get_whats_app_call_estimate()` | Estimate per-minute cost |\n| `whatsapp_calling.get_whats_app_call_permissions()` | Check call permission |\n| `whatsapp_calling.get_whats_app_call_recording()` | Get a call recording |\n| `whatsapp_calling.get_whats_app_calling()` | Get calling config for a number |\n| `whatsapp_calling.get_whats_app_calling_config()` | Get calling config for an account |\n| `whatsapp_calling.update_whats_app_calling()` | Update calling config |\n| `whatsapp_calling.update_whats_app_calling_legacy()` | Update calling config |\n| `whatsapp_calling.disable_whats_app_calling()` | Disable calling on a number |\n| `whatsapp_calling.disable_whats_app_calling_legacy()` | Disable calling on a number |\n| `whatsapp_calling.enable_whats_app_calling()` | Enable calling on a number |\n| `whatsapp_calling.enable_whats_app_calling_legacy()` | Enable calling on a number |\n| `whatsapp_calling.initiate_whats_app_call()` | Initiate outbound call |\n| `whatsapp_calling.start_whats_app_caller_id_verification()` | Start caller-ID verification for a customer-brought number |\n| `whatsapp_calling.verify_whats_app_caller_id()` | Confirm the caller-ID verification code |\n\n### WhatsApp Flows\n| Method | Description |\n|--------|-------------|\n| `whatsapp_flows.list_whats_app_flow_responses()` | List flow responses |\n| `whatsapp_flows.list_whats_app_flow_versions()` | List flow versions |\n| `whatsapp_flows.list_whats_app_flows()` | List flows |\n| `whatsapp_flows.create_whats_app_flow()` | Create flow |\n| `whatsapp_flows.get_whats_app_flow()` | Get flow |\n| `whatsapp_flows.get_whats_app_flow_json()` | Get flow JSON asset |\n| `whatsapp_flows.get_whats_app_flow_preview()` | Get flow preview URL |\n| `whatsapp_flows.get_whats_app_flows_encryption_key()` | Get Flows encryption key status |\n| `whatsapp_flows.update_whats_app_flow()` | Update flow |\n| `whatsapp_flows.delete_whats_app_flow()` | Delete flow |\n| `whatsapp_flows.deprecate_whats_app_flow()` | Deprecate flow |\n| `whatsapp_flows.publish_whats_app_flow()` | Publish flow |\n| `whatsapp_flows.send_whats_app_flow_message()` | Send flow message |\n| `whatsapp_flows.set_whats_app_flows_encryption_key()` | Register a Flows encryption key |\n| `whatsapp_flows.upload_whats_app_flow_json()` | Upload flow JSON |\n\n### WhatsApp Phone Numbers\n| Method | Description |\n|--------|-------------|\n| `whatsapp_phone_numbers.list_whats_app_number_countries()` | List offerable number countries |\n| `whatsapp_phone_numbers.create_whats_app_number_kyc_link()` | Create a hosted KYC link |\n| `whatsapp_phone_numbers.get_whats_app_number_info()` | Get number status |\n| `whatsapp_phone_numbers.get_whats_app_number_kyc_form()` | Get KYC form spec |\n| `whatsapp_phone_numbers.get_whats_app_number_remediation()` | Get declined requirements |\n| `whatsapp_phone_numbers.get_whats_app_phone_number()` | Get phone number |\n| `whatsapp_phone_numbers.get_whats_app_phone_numbers()` | List phone numbers |\n| `whatsapp_phone_numbers.check_whats_app_number_availability()` | Check country availability |\n| `whatsapp_phone_numbers.move_whats_app_number_to_profile()` | Move a number to another profile |\n| `whatsapp_phone_numbers.purchase_whats_app_phone_number()` | Purchase phone number |\n| `whatsapp_phone_numbers.release_whats_app_phone_number()` | Release phone number |\n| `whatsapp_phone_numbers.remediate_whats_app_number()` | Resubmit a declined number |\n| `whatsapp_phone_numbers.search_available_whats_app_numbers()` | Search available numbers |\n| `whatsapp_phone_numbers.submit_whats_app_number_kyc()` | Submit KYC |\n| `whatsapp_phone_numbers.upload_whats_app_number_kyc_document()` | Upload a KYC document |\n| `whatsapp_phone_numbers.validate_whats_app_number_kyc_address()` | Pre-validate KYC address |\n\n### WhatsApp Sandbox\n| Method | Description |\n|--------|-------------|\n| `whatsapp_sandbox.list_whats_app_sandbox_sessions()` | List your sandbox sessions |\n| `whatsapp_sandbox.create_whats_app_sandbox_session()` | Start a sandbox activation |\n| `whatsapp_sandbox.delete_whats_app_sandbox_session()` | Revoke a sandbox session |\n\n### WhatsApp Templates\n| Method | Description |\n|--------|-------------|\n| `whatsapp_templates.get_whats_app_library_template()` | Look up a library template |\n\n### Workflows\n| Method | Description |\n|--------|-------------|\n| `workflows.list_workflow_execution_events()` | Get an execution's timeline |\n| `workflows.list_workflow_executions()` | List workflow runs |\n| `workflows.list_workflow_versions()` | List a workflow's version history |\n| `workflows.list_workflows()` | List workflows |\n| `workflows.create_workflow()` | Create workflow |\n| `workflows.get_workflow()` | Get workflow with graph |\n| `workflows.get_workflow_version()` | Get a specific workflow version |\n| `workflows.update_workflow()` | Update workflow |\n| `workflows.delete_workflow()` | Delete workflow |\n| `workflows.activate_workflow()` | Activate workflow |\n| `workflows.duplicate_workflow()` | Duplicate a workflow |\n| `workflows.pause_workflow()` | Pause workflow |\n| `workflows.restore_workflow_version()` | Restore a workflow version |\n| `workflows.trigger_workflow()` | Manually start a workflow run |\n\n### Invites\n| Method | Description |\n|--------|-------------|\n| `invites.create_invite_token()` | Create invite token |\n\n## MCP Server (Claude Desktop)\n\nThe SDK includes a Model Context Protocol (MCP) server for integration with Claude Desktop. See [MCP documentation](https://docs.zernio.com/resources/mcp) for setup instructions.\n\n```bash\npip install zernio-sdk[mcp]\n```\n\n## Requirements\n\n- Python 3.10+\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",
  "bytes": 51986,
  "sha": "c43cbbbc2c8b1797b6d538c284a6f994a6bb4b46e873db50f54b744d4453f0ac",
  "repo_slug": "zernio-dev/zernio-python",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_zernio_zernio_7f5e9f0d/readme"
}