Skip to content
Merged
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.46.0"
".": "0.47.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 138
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/zavu/zavudev-8d3a92fdcc7420395b9101eb0dc21d7e31581c9debb35893421d3bf81d5756f5.yml
openapi_spec_hash: 511f44a4b13dddd2bd669913849cf104
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/zavu/zavudev-69a49371271acbb8de23d4d5336746b1487a5fb9b30189ec74f6a74a8a487951.yml
openapi_spec_hash: 05122bf62f2a0ba6f1948eb97f1af7fb
config_hash: 70a26cd21f0ca1b34242677b831603db
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## 0.47.0 (2026-08-02)

Full Changelog: [v0.46.0...v0.47.0](https://github.com/zavudev/sdk-python/compare/v0.46.0...v0.47.0)

### Features

* **api:** api update ([d9c58f8](https://github.com/zavudev/sdk-python/commit/d9c58f8db4b81b234189ee95a1e2fcf6405e032f))
* **api:** api update ([da46bec](https://github.com/zavudev/sdk-python/commit/da46becf9b4af3db30dc36fdfb7bedc27c791ec2))
* **api:** api update ([6fee13f](https://github.com/zavudev/sdk-python/commit/6fee13fcb0dbe55ee6257f3d9f360731da251a44))
* **api:** api update ([549ec1d](https://github.com/zavudev/sdk-python/commit/549ec1d3c369113d3682c8eb499b905d954fc136))
* **api:** api update ([1cafed2](https://github.com/zavudev/sdk-python/commit/1cafed2e21dfccb90a4ab09b98525be28d7481c9))
* **api:** api update ([acf9e00](https://github.com/zavudev/sdk-python/commit/acf9e008feae130193c9b12759c3ac6801c0b58e))
* **api:** api update ([eab4046](https://github.com/zavudev/sdk-python/commit/eab4046ff43c57b684917c7fc107f9c1ca8d582e))
* **api:** api update ([5954d05](https://github.com/zavudev/sdk-python/commit/5954d051a7563b2b59971a37cb465813c929b088))
* **api:** api update ([5a5e327](https://github.com/zavudev/sdk-python/commit/5a5e32773275af52862c9e4d00e98f00052ecc5f))
* **api:** api update ([fe4c991](https://github.com/zavudev/sdk-python/commit/fe4c991998a0838466edce4e46e61b1fb212a470))
* **api:** api update ([651eca7](https://github.com/zavudev/sdk-python/commit/651eca7024525cb98251498dab6939f3b9d363a6))
* **api:** api update ([5cded74](https://github.com/zavudev/sdk-python/commit/5cded745f3a5a725db610b09a4c456fad434c3a5))

## 0.46.0 (2026-07-23)

Full Changelog: [v0.45.0...v0.46.0](https://github.com/zavudev/sdk-python/compare/v0.45.0...v0.46.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "zavudev"
version = "0.46.0"
version = "0.47.0"
description = "The official Python library for the zavudev API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/zavudev/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "zavudev"
__version__ = "0.46.0" # x-release-please-version
__version__ = "0.47.0" # x-release-please-version
38 changes: 28 additions & 10 deletions src/zavudev/resources/functions/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ def update(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
http_enabled: bool | Omit = omit,
source_code: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
Expand All @@ -177,15 +178,22 @@ def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FunctionUpdateResponse:
"""
Update the draft source code and/or dependency map without triggering a build.
Visible in the dashboard immediately, but the live (deployed) function does not
change until `POST /v1/functions/{functionId}/deploy` runs.
"""Update an existing function.

`sourceCode` / `dependencies` edit the draft
without triggering a build — they go live on the next
`POST /v1/functions/{functionId}/deploy`. `httpEnabled` is applied to the
deployed function immediately, so turning the public endpoint on or off does not
require a redeploy.

Args:
dependencies: New dependency map (replaces existing dependencies).

source_code: New source code to publish (replaces the draft).
http_enabled: Expose the function on its public HTTPS URL, or take it down. Applies to the
already-deployed function without redeploying; the URL is returned as
`publicUrl`.

source_code: New source code for the draft (replaces it).

extra_headers: Send extra headers

Expand All @@ -202,6 +210,7 @@ def update(
body=maybe_transform(
{
"dependencies": dependencies,
"http_enabled": http_enabled,
"source_code": source_code,
},
function_update_params.FunctionUpdateParams,
Expand Down Expand Up @@ -520,6 +529,7 @@ async def update(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
http_enabled: bool | Omit = omit,
source_code: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
Expand All @@ -528,15 +538,22 @@ async def update(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> FunctionUpdateResponse:
"""
Update the draft source code and/or dependency map without triggering a build.
Visible in the dashboard immediately, but the live (deployed) function does not
change until `POST /v1/functions/{functionId}/deploy` runs.
"""Update an existing function.

`sourceCode` / `dependencies` edit the draft
without triggering a build — they go live on the next
`POST /v1/functions/{functionId}/deploy`. `httpEnabled` is applied to the
deployed function immediately, so turning the public endpoint on or off does not
require a redeploy.

Args:
dependencies: New dependency map (replaces existing dependencies).

source_code: New source code to publish (replaces the draft).
http_enabled: Expose the function on its public HTTPS URL, or take it down. Applies to the
already-deployed function without redeploying; the URL is returned as
`publicUrl`.

source_code: New source code for the draft (replaces it).

extra_headers: Send extra headers

Expand All @@ -553,6 +570,7 @@ async def update(
body=await async_maybe_transform(
{
"dependencies": dependencies,
"http_enabled": http_enabled,
"source_code": source_code,
},
function_update_params.FunctionUpdateParams,
Expand Down
102 changes: 80 additions & 22 deletions src/zavudev/resources/invitations.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def create(
client_email: str | Omit = omit,
client_name: str | Omit = omit,
client_phone: str | Omit = omit,
connection_type: Literal["whatsapp_waba"] | Omit = omit,
connection_type: Literal["whatsapp_waba", "messenger"] | Omit = omit,
expires_in_days: int | Omit = omit,
phone_number_id: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
Expand All @@ -64,30 +64,54 @@ def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> InvitationCreateResponse:
"""Create a partner invitation link for a client to connect WhatsApp.
"""Create a partner invitation link for a client to connect a Meta channel.

The client
opens the returned `url` and completes Meta's embedded signup, linking an
official WhatsApp Business Account. The resulting sender is created in your
project when the client completes the flow, and the invitation transitions to
The
client opens the returned `url` and authorizes with Meta; the resulting sender
is created in your project when they finish, and the invitation transitions to
`completed`.

`connectionType` picks the channel:

- `whatsapp_waba` (default): Meta's embedded signup links an official WhatsApp
Business Account.
- `messenger`: the client picks a Facebook Page they administer; its Messenger
inbox (including Marketplace chats) is routed to Zavu.

One invitation connects one channel — create one per channel to onboard a client
on several. `phoneNumberId` and `allowedPhoneCountries` apply to `whatsapp_waba`
only.

Args:
allowed_phone_countries: ISO country codes for allowed phone numbers.
allowed_phone_countries: ISO country codes for allowed phone numbers. Only valid when `connectionType` is
`whatsapp_waba` — sending it with `messenger` returns 400.

client_email: Email of the client being invited.

client_name: Name of the client being invited.

client_phone: Phone number of the client in E.164 format.

connection_type: How the client connects WhatsApp. `whatsapp_waba` (default) runs Meta's embedded
signup to link an official WhatsApp Business Account.
connection_type: Which Meta channel the client connects, and how.

- `whatsapp_waba` (default): Meta's embedded signup links an official WhatsApp
Business Account. Accepts `phoneNumberId` and `allowedPhoneCountries`.
- `messenger`: the client authorizes with Facebook and picks a Facebook Page
they administer. The Page's Messenger inbox — including Marketplace chats — is
routed to Zavu. They must be an admin of at least one Page. A Page can only be
connected to one Zavu project at a time: if the client picks a Page that
another project already connected, the newer connection wins and the older one
is disconnected.

One invitation connects one channel. To onboard a client on several channels,
create one invitation per channel; each completes into its own sender.

expires_in_days: Number of days until the invitation expires.

phone_number_id: ID of a Zavu phone number to pre-assign for WhatsApp registration. If provided,
the client will use this number instead of their own.
the client will use this number instead of their own. Only valid when
`connectionType` is `whatsapp_waba` — sending it with `messenger` returns 400,
since a Facebook Page has no phone number.

extra_headers: Send extra headers

Expand Down Expand Up @@ -155,7 +179,7 @@ def list(
*,
cursor: str | Omit = omit,
limit: int | Omit = omit,
status: Literal["pending", "in_progress", "completed", "expired", "cancelled"] | Omit = omit,
status: Literal["pending", "in_progress", "completed", "expired", "cancelled", "failed"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
Expand All @@ -169,6 +193,11 @@ def list(
Args:
status: Current status of the partner invitation.

`failed` means the client started the connection and it did not finish (they
cancelled Meta's dialog, denied a permission, or abandoned the tab). A failed
invitation is still usable: the same link can be retried, and it moves back to
`in_progress` when the client tries again.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand Down Expand Up @@ -260,7 +289,7 @@ async def create(
client_email: str | Omit = omit,
client_name: str | Omit = omit,
client_phone: str | Omit = omit,
connection_type: Literal["whatsapp_waba"] | Omit = omit,
connection_type: Literal["whatsapp_waba", "messenger"] | Omit = omit,
expires_in_days: int | Omit = omit,
phone_number_id: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
Expand All @@ -270,30 +299,54 @@ async def create(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> InvitationCreateResponse:
"""Create a partner invitation link for a client to connect WhatsApp.
"""Create a partner invitation link for a client to connect a Meta channel.

The client
opens the returned `url` and completes Meta's embedded signup, linking an
official WhatsApp Business Account. The resulting sender is created in your
project when the client completes the flow, and the invitation transitions to
The
client opens the returned `url` and authorizes with Meta; the resulting sender
is created in your project when they finish, and the invitation transitions to
`completed`.

`connectionType` picks the channel:

- `whatsapp_waba` (default): Meta's embedded signup links an official WhatsApp
Business Account.
- `messenger`: the client picks a Facebook Page they administer; its Messenger
inbox (including Marketplace chats) is routed to Zavu.

One invitation connects one channel — create one per channel to onboard a client
on several. `phoneNumberId` and `allowedPhoneCountries` apply to `whatsapp_waba`
only.

Args:
allowed_phone_countries: ISO country codes for allowed phone numbers.
allowed_phone_countries: ISO country codes for allowed phone numbers. Only valid when `connectionType` is
`whatsapp_waba` — sending it with `messenger` returns 400.

client_email: Email of the client being invited.

client_name: Name of the client being invited.

client_phone: Phone number of the client in E.164 format.

connection_type: How the client connects WhatsApp. `whatsapp_waba` (default) runs Meta's embedded
signup to link an official WhatsApp Business Account.
connection_type: Which Meta channel the client connects, and how.

- `whatsapp_waba` (default): Meta's embedded signup links an official WhatsApp
Business Account. Accepts `phoneNumberId` and `allowedPhoneCountries`.
- `messenger`: the client authorizes with Facebook and picks a Facebook Page
they administer. The Page's Messenger inbox — including Marketplace chats — is
routed to Zavu. They must be an admin of at least one Page. A Page can only be
connected to one Zavu project at a time: if the client picks a Page that
another project already connected, the newer connection wins and the older one
is disconnected.

One invitation connects one channel. To onboard a client on several channels,
create one invitation per channel; each completes into its own sender.

expires_in_days: Number of days until the invitation expires.

phone_number_id: ID of a Zavu phone number to pre-assign for WhatsApp registration. If provided,
the client will use this number instead of their own.
the client will use this number instead of their own. Only valid when
`connectionType` is `whatsapp_waba` — sending it with `messenger` returns 400,
since a Facebook Page has no phone number.

extra_headers: Send extra headers

Expand Down Expand Up @@ -361,7 +414,7 @@ def list(
*,
cursor: str | Omit = omit,
limit: int | Omit = omit,
status: Literal["pending", "in_progress", "completed", "expired", "cancelled"] | Omit = omit,
status: Literal["pending", "in_progress", "completed", "expired", "cancelled", "failed"] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
Expand All @@ -375,6 +428,11 @@ def list(
Args:
status: Current status of the partner invitation.

`failed` means the client started the connection and it did not finish (they
cancelled Meta's dialog, denied a permission, or abandoned the tab). A failed
invitation is still usable: the same link can be retried, and it moves back to
`in_progress` when the client tries again.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand Down
34 changes: 26 additions & 8 deletions src/zavudev/resources/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,19 @@ def send(
- Window opens when the user messages you first
- Use template messages to initiate conversations outside the window

**Daily limits:**

- Unverified accounts: 200 messages per channel per day
- Complete KYC verification to increase limits to 10,000/day
**Plan allowances and email billing:**

- WhatsApp, Telegram, Instagram and Messenger share an allowance of 2,000
messages per month on Free. Over it, sends return 429 with code
`a2p_limit_exceeded` and upgrade details; the counter resets on the 1st of
each month. Paid plans have no message caps
- Email is billed from your prepaid balance in 1,000-message blocks: $0.40 per
1,000 transactional emails, $0.80 per 1,000 marketing (broadcast) emails. A
block is charged when your monthly count crosses each 1,000 boundary, and at
zero balance email sends return 402 with code `insufficient_balance`. Free
teams start with $2 of credit and additionally cap at 3,000 emails/month and
100/day. Teams on earlier plans keep their original email quotas instead
- SMS and voice are billed per message from your balance on every plan

**Email recipient pre-flight:** Email messages are validated automatically
before dispatch. Sends that would be a guaranteed hard bounce are failed instead
Expand Down Expand Up @@ -530,10 +539,19 @@ async def send(
- Window opens when the user messages you first
- Use template messages to initiate conversations outside the window

**Daily limits:**

- Unverified accounts: 200 messages per channel per day
- Complete KYC verification to increase limits to 10,000/day
**Plan allowances and email billing:**

- WhatsApp, Telegram, Instagram and Messenger share an allowance of 2,000
messages per month on Free. Over it, sends return 429 with code
`a2p_limit_exceeded` and upgrade details; the counter resets on the 1st of
each month. Paid plans have no message caps
- Email is billed from your prepaid balance in 1,000-message blocks: $0.40 per
1,000 transactional emails, $0.80 per 1,000 marketing (broadcast) emails. A
block is charged when your monthly count crosses each 1,000 boundary, and at
zero balance email sends return 402 with code `insufficient_balance`. Free
teams start with $2 of credit and additionally cap at 3,000 emails/month and
100/day. Teams on earlier plans keep their original email quotas instead
- SMS and voice are billed per message from your balance on every plan

**Email recipient pre-flight:** Email messages are validated automatically
before dispatch. Sends that would be a guaranteed hard bounce are failed instead
Expand Down
Loading
Loading