zernio-sdk 1.4.331__tar.gz → 1.4.332__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/PKG-INFO +2 -1
  2. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/README.md +1 -0
  3. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/openapi.yaml +61 -0
  4. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/pyproject.toml +1 -1
  5. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/__init__.py +1 -1
  6. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/generated_tools.py +54 -0
  7. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/models/_generated/models.py +1 -1
  8. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_campaigns.py +62 -0
  9. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/uv.lock +1 -1
  10. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.dockerignore +0 -0
  11. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.env.example +0 -0
  12. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.github/CODEOWNERS +0 -0
  13. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.github/workflows/generate.yml +0 -0
  14. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.github/workflows/release-preview.yml +0 -0
  15. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.github/workflows/release.yml +0 -0
  16. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.github/workflows/test.yml +0 -0
  17. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/.gitignore +0 -0
  18. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/CHANGELOG.md +0 -0
  19. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/Dockerfile +0 -0
  20. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/Dockerfile.docker +0 -0
  21. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/LICENSE +0 -0
  22. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/claude-desktop-config.json +0 -0
  23. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/docs/HTTP_DEPLOYMENT.md +0 -0
  24. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/docs/MCP.md +0 -0
  25. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/01_basic_usage.py +0 -0
  26. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/02_schedule_from_csv.py +0 -0
  27. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/03_cross_posting.py +0 -0
  28. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/04_ai_content_generation.py +0 -0
  29. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/05_download_tools.py +0 -0
  30. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/data/sample_posts.csv +0 -0
  31. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/examples/publish_post.py +0 -0
  32. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/railway.toml +0 -0
  33. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_examples.py +0 -0
  34. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_mcp_docs.py +0 -0
  35. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_mcp_tools.py +0 -0
  36. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_models.py +0 -0
  37. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_readme_reference.py +0 -0
  38. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/generate_resources.py +0 -0
  39. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/scripts/smoketest_streamable_http.py +0 -0
  40. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/server.json +0 -0
  41. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/ai/__init__.py +0 -0
  42. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/ai/content_generator.py +0 -0
  43. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/ai/protocols.py +0 -0
  44. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/ai/providers/__init__.py +0 -0
  45. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/ai/providers/openai.py +0 -0
  46. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/client/__init__.py +0 -0
  47. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/client/base.py +0 -0
  48. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/client/exceptions.py +0 -0
  49. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/client/late_client.py +0 -0
  50. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/client/rate_limiter.py +0 -0
  51. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/enums.py +0 -0
  52. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/__init__.py +0 -0
  53. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/__main__.py +0 -0
  54. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/auth.py +0 -0
  55. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/config.py +0 -0
  56. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/constants.py +0 -0
  57. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/http_server.py +0 -0
  58. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/server.py +0 -0
  59. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/mcp/tool_definitions.py +0 -0
  60. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/models/__init__.py +0 -0
  61. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/models/_generated/__init__.py +0 -0
  62. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/models/responses.py +0 -0
  63. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/pipelines/__init__.py +0 -0
  64. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/pipelines/cross_poster.py +0 -0
  65. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/pipelines/csv_scheduler.py +0 -0
  66. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/__init__.py +0 -0
  67. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/__init__.py +0 -0
  68. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/account_groups.py +0 -0
  69. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/account_settings.py +0 -0
  70. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/accounts.py +0 -0
  71. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_accounts.py +0 -0
  72. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_audiences.py +0 -0
  73. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_creatives.py +0 -0
  74. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_insights.py +0 -0
  75. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ad_targeting.py +0 -0
  76. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/ads.py +0 -0
  77. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/analytics.py +0 -0
  78. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/api_keys.py +0 -0
  79. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/broadcasts.py +0 -0
  80. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/calls.py +0 -0
  81. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/comment_automations.py +0 -0
  82. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/comments.py +0 -0
  83. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/connect.py +0 -0
  84. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/contacts.py +0 -0
  85. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/conversions.py +0 -0
  86. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/custom_fields.py +0 -0
  87. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/discord.py +0 -0
  88. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_attributes.py +0 -0
  89. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_food_menus.py +0 -0
  90. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_location_details.py +0 -0
  91. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_media.py +0 -0
  92. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_place_actions.py +0 -0
  93. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_services.py +0 -0
  94. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/gmb_verifications.py +0 -0
  95. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/inbox.py +0 -0
  96. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/inbox_analytics.py +0 -0
  97. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/instagram.py +0 -0
  98. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/invites.py +0 -0
  99. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/lead_gen.py +0 -0
  100. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/logs.py +0 -0
  101. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/media.py +0 -0
  102. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/mentions.py +0 -0
  103. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/messages.py +0 -0
  104. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/messaging_ads.py +0 -0
  105. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/phone_numbers.py +0 -0
  106. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/posts.py +0 -0
  107. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/profiles.py +0 -0
  108. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/queue.py +0 -0
  109. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/reach_and_frequency.py +0 -0
  110. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/reddit.py +0 -0
  111. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/reviews.py +0 -0
  112. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/sequences.py +0 -0
  113. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/sms.py +0 -0
  114. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/tools.py +0 -0
  115. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/tracking_tags.py +0 -0
  116. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/twitter_engagement.py +0 -0
  117. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/usage.py +0 -0
  118. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/users.py +0 -0
  119. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/validate.py +0 -0
  120. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/verify.py +0 -0
  121. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/voice.py +0 -0
  122. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/webhooks.py +0 -0
  123. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp.py +0 -0
  124. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp_calling.py +0 -0
  125. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp_flows.py +0 -0
  126. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp_phone_numbers.py +0 -0
  127. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp_sandbox.py +0 -0
  128. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/whatsapp_templates.py +0 -0
  129. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/_generated/workflows.py +0 -0
  130. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/accounts.py +0 -0
  131. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/ads.py +0 -0
  132. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/analytics.py +0 -0
  133. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/base.py +0 -0
  134. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/media.py +0 -0
  135. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/posts.py +0 -0
  136. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/profiles.py +0 -0
  137. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/queue.py +0 -0
  138. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/tools.py +0 -0
  139. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/resources/users.py +0 -0
  140. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/__init__.py +0 -0
  141. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/config.py +0 -0
  142. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/direct.py +0 -0
  143. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/protocols.py +0 -0
  144. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/smart.py +0 -0
  145. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/utils.py +0 -0
  146. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/vercel/__init__.py +0 -0
  147. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/vercel/client.py +0 -0
  148. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/late/upload/vercel/uploader.py +0 -0
  149. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/src/zernio/__init__.py +0 -0
  150. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/__init__.py +0 -0
  151. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/conftest.py +0 -0
  152. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/test_client.py +0 -0
  153. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/test_exhaustive.py +0 -0
  154. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/test_integration.py +0 -0
  155. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/test_patch_methods.py +0 -0
  156. {zernio_sdk-1.4.331 → zernio_sdk-1.4.332}/tests/test_resolve_account.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zernio-sdk
