{"id":47633534,"url":"https://github.com/zernio-dev/zernio-python","last_synced_at":"2026-05-18T19:12:33.030Z","repository":{"id":332831461,"uuid":"1114670109","full_name":"zernio-dev/zernio-python","owner":"zernio-dev","description":"Zernio's Official Python SDK","archived":false,"fork":false,"pushed_at":"2026-05-01T14:59:02.000Z","size":5563,"stargazers_count":6,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2026-05-01T16:32:27.994Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://zernio.com","language":"Python","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":".github/CODEOWNERS","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":"2025-12-11T17:56:11.000Z","updated_at":"2026-05-01T14:58:59.000Z","dependencies_parsed_at":"2026-04-07T13:00:56.184Z","dependency_job_id":null,"html_url":"https://github.com/zernio-dev/zernio-python","commit_stats":null,"previous_names":["getlatedev/late-python","zernio-dev/zernio-python"],"tags_count":210,"template":false,"template_full_name":null,"purl":"pkg:github/zernio-dev/zernio-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zernio-dev","download_url":"https://codeload.github.com/zernio-dev/zernio-python/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zernio-dev%2Fzernio-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32618391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-01T23:55:40.964Z","updated_at":"2026-05-18T19:12:33.024Z","avatar_url":"https://github.com/zernio-dev.png","language":"Python","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 Python SDK\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/zernio-sdk/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/zernio-sdk.svg\" alt=\"PyPI 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 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 \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    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_follower_stats()` | Get follower stats |\n| `accounts.get_google_business_reviews()` | Get reviews |\n| `accounts.get_linked_in_mentions()` | Resolve LinkedIn mention |\n| `accounts.get_tik_tok_creator_info()` | Get TikTok creator info |\n| `accounts.update_account()` | Update account |\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 a different 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_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_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 organization page aggregate 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-level insights |\n| `analytics.get_you_tube_daily_views()` | Get YouTube daily views |\n| `analytics.get_you_tube_demographics()` | Get YouTube demographics |\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_settings()` | List webhooks |\n| `webhooks.update_webhook_settings()` | Update webhook |\n| `webhooks.delete_webhook_settings()` | Delete webhook |\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\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_usage_stats()` | Get plan and usage stats |\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_linked_in_organizations()` | List LinkedIn orgs |\n| `connect.list_pinterest_boards_for_selection()` | List Pinterest boards |\n| `connect.list_snapchat_profiles()` | List Snapchat profiles |\n| `connect.list_whats_app_phone_numbers()` | List WhatsApp phone numbers for selection |\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_telegram_connect_status()` | Generate Telegram code |\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.complete_telegram_connect()` | Check Telegram status |\n| `connect.complete_whats_app_phone_selection()` | Complete WhatsApp phone number selection |\n| `connect.configure_tik_tok_ads_brand_identity()` | Configure TikTok Ads Brand Identity |\n| `connect.connect_ads()` | Connect ads for a platform |\n| `connect.connect_bluesky_credentials()` | Connect Bluesky account |\n| `connect.connect_whats_app_credentials()` | Connect WhatsApp via credentials |\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_linked_in_organization()` | Select LinkedIn org |\n| `connect.select_pinterest_board()` | Select Pinterest board |\n| `connect.select_snapchat_profile()` | Select Snapchat profile |\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 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.delete_ad_audience()` | Delete custom audience |\n| `ad_audiences.add_users_to_ad_audience()` | Add users to audience |\n\n### Ad Campaigns\n| Method | Description |\n|--------|-------------|\n| `ad_campaigns.list_ad_campaigns()` | List campaigns |\n| `ad_campaigns.bulk_update_ad_campaign_status()` | Pause or resume many campaigns |\n| `ad_campaigns.get_ad_tree()` | Get campaign tree |\n| `ad_campaigns.get_ads_timeline()` | Get daily aggregate ad metrics for an account |\n| `ad_campaigns.update_ad_campaign()` | Update a campaign (budget and/or bid strategy) |\n| `ad_campaigns.update_ad_campaign_status()` | Pause or resume a campaign |\n| `ad_campaigns.update_ad_set()` | Update an ad set (budget, status, and/or bid strategy) |\n| `ad_campaigns.update_ad_set_status()` | Pause or resume a single ad set |\n| `ad_campaigns.delete_ad_campaign()` | Delete a campaign |\n| `ad_campaigns.duplicate_ad_campaign()` | Duplicate a campaign |\n\n### Ads\n| Method | Description |\n|--------|-------------|\n| `ads.list_ad_accounts()` | List ad accounts |\n| `ads.list_ads()` | List ads |\n| `ads.list_ads_business_centers()` | List TikTok Business Centers |\n| `ads.list_conversion_associations()` | List campaigns associated with a conversion destination |\n| `ads.list_conversion_destinations()` | List destinations for the Conversions API |\n| `ads.create_conversion_destination()` | Create a conversion destination (LinkedIn) |\n| `ads.create_ctwa_ad()` | Create Click-to-WhatsApp ad(s) |\n| `ads.create_standalone_ad()` | Create standalone ad |\n| `ads.get_ad()` | Get ad details |\n| `ads.get_ad_analytics()` | Get ad analytics |\n| `ads.get_ad_comments()` | List comments on an ad |\n| `ads.get_conversion_destination()` | Fetch a single conversion destination |\n| `ads.get_conversion_metrics()` | Fetch attribution metrics for a conversion destination |\n| `ads.update_ad()` | Update ad |\n| `ads.update_conversion_destination()` | Update a conversion destination |\n| `ads.delete_ad()` | Cancel an ad |\n| `ads.delete_conversion_destination()` | Soft-delete a conversion destination |\n| `ads.add_conversion_associations()` | Associate campaigns with a conversion destination |\n| `ads.boost_post()` | Boost post as ad |\n| `ads.remove_conversion_associations()` | Remove campaign↔conversion associations |\n| `ads.search_ad_interests()` | Search targeting interests |\n| `ads.search_ad_targeting_locations()` | Search geo targeting locations (Meta) |\n| `ads.send_conversions()` | Send conversion events to an ad platform |\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### 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.hide_inbox_comment()` | Hide comment |\n| `comments.like_inbox_comment()` | Like comment |\n| `comments.reply_to_inbox_post()` | Reply to comment |\n| `comments.send_private_reply_to_comment()` | Send private reply |\n| `comments.unhide_inbox_comment()` | Unhide comment |\n| `comments.unlike_inbox_comment()` | Unlike comment |\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### 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.get_discord_channels()` | List Discord guild channels |\n| `discord.get_discord_settings()` | Get Discord account settings |\n| `discord.update_discord_settings()` | Update Discord settings |\n\n### GMB Attributes\n| Method | Description |\n|--------|-------------|\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### Instagram\n| Method | Description |\n|--------|-------------|\n| `instagram.list_instagram_stories()` | List active Instagram stories |\n| `instagram.get_instagram_story_insights()` | Get Instagram story insights |\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.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.remove_message_reaction()` | Remove reaction |\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### 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### Tracking Tags\n| Method | Description |\n|--------|-------------|\n| `tracking_tags.list_tracking_tag_shared_accounts()` | List ad accounts a tracking tag is shared with |\n| `tracking_tags.list_tracking_tags()` | List tracking tags (Meta Pixels) |\n| `tracking_tags.create_tracking_tag()` | Create a tracking tag (Meta Pixel) |\n| `tracking_tags.get_tracking_tag()` | Fetch a single tracking tag (Meta Pixel) |\n| `tracking_tags.get_tracking_tag_stats()` | Aggregated event stats for a tracking tag (Meta Pixel) |\n| `tracking_tags.update_tracking_tag()` | Update a tracking tag (Meta Pixel) |\n| `tracking_tags.add_tracking_tag_shared_account()` | Share a tracking tag with an ad account |\n| `tracking_tags.remove_tracking_tag_shared_account()` | Stop sharing a tracking tag with an ad account |\n\n### Twitter Engagement\n| Method | Description |\n|--------|-------------|\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.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### WhatsApp\n| Method | Description |\n|--------|-------------|\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_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_business_profile()` | Get business profile |\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_template()` | Get template |\n| `whatsapp.get_whats_app_templates()` | List templates |\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.delete_whats_app_group_chat()` | Delete group |\n| `whatsapp.delete_whats_app_template()` | Delete template |\n| `whatsapp.add_whats_app_group_participants()` | Add participants |\n| `whatsapp.approve_whats_app_group_join_requests()` | Approve join requests |\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.upload_whats_app_profile_photo()` | Upload profile picture |\n\n### WhatsApp Flows\n| Method | Description |\n|--------|-------------|\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.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.upload_whats_app_flow_json()` | Upload flow JSON |\n\n### WhatsApp Phone Numbers\n| Method | Description |\n|--------|-------------|\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.purchase_whats_app_phone_number()` | Purchase phone number |\n| `whatsapp_phone_numbers.release_whats_app_phone_number()` | Release phone number |\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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzernio-dev%2Fzernio-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzernio-dev%2Fzernio-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzernio-dev%2Fzernio-python/lists"}