Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.48.0"
".": "0.49.0"
}
6 changes: 3 additions & 3 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-3a307b6fa4a6fc0199acbf0660fd1e5ca0ac68082b073b74dbd22e70f3a9ea6e.yml
openapi_spec_hash: a9a255215f69ae2c4abbef59b07f08ea
config_hash: 70a26cd21f0ca1b34242677b831603db
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/zavu/zavudev-e4987140138afb7287e25f31dc8cff94c6b11975e460e0c19d54ec457d009a1b.yml
openapi_spec_hash: d20e1b8d0a9a7a65dc8a21e3a151111e
config_hash: 7fca08d9dae18513f5d7451cea11e34c
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## 0.49.0 (2026-08-11)

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

### Features

* **api:** api update ([f90d54e](https://github.com/zavudev/sdk-python/commit/f90d54e6f49ebed82447a815d8c80aecc023b937))
* **api:** api update ([6d5a3ca](https://github.com/zavudev/sdk-python/commit/6d5a3ca83b4b43226a3309ac2f0a95f88f155cf8))
* **api:** api update ([9b7009e](https://github.com/zavudev/sdk-python/commit/9b7009ebf8feb54d716c24fec138eb8e06609b10))
* **api:** api update ([4219934](https://github.com/zavudev/sdk-python/commit/4219934a39d21c244328b7f64ab0554669eb06df))
* **api:** api update ([142b83f](https://github.com/zavudev/sdk-python/commit/142b83f6f2e703f635a1cbf83400af6fba5fc419))

## 0.48.0 (2026-08-05)

Full Changelog: [v0.47.0...v0.48.0](https://github.com/zavudev/sdk-python/compare/v0.47.0...v0.48.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.48.0"
version = "0.49.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.48.0" # x-release-please-version
__version__ = "0.49.0" # x-release-please-version
54 changes: 42 additions & 12 deletions src/zavudev/resources/broadcasts/broadcasts.py
Original file line number Diff line number Diff line change
Expand Up @@ -513,12 +513,27 @@ def send(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BroadcastSendResponse:
"""Start sending the broadcast immediately or schedule for later.

Broadcasts go
through automated AI content review before sending. If the review passes, the
broadcast proceeds. If rejected, use PATCH to edit content, then call POST
/retry-review. Reserves the estimated cost from your balance.
"""
Start sending the broadcast immediately or schedule for later.

**Verification is required to send, and there are two of them.** The team must
have completed both identity verification (KYC) and business verification (KYB);
passing one is not enough. Drafts can be created, edited and kept without
either. Every send path — dashboard, API and CLI alike — enforces both,
returning `403` with code `kyc_required` or `kyb_required` for whichever is
outstanding.

**Review depends on the channel, and cannot be bypassed.** A draft is submitted
to automated content review here; it does not go straight out. A WhatsApp
broadcast built on a Meta-approved template skips review (Meta already vetted
the content) and begins sending. An email broadcast sends as soon as the
automated review passes. Every other channel moves to `pending_admin_review` and
waits for a person. If the review rejects it, use PATCH to edit the content then
call POST /retry-review.

Calling this on a broadcast that is already `approved` or `scheduled` sends or
reschedules it directly, since it has already been reviewed. Reserves the
estimated cost from your balance.

Args:
scheduled_at: Schedule for future delivery. Omit to send immediately.
Expand Down Expand Up @@ -1003,12 +1018,27 @@ async def send(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> BroadcastSendResponse:
"""Start sending the broadcast immediately or schedule for later.

Broadcasts go
through automated AI content review before sending. If the review passes, the
broadcast proceeds. If rejected, use PATCH to edit content, then call POST
/retry-review. Reserves the estimated cost from your balance.
"""
Start sending the broadcast immediately or schedule for later.

**Verification is required to send, and there are two of them.** The team must
have completed both identity verification (KYC) and business verification (KYB);
passing one is not enough. Drafts can be created, edited and kept without
either. Every send path — dashboard, API and CLI alike — enforces both,
returning `403` with code `kyc_required` or `kyb_required` for whichever is
outstanding.

**Review depends on the channel, and cannot be bypassed.** A draft is submitted
to automated content review here; it does not go straight out. A WhatsApp
broadcast built on a Meta-approved template skips review (Meta already vetted
the content) and begins sending. An email broadcast sends as soon as the
automated review passes. Every other channel moves to `pending_admin_review` and
waits for a person. If the review rejects it, use PATCH to edit the content then
call POST /retry-review.

Calling this on a broadcast that is already `approved` or `scheduled` sends or
reschedules it directly, since it has already been reviewed. Reserves the
estimated cost from your balance.

Args:
scheduled_at: Schedule for future delivery. Omit to send immediately.
Expand Down
114 changes: 108 additions & 6 deletions src/zavudev/resources/functions/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ def create(
slug: str,
dependencies: Dict[str, str] | Omit = omit,
description: str | Omit = omit,
entrypoint: str | Omit = omit,
files: Dict[str, str] | Omit = omit,
http_enabled: bool | Omit = omit,
memory_mb: Literal[128, 256, 512, 1024] | Omit = omit,
runtime: Literal["nodejs24"] | Omit = omit,
Expand All @@ -95,11 +97,24 @@ def create(

dependencies: npm dependencies. Keys are package names, values are semver ranges.

entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

http_enabled: Whether to expose a public HTTPS URL for this function.

runtime: Runtime the function is deployed on.

source_code: TypeScript source code for the function entry point (max ~900KB).
source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

timeout_sec: Per-invocation timeout in seconds. Event and cron invocations are asynchronous,
so a long timeout only bounds cost; a tool called during a live conversation
Expand All @@ -122,6 +137,8 @@ def create(
"slug": slug,
"dependencies": dependencies,
"description": description,
"entrypoint": entrypoint,
"files": files,
"http_enabled": http_enabled,
"memory_mb": memory_mb,
"runtime": runtime,
Expand Down Expand Up @@ -174,6 +191,8 @@ def update(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
entrypoint: str | Omit = omit,
files: 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.
Expand All @@ -194,11 +213,24 @@ def update(
Args:
dependencies: New dependency map (replaces existing dependencies).

entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

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).
source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

extra_headers: Send extra headers

Expand All @@ -215,6 +247,8 @@ def update(
body=maybe_transform(
{
"dependencies": dependencies,
"entrypoint": entrypoint,
"files": files,
"http_enabled": http_enabled,
"source_code": source_code,
},
Expand Down Expand Up @@ -266,6 +300,8 @@ def deploy(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
entrypoint: str | Omit = omit,
files: Dict[str, str] | 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 @@ -284,7 +320,20 @@ def deploy(
Args:
dependencies: New dependency map (replaces existing dependencies).

source_code: New source code to publish (replaces the draft).
entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

extra_headers: Send extra headers

Expand All @@ -301,6 +350,8 @@ def deploy(
body=maybe_transform(
{
"dependencies": dependencies,
"entrypoint": entrypoint,
"files": files,
"source_code": source_code,
},
function_deploy_params.FunctionDeployParams,
Expand Down Expand Up @@ -434,6 +485,8 @@ async def create(
slug: str,
dependencies: Dict[str, str] | Omit = omit,
description: str | Omit = omit,
entrypoint: str | Omit = omit,
files: Dict[str, str] | Omit = omit,
http_enabled: bool | Omit = omit,
memory_mb: Literal[128, 256, 512, 1024] | Omit = omit,
runtime: Literal["nodejs24"] | Omit = omit,
Expand All @@ -460,11 +513,24 @@ async def create(

dependencies: npm dependencies. Keys are package names, values are semver ranges.

entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

http_enabled: Whether to expose a public HTTPS URL for this function.

runtime: Runtime the function is deployed on.

source_code: TypeScript source code for the function entry point (max ~900KB).
source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

timeout_sec: Per-invocation timeout in seconds. Event and cron invocations are asynchronous,
so a long timeout only bounds cost; a tool called during a live conversation
Expand All @@ -487,6 +553,8 @@ async def create(
"slug": slug,
"dependencies": dependencies,
"description": description,
"entrypoint": entrypoint,
"files": files,
"http_enabled": http_enabled,
"memory_mb": memory_mb,
"runtime": runtime,
Expand Down Expand Up @@ -539,6 +607,8 @@ async def update(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
entrypoint: str | Omit = omit,
files: 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.
Expand All @@ -559,11 +629,24 @@ async def update(
Args:
dependencies: New dependency map (replaces existing dependencies).

entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

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).
source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

extra_headers: Send extra headers

Expand All @@ -580,6 +663,8 @@ async def update(
body=await async_maybe_transform(
{
"dependencies": dependencies,
"entrypoint": entrypoint,
"files": files,
"http_enabled": http_enabled,
"source_code": source_code,
},
Expand Down Expand Up @@ -631,6 +716,8 @@ async def deploy(
function_id: str,
*,
dependencies: Dict[str, str] | Omit = omit,
entrypoint: str | Omit = omit,
files: Dict[str, str] | 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 @@ -649,7 +736,20 @@ async def deploy(
Args:
dependencies: New dependency map (replaces existing dependencies).

source_code: New source code to publish (replaces the draft).
entrypoint: Which file in `files` is the entry point. Defaults to `index.ts`.

files: The project's source files, keyed by path relative to the project root (e.g.
`index.ts`, `lib/orders.ts`). Imports between them are resolved when the
function is built, so a function can be split across as many files as it needs.

Paths must be relative and use forward slashes; `..`, `node_modules/` and
`package.json` are rejected. npm packages are not uploaded here — declare them
under `dependencies` and Zavu installs them. Limits: 200 files and 900,000 bytes
for the whole tree.

source_code: Shortcut for a single-file function: exactly equivalent to sending `files` with
one entry named after `entrypoint` (`index.ts` by default). Fully supported —
use whichever fits. If both are sent, `files` wins.

extra_headers: Send extra headers

Expand All @@ -666,6 +766,8 @@ async def deploy(
body=await async_maybe_transform(
{
"dependencies": dependencies,
"entrypoint": entrypoint,
"files": files,
"source_code": source_code,
},
function_deploy_params.FunctionDeployParams,
Expand Down
10 changes: 8 additions & 2 deletions src/zavudev/resources/phone_numbers.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,10 @@ def purchase(

Requires a paid plan: the Free plan cannot
purchase phone numbers and receives `402` with code `paid_plan_required`. Paid
plans include the first US number at no charge.
plans include one US number at no charge. The included number is one per account
and is granted once: claiming it spends the benefit for good, so releasing that
number does not make another one free, and numbers the account already bought do
not consume it.

Args:
phone_number: Phone number in E.164 format.
Expand Down Expand Up @@ -540,7 +543,10 @@ async def purchase(

Requires a paid plan: the Free plan cannot
purchase phone numbers and receives `402` with code `paid_plan_required`. Paid
plans include the first US number at no charge.
plans include one US number at no charge. The included number is one per account
and is granted once: claiming it spends the benefit for good, so releasing that
number does not make another one free, and numbers the account already bought do
not consume it.

Args:
phone_number: Phone number in E.164 format.
Expand Down
Loading
Loading