3
- Version: 1.4.331
3
+ Version: 1.4.332
4
4
  Summary: The official Python library for the Zernio API
5
5
  Project-URL: Homepage, https://zernio.com
6
6
  Project-URL: Documentation, https://docs.zernio.com
@@ -459,6 +459,7 @@ Both `from zernio import ...` and `from late import ...` work identically. The `
459
459
  | Method | Description |
460
460
  |--------|-------------|
461
461
  | `ad_campaigns.list_ad_campaigns()` | List campaigns |
462
+ | `ad_campaigns.list_ad_keywords()` | List Search keywords |
462
463
  | `ad_campaigns.list_ads()` | List ads |
463
464
  | `ad_campaigns.bulk_update_ad_campaign_status()` | Pause or resume many campaigns |
464
465
  | `ad_campaigns.create_ad_campaign()` | Create a standalone campaign |
@@ -406,6 +406,7 @@ Both `from zernio import ...` and `from late import ...` work identically. The `
406
406
  | Method | Description |
407
407
  |--------|-------------|
408
408
  | `ad_campaigns.list_ad_campaigns()` | List campaigns |
409
+ | `ad_campaigns.list_ad_keywords()` | List Search keywords |
409
410
  | `ad_campaigns.list_ads()` | List ads |
410
411
  | `ad_campaigns.bulk_update_ad_campaign_status()` | Pause or resume many campaigns |
411
412
  | `ad_campaigns.create_ad_campaign()` | Create a standalone campaign |
@@ -33711,6 +33711,67 @@ paths:
33711
33711
  '403':
33712
33712
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
33713
33713
 
33714
+ /v1/ads/keywords:
33715
+ get:
33716
+ operationId: listAdKeywords
33717
+ tags: ["Ad Campaigns"]
33718
+ x-platforms: ["google"]
33719
+ summary: List Search keywords
33720
+ description: |
33721
+ Returns the Google Search keyword criteria (positive and negative) synced from
33722
+ connected Google Ads accounts, one row per ad-group keyword. Populated by the
33723
+ periodic ads discovery sweep (roughly every 3 hours per account), so keywords
33724
+ added on Google appear with that delay. Campaign-level negative keywords are
33725
+ not included; only ad-group-level criteria are.
33726
+ security:
33727
+ - bearerAuth: []
33728
+ parameters:
33729
+ - $ref: '#/components/parameters/PageParam'
33730
+ - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 500, default: 50 } }
33731
+ - { name: accountId, in: query, schema: { type: string }, description: Social account ID }
33732
+ - { name: adAccountId, in: query, schema: { type: string }, description: 'Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.' }
33733
+ - { name: profileId, in: query, schema: { type: string }, description: Profile ID }
33734
+ - { name: campaignId, in: query, schema: { type: string }, description: Platform campaign ID }
33735
+ - { name: adSetId, in: query, schema: { type: string }, description: 'Platform ad group ID (Google ad group)' }
33736
+ - { name: status, in: query, schema: { type: string, enum: [active, paused] }, description: Keyword criterion status }
33737
+ - { name: matchType, in: query, schema: { type: string, enum: [exact, phrase, broad, unknown] } }
33738
+ - { name: negative, in: query, schema: { type: boolean }, description: 'true = negative keywords only, false = positive only. Omit for both.' }
33739
+ - { name: search, in: query, schema: { type: string, maxLength: 200 }, description: 'Case-insensitive substring match on the keyword text' }
33740
+ responses:
33741
+ '200':
33742
+ description: Paginated keywords
33743
+ content:
33744
+ application/json:
33745
+ schema:
33746
+ type: object
33747
+ properties:
33748
+ keywords:
33749
+ type: array
33750
+ items:
33751
+ type: object
33752
+ properties:
33753
+ id: { type: string }
33754
+ accountId: { type: string, description: Social account ID owning the sync }
33755
+ profileId: { type: string }
33756
+ platform: { type: string, enum: [google] }
33757
+ adAccountId: { type: string, description: Google customer ID }
33758
+ campaignId: { type: string }
33759
+ campaignName: { type: [string, "null"] }
33760
+ campaignStatus: { type: [string, "null"] }
33761
+ adSetId: { type: string, description: Google ad group ID }
33762
+ adSetName: { type: [string, "null"] }
33763
+ adSetStatus: { type: [string, "null"] }
33764
+ keyword: { type: string }
33765
+ matchType: { type: string, enum: [exact, phrase, broad, unknown] }
33766
+ status: { type: string, enum: [active, paused] }
33767
+ negative: { type: boolean }
33768
+ syncedAt: { type: [string, "null"], format: date-time }
33769
+ pagination: { $ref: '#/components/schemas/Pagination' }
33770
+ '400': { $ref: '#/components/responses/BadRequest' }
33771
+ '401': { $ref: '#/components/responses/Unauthorized' }
33772
+ '403':
33773
+ description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
33774
+
33714
33775
  /v1/ads/campaigns:
33715
33776
  get:
33716
33777
  operationId: listAdCampaigns
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "zernio-sdk"
3
- version = "1.4.331"
3
+ version = "1.4.332"
4
4
  description = "The official Python library for the Zernio API"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -42,7 +42,7 @@ from .enums import (
42
42
  Visibility,
43
43
  )
44
44
 
45
- __version__ = "1.4.331"
45
+ __version__ = "1.4.332"
46
46
 
47
47
  __all__ = [
48
48
  # Client
@@ -1777,6 +1777,60 @@ def register_generated_tools(mcp, _get_client):
1777
1777
  except Exception as e:
1778
1778
  return f"Error: {e}"
1779
1779
 
1780
+ @mcp.tool(
1781
+ annotations=ToolAnnotations(
1782
+ title="List Search keywords",
1783
+ readOnlyHint=True,
1784
+ destructiveHint=False,
1785
+ openWorldHint=False,
1786
+ )
1787
+ )
1788
+ def ad_campaigns_list_ad_keywords(
1789
+ page: int = 1,
1790
+ limit: int = 50,
1791
+ account_id: str | None = None,
1792
+ ad_account_id: str | None = None,
1793
+ profile_id: str | None = None,
1794
+ campaign_id: str | None = None,
1795
+ ad_set_id: str | None = None,
1796
+ status: str | None = None,
1797
+ match_type: str | None = None,
1798
+ negative: bool | None = None,
1799
+ search: str | None = None,
1800
+ ) -> str:
1801
+ """List Search keywords
1802
+
1803
+ Args:
1804
+ page: Page number
1805
+ limit
1806
+ account_id: Social account ID
1807
+ ad_account_id: Platform ad account ID (Google customer ID). Mirrors the same filter on /v1/ads.
1808
+ profile_id: Profile ID
1809
+ campaign_id: Platform campaign ID
1810
+ ad_set_id: Platform ad group ID (Google ad group)
1811
+ status: Keyword criterion status
1812
+ match_type
1813
+ negative: true = negative keywords only, false = positive only. Omit for both.
1814
+ search: Case-insensitive substring match on the keyword text"""
1815
+ client = _get_client()
1816
+ try:
1817
+ response = client.ad_campaigns.list_ad_keywords(
1818
+ page=page,
1819
+ limit=limit,
1820
+ account_id=account_id,
1821
+ ad_account_id=ad_account_id,
1822
+ profile_id=profile_id,
1823
+ campaign_id=campaign_id,
1824
+ ad_set_id=ad_set_id,
1825
+ status=status,
1826
+ match_type=match_type,
1827
+ negative=negative,
1828
+ search=search,
1829
+ )
1830
+ return _format_response(response)
1831
+ except Exception as e:
1832
+ return f"Error: {e}"
1833
+
1780
1834
  @mcp.tool(
1781
1835
  annotations=ToolAnnotations(
1782
1836
  title="List campaigns",
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: openapi.yaml
3
- # timestamp: 2026-07-24T18:20:53+00:00
3
+ # timestamp: 2026-07-27T09:31:44+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -93,6 +93,37 @@ class AdCampaignsResource:
93
93
  )
94
94
  return self._client._get("/v1/ads", params=params)
95
95
 
96
+ def list_ad_keywords(
97
+ self,
98
+ *,
99
+ page: int | None = 1,
100
+ limit: int | None = 50,
101
+ account_id: str | None = None,
102
+ ad_account_id: str | None = None,
103
+ profile_id: str | None = None,
104
+ campaign_id: str | None = None,
105
+ ad_set_id: str | None = None,
106
+ status: str | None = None,
107
+ match_type: str | None = None,
108
+ negative: bool | None = None,
109
+ search: str | None = None,
110
+ ) -> dict[str, Any]:
111
+ """List Search keywords"""
112
+ params = self._build_params(
113
+ page=page,
114
+ limit=limit,
115
+ account_id=account_id,
116
+ ad_account_id=ad_account_id,
117
+ profile_id=profile_id,
118
+ campaign_id=campaign_id,
119
+ ad_set_id=ad_set_id,
120
+ status=status,
121
+ match_type=match_type,
122
+ negative=negative,
123
+ search=search,
124
+ )
125
+ return self._client._get("/v1/ads/keywords", params=params)
126
+
96
127
  def list_ad_campaigns(
97
128
  self,
98
129
  *,
@@ -670,6 +701,37 @@ class AdCampaignsResource:
670
701
  )
671
702
  return await self._client._aget("/v1/ads", params=params)
672
703
 
704
+ async def alist_ad_keywords(
705
+ self,
706
+ *,
707
+ page: int | None = 1,
708
+ limit: int | None = 50,
709
+ account_id: str | None = None,
710
+ ad_account_id: str | None = None,
711
+ profile_id: str | None = None,
712
+ campaign_id: str | None = None,
713
+ ad_set_id: str | None = None,
714
+ status: str | None = None,
715
+ match_type: str | None = None,
716
+ negative: bool | None = None,
717
+ search: str | None = None,
718
+ ) -> dict[str, Any]:
719
+ """List Search keywords (async)"""
720
+ params = self._build_params(
721
+ page=page,
722
+ limit=limit,
723
+ account_id=account_id,
724
+ ad_account_id=ad_account_id,
725
+ profile_id=profile_id,
726
+ campaign_id=campaign_id,
727
+ ad_set_id=ad_set_id,
728
+ status=status,
729
+ match_type=match_type,
730
+ negative=negative,
731
+ search=search,
732
+ )
733
+ return await self._client._aget("/v1/ads/keywords", params=params)
734
+
673
735
  async def alist_ad_campaigns(
674
736
  self,
675
737
  *,
@@ -2389,7 +2389,7 @@ wheels = [
2389
2389
 
2390
2390
  [[package]]
2391
2391
  name = "zernio-sdk"
2392
- version = "1.4.330"
2392
+ version = "1.4.331"
2393
2393
  source = { editable = "." }
2394
2394
  dependencies = [
2395
2395
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes