API Documentation

Custom Tools: Python SDK Reference

Use the Python SDK when you want Tamarind to validate, package, upload, build, and monitor a Custom Tool for you. The SDK keeps transport details such as upload URLs and concurrency headers out of application code.

Install and connect

1pip install --upgrade tamarind-cli
2export TAMARIND_API_KEY="YOUR_API_KEY"
1from tamarind import Tamarind
2
3# TAMARIND_API_KEY is read automatically.
4with Tamarind(api_base="https://app.tamarind.bio/api/") as client:
5    tools = client.custom_tools.list()
6    print([tool.name for tool in tools.items])

Method index

Jump to a client, tool, or version method.

Client and collection

Create a configured SDK session, then create, retrieve, or list organization-visible tools.

Tamarind

Tamarind(
    *,
    api_key: str | None = None,
    api_base: str | None = None,
    profile: str | None = None,
    timeout: float = 120.0,
)

Creates an SDK session. Use it as a context manager so network resources are closed automatically.

Parameters

api_key

str | None, optional

API key. When omitted, the active Tamarind profile or TAMARIND_API_KEY is used.
api_base

str | None, optional

Overrides the configured organization API base URL. Include the trailing /api/ path; omit it to use the host from the selected profile.
profile

str | None, optional

Loads credentials and host settings from this named Tamarind CLI profile. Omit it to use the active profile.
timeout

float, optional

Maximum time in seconds for each API request before it fails. Defaults to 120 seconds.

Returns

Tamarind
A configured client. Use custom_tools to create and retrieve tools; leaving the context manager closes its network resources.

Raises

  • AuthError
  • APIError

Examples

1with Tamarind() as client:
2    tool = client.custom_tools.get("my-custom-tool")

client.custom_tools.create

client.custom_tools.create(
    name: str,
    *,
    display_name: str = ...,
    description: str = ...,
    gpu_type: str = ...,
    memory: str = ...,
    cpu: int = ...,
) -> CustomTool

Creates a draft Custom Tool. The name becomes the stable value used as type when submitting jobs.

Parameters

name

str

Unique tool name.
display_name

str, optional

Human-readable name shown in the UI and tool listings. Omit it to use the server default.
description

str, optional

Short explanation shown to people deciding when to use the tool. Omit it to use the server default.
gpu_type

str, optional

GPU allocated to each run: None, T4, L4, L40S, A10, or A100. Omit it to use the server default.
memory

str, optional

Memory allocated to each run, such as 8Gi, 32Gi, 96Gi, or 180Gi. Omit it to use the server default.
cpu

int, optional

Number of CPU cores allocated to each run. Omit it to use the server default.

Returns

CustomTool
The new draft tool, including its stable name, metadata, current status, and resource settings.
View fields
name

str

Stable tool name used as type when submitting jobs.
display_name

str

Human-readable name shown in the UI.
description

str

Explanation of what the tool does.
functions

tuple[str, ...]

Short capability labels used for discovery.
status

CustomToolStatus

Current lifecycle state: Draft, Building, or Deployed.
gpu_type

str

GPU allocated to each run, or None for CPU-only execution.
memory

str

Memory allocated to each run, expressed in GiB.
cpu

int

Number of CPU cores allocated to each run.
home_disk_gi

int

Writable home-disk capacity in GiB.
max_runtime_seconds

int | None

Maximum runtime for a job, or None when no tool-specific limit is set.
has_source

bool

Whether source has been uploaded for the current draft.
published

bool

Whether the tool has a published default version.
auto_publish

bool

Whether successful builds become the default automatically.
est_time

str

Estimated runtime in H:M:S format.
paper_url

str

Related publication URL, when configured.
tags

tuple[str, ...]

Search and discovery tags.
default_version

str | None

Published version name used when a job omits version.
created_at

str

ISO 8601 creation timestamp.
updated_at

str

ISO 8601 timestamp of the latest update.
can_edit

bool

Whether the current credentials may change this tool.
can_build

bool

Whether the current credentials may build this tool.
version

Version | None

Requested or latest version, or None when the tool has never been built.

Raises

  • CustomToolExistsError
  • ValidationError
  • AuthError
  • APIError

Examples

1tool = client.custom_tools.create(
2    "my-custom-tool",
3    display_name="My Custom Tool",
4)

client.custom_tools.get

client.custom_tools.get(
    name: str,
    *,
    version: str | None = None,
) -> CustomTool

Gets one tool visible to the current organization, including its latest version by default or a selected version such as v2.

Parameters

name

str

Tool name returned by create() or list().
version

str | None, optional

Public version label such as v2. Omit it to include the latest version.

Returns

CustomTool
The tool snapshot, including metadata, status, published default_version, and the requested or latest Version when one exists.
View fields
name

str

Stable tool name used as type when submitting jobs.
display_name

str

Human-readable name shown in the UI.
description

str

Explanation of what the tool does.
functions

tuple[str, ...]

Short capability labels used for discovery.
status

CustomToolStatus

Current lifecycle state: Draft, Building, or Deployed.
gpu_type

str

GPU allocated to each run, or None for CPU-only execution.
memory

str

Memory allocated to each run, expressed in GiB.
cpu

int

Number of CPU cores allocated to each run.
home_disk_gi

int

Writable home-disk capacity in GiB.
max_runtime_seconds

int | None

Maximum runtime for a job, or None when no tool-specific limit is set.
has_source

bool

Whether source has been uploaded for the current draft.
published

bool

Whether the tool has a published default version.
auto_publish

bool

Whether successful builds become the default automatically.
est_time

str

Estimated runtime in H:M:S format.
paper_url

str

Related publication URL, when configured.
tags

tuple[str, ...]

Search and discovery tags.
default_version

str | None

Published version name used when a job omits version.
created_at

str

ISO 8601 creation timestamp.
updated_at

str

ISO 8601 timestamp of the latest update.
can_edit

bool

Whether the current credentials may change this tool.
can_build

bool

Whether the current credentials may build this tool.
version

Version | None

Requested or latest version, or None when the tool has never been built.

Raises

  • CustomToolNotFoundError
  • AuthError
  • APIError

Examples

1tool = client.custom_tools.get("my-custom-tool", version="v2")

client.custom_tools.list

client.custom_tools.list(
    *,
    status: str | None = None,
    published: bool | None = None,
    limit: int = 50,
    cursor: str | None = None,
) -> Page[CustomTool]

Lists tools visible to the current organization. Use next_cursor to fetch the next page.

Parameters

status

str | None, optional

Returns only tools in the selected Draft, Building, or Deployed state. Omit it to include every state.
published

bool | None, optional

Use True for published tools or False for unpublished tools. Omit it to include both.
limit

int, optional

Maximum number of tools returned in one page. Defaults to 50.
cursor

str | None, optional

Continuation cursor from the previous page. Omit it when requesting the first page.

Returns

Page[CustomTool]
items contains the tools in this page. Pass next_cursor to the next list() call; it is None after the final page.
View fields
items

tuple[T, ...]

Resources returned in the current page.
next_cursor

str | None

Pass this value to the next list call. None means there are no more results.

Raises

  • AuthError
  • APIError

Examples

1page = client.custom_tools.list(published=True)
2for tool in page.items:
3    print(tool.name, tool.default_version)

CustomTool

Inspect and change one tool, validate source locally, build versions, and submit test jobs.

tool.refresh

tool.refresh() -> CustomTool

Fetches a fresh snapshot of the same tool. The SDK rejects the refresh if that name was deleted and recreated.

Returns

CustomTool
A fresh snapshot containing the tool's current metadata, status, resource settings, and default_version.
View fields
name

str

Stable tool name used as type when submitting jobs.
display_name

str

Human-readable name shown in the UI.
description

str

Explanation of what the tool does.
functions

tuple[str, ...]

Short capability labels used for discovery.
status

CustomToolStatus

Current lifecycle state: Draft, Building, or Deployed.
gpu_type

str

GPU allocated to each run, or None for CPU-only execution.
memory

str

Memory allocated to each run, expressed in GiB.
cpu

int

Number of CPU cores allocated to each run.
home_disk_gi

int

Writable home-disk capacity in GiB.
max_runtime_seconds

int | None

Maximum runtime for a job, or None when no tool-specific limit is set.
has_source

bool

Whether source has been uploaded for the current draft.
published

bool

Whether the tool has a published default version.
auto_publish

bool

Whether successful builds become the default automatically.
est_time

str

Estimated runtime in H:M:S format.
paper_url

str

Related publication URL, when configured.
tags

tuple[str, ...]

Search and discovery tags.
default_version

str | None

Published version name used when a job omits version.
created_at

str

ISO 8601 creation timestamp.
updated_at

str

ISO 8601 timestamp of the latest update.
can_edit

bool

Whether the current credentials may change this tool.
can_build

bool

Whether the current credentials may build this tool.
version

Version | None

Requested or latest version, or None when the tool has never been built.

Raises

  • CustomToolNotFoundError
  • StaleCustomToolError
  • APIError

Examples

1tool = tool.refresh()

tool.update

tool.update(
    *,
    display_name=...,
    description=...,
    functions=...,
    gpu_type=...,
    memory=...,
    cpu=...,
    home_disk_gi=...,
    auto_publish=...,
    est_time=...,
    paper_url=...,
    tags=...,
) -> CustomTool

Updates the supplied metadata and resource fields. Only concrete values are applied; omitted arguments and None leave the current value unchanged.

Parameters

display_name

str | None, optional

Human-readable name. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty string ("").
description

str | None, optional

Tool description. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty string ("").
functions

list[str] | None, optional

Short capability labels. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty list ([]).
gpu_type

str | None, optional

GPU type: "None", T4, L4, L40S, A10, or A100. Use the string "None" for no GPU. Omitting this argument or passing None leaves it unchanged.
memory

str | None, optional

8Gi, 12Gi, 24Gi, 32Gi, 48Gi, 64Gi, 90Gi, 96Gi, or 180Gi. Omitting this argument or passing None leaves it unchanged.
cpu

int | None, optional

Requested CPU count. Omitting this argument or passing None leaves it unchanged.
home_disk_gi

int | None, optional

Writable home-disk size in GiB. Omitting this argument or passing None leaves it unchanged.
auto_publish

bool | None, optional

Whether successful builds become the default automatically. Pass False to disable it. Omitting this argument or passing None leaves it unchanged.
est_time

str | None, optional

Estimated runtime in H:M:S format, for example 0:01:00. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty string ("").
paper_url

str | None, optional

Related publication URL. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty string ("").
tags

list[str] | None, optional

Search and discovery tags. Omitting this argument or passing None leaves it unchanged. To clear it, pass an empty list ([]).

Returns

CustomTool
The saved tool snapshot after applying the supplied changes. Omitted fields retain their previous values.
View fields
name

str

Stable tool name used as type when submitting jobs.
display_name

str

Human-readable name shown in the UI.
description

str

Explanation of what the tool does.
functions

tuple[str, ...]

Short capability labels used for discovery.
status

CustomToolStatus

Current lifecycle state: Draft, Building, or Deployed.
gpu_type

str

GPU allocated to each run, or None for CPU-only execution.
memory

str

Memory allocated to each run, expressed in GiB.
cpu

int

Number of CPU cores allocated to each run.
home_disk_gi

int

Writable home-disk capacity in GiB.
max_runtime_seconds

int | None

Maximum runtime for a job, or None when no tool-specific limit is set.
has_source

bool

Whether source has been uploaded for the current draft.
published

bool

Whether the tool has a published default version.
auto_publish

bool

Whether successful builds become the default automatically.
est_time

str

Estimated runtime in H:M:S format.
paper_url

str

Related publication URL, when configured.
tags

tuple[str, ...]

Search and discovery tags.
default_version

str | None

Published version name used when a job omits version.
created_at

str

ISO 8601 creation timestamp.
updated_at

str

ISO 8601 timestamp of the latest update.
can_edit

bool

Whether the current credentials may change this tool.
can_build

bool

Whether the current credentials may build this tool.
version

Version | None

Requested or latest version, or None when the tool has never been built.

Raises

  • ValidationError
  • StaleCustomToolError
  • APIError

Examples

1tool = tool.update(
2    description="Summarize a protein sequence",
3    est_time="0:01:00",
4    tags=["sequence", "summary"],
5)

tool.validate

tool.validate(folder: str | Path) -> ValidationReport

Checks the source folder locally without uploading or starting a build.

Parameters

folder

str | Path

Folder containing Dockerfile, run.sh, and config.json at its root.

Returns

ValidationReport
valid is true when the folder can be built. errors contains blocking problems; warnings contains non-blocking guidance.
View fields
valid

bool

True when no blocking validation errors were found.
errors

tuple[ValidationProblem, ...]

Blocking problems. Each item contains code, path, and message.
warnings

tuple[ValidationProblem, ...]

Non-blocking guidance. Each item contains code, path, and message.

Examples

1report = tool.validate("./my-custom-tool")
2if not report.valid:
3    for problem in report.errors:
4        print(problem.path, problem.message)

tool.build

tool.build(
    folder: str | Path,
    *,
    idempotency_key: str | None = None,
    source_timeout: float = 180.0,
) -> BuildResult

Validates and packages the folder, uploads it, and requests a version build. Upload URLs and integrity checks are handled internally.

Parameters

folder

str | Path

Source folder to package and build.
idempotency_key

str | None, optional

Stable key used to retry the same build request without creating a duplicate. Omit it for a normal one-time build.
source_timeout

float, optional

Maximum time in seconds allowed for uploading the source archive. Defaults to 180 seconds.

Returns

BuildResult
action is build, reuse_image, or unchanged. version is the exact Version to monitor, test, or publish.
View fields
action

BuildAction

build for a new image build, reuse_image for a new version using the current image, or unchanged when the source already has a version.
version

Version

Exact version to monitor, test, or publish.

Raises

  • ValidationError
  • CustomToolUploadError
  • StaleCustomToolError
  • APIError

Examples

1build = tool.build("./my-custom-tool")
2version = build.version.monitor(timeout=1800)

tool.test

tool.test(
    settings: dict[str, Any],
    *,
    version: str | None = None,
    name: str | None = None,
) -> CustomToolTestJob

Submits a test job. Omit version to use the published default, or pass a version label such as v2 to run it before publishing.

Parameters

settings

dict[str, Any]

Values matching the inputs declared in config.json.
version

str | None, optional

Exact Version.version returned by build(), versions(), or get_version(). Omit it to use the published default.
name

str | None, optional

Unique name for the test job. Omit it to let the SDK generate one.

Returns

CustomToolTestJob
An immediate submission receipt with id, job_name, job_type, status, and created_at. Use job_name with the normal job-status and result APIs.
View fields
id

str

Job identifier.
job_name

str

Job name used with status and result APIs.
job_type

str

Custom Tool name submitted as the job type.
status

str

Initial job status.
created_at

str

ISO 8601 submission timestamp.

Raises

  • ValidationError
  • CustomToolNotDeployableError
  • APIError

Examples

1job = tool.test(
2    {"sequence": "MKTAYIAKQRQISFVKSHFSRQ"},
3    version=version.version,
4)
5print(job.job_name, job.status)

tool.versions

tool.versions(
    *,
    status: str | None = None,
    limit: int = 50,
    cursor: str | None = None,
) -> Page[Version]

Lists versions belonging to this tool.

Parameters

status

str | None, optional

Returns only versions in the selected Queued, Running, Complete, or Stopped state. Omit it to include every state.
limit

int, optional

Maximum number of versions returned in one page. Defaults to 50.
cursor

str | None, optional

Continuation cursor from the previous page. Omit it when requesting the first page.

Returns

Page[Version]
items contains the versions in this page. Pass next_cursor to the next versions() call; it is None after the final page.
View fields
items

tuple[T, ...]

Resources returned in the current page.
next_cursor

str | None

Pass this value to the next list call. None means there are no more results.

Raises

  • StaleCustomToolError
  • APIError

Examples

1versions = tool.versions(status="Complete")
2for version in versions.items:
3    print(version.version, version.status)

tool.get_version

tool.get_version(version: str) -> Version

Gets one exact version using its public label, such as v2.

Parameters

version

str

Version.version returned by build() or versions().

Returns

Version
The exact version identified by version, including its build status, timestamps, origin, and any terminal error.
View fields
version

str

Public version label, such as v3; use it as version when submitting a job.
status

VersionStatus

Build state: Queued, Running, Complete, or Stopped.
terminal

bool

Whether the build has reached a final state and will not run again.
origin

str

How this version was created, such as a source build or image reuse.
created_at

str

ISO 8601 creation timestamp.
started_at

str

ISO 8601 timestamp when build processing began.
completed_at

str | None

ISO 8601 completion timestamp, or None while the build is active.
error

BuildError | None

Structured failure code and message when the build stops unsuccessfully.
tool_name

str

Name of the Custom Tool that owns this version.

Raises

  • ValidationError
  • CustomToolNotFoundError
  • APIError

Examples

1version = tool.get_version(build.version.version)

tool.delete

tool.delete() -> None

Deletes the tool and releases its name for reuse.

Returns

None
The call returns after the tool has been deleted successfully.

Raises

  • StaleCustomToolError
  • CustomToolBuildInProgressError
  • APIError

Examples

1tool.delete()

Version

Monitor and operate on the exact version returned by a build or version lookup.

version.refresh

version.refresh() -> Version

Fetches the latest status for this version without allowing a recreated tool with the same name to replace it.

Returns

Version
A fresh snapshot containing the version's current build status, timestamps, and any terminal error.
View fields
version

str

Public version label, such as v3; use it as version when submitting a job.
status

VersionStatus

Build state: Queued, Running, Complete, or Stopped.
terminal

bool

Whether the build has reached a final state and will not run again.
origin

str

How this version was created, such as a source build or image reuse.
created_at

str

ISO 8601 creation timestamp.
started_at

str

ISO 8601 timestamp when build processing began.
completed_at

str | None

ISO 8601 completion timestamp, or None while the build is active.
error

BuildError | None

Structured failure code and message when the build stops unsuccessfully.
tool_name

str

Name of the Custom Tool that owns this version.

Raises

  • CustomToolNotFoundError
  • APIError

Examples

1version = version.refresh()

version.logs

version.logs(*, cursor: str | None = None) -> BuildLogPage

Reads one page of build events. Pass next_cursor to continue without rereading earlier pages.

Parameters

cursor

str | None, optional

Continuation cursor from the previous log page. Omit it to read from the beginning.

Returns

BuildLogPage
items contains this page of build events. status and error describe the current build; next_cursor continues from the last event read.
View fields
items

tuple[BuildEvent, ...]

Build events, each containing message and Unix-millisecond timestamp.
status

VersionStatus

Current build state.
next_cursor

str | None

Cursor for the next log page, or None when currently caught up.
error

BuildError | None

Structured failure code and message when available.

Raises

  • CustomToolNotFoundError
  • APIError

Examples

1page = version.logs()
2for event in page.items:
3    print(event.message)

version.monitor

version.monitor(
    *,
    timeout: float | None,
    interval: float = 2.0,
    on_event: Callable[[BuildEvent], None] | None = None,
) -> Version

Polls until the build reaches Complete or Stopped. Use monitor_async() with the same arguments in asynchronous applications.

Parameters

timeout

float | None

Maximum wait in seconds. None waits without a deadline.
interval

float, optional

Seconds to wait between status checks. Defaults to 2 seconds.
on_event

callable | None, optional

Function called once for each newly received build-log event. Omit it when no live log handling is needed.

Returns

Version
The completed version snapshot. Failed builds raise CustomToolBuildFailedError, and an expired deadline raises CustomToolBuildTimeoutError.
View fields
version

str

Public version label, such as v3; use it as version when submitting a job.
status

VersionStatus

Build state: Queued, Running, Complete, or Stopped.
terminal

bool

Whether the build has reached a final state and will not run again.
origin

str

How this version was created, such as a source build or image reuse.
created_at

str

ISO 8601 creation timestamp.
started_at

str

ISO 8601 timestamp when build processing began.
completed_at

str | None

ISO 8601 completion timestamp, or None while the build is active.
error

BuildError | None

Structured failure code and message when the build stops unsuccessfully.
tool_name

str

Name of the Custom Tool that owns this version.

Raises

  • CustomToolBuildFailedError
  • CustomToolBuildTimeoutError
  • APIError

Examples

1version = build.version.monitor(
2    timeout=1800,
3    on_event=lambda event: print(event.message),
4)

version.monitor_async

await version.monitor_async(
    *,
    timeout: float | None,
    interval: float = 2.0,
    on_event: Callable[[BuildEvent], None] | None = None,
) -> Version

Asynchronous form of monitor() for applications that already run an event loop.

Parameters

timeout

float | None

Maximum wait in seconds. None waits without a deadline.
interval

float, optional

Seconds to wait between status checks. Defaults to 2 seconds.
on_event

callable | None, optional

Function called once for each newly received build-log event. Omit it when no live log handling is needed.

Returns

Version
The completed version snapshot. Failed builds raise CustomToolBuildFailedError, and an expired deadline raises CustomToolBuildTimeoutError.
View fields
version

str

Public version label, such as v3; use it as version when submitting a job.
status

VersionStatus

Build state: Queued, Running, Complete, or Stopped.
terminal

bool

Whether the build has reached a final state and will not run again.
origin

str

How this version was created, such as a source build or image reuse.
created_at

str

ISO 8601 creation timestamp.
started_at

str

ISO 8601 timestamp when build processing began.
completed_at

str | None

ISO 8601 completion timestamp, or None while the build is active.
error

BuildError | None

Structured failure code and message when the build stops unsuccessfully.
tool_name

str

Name of the Custom Tool that owns this version.

Raises

  • CustomToolBuildFailedError
  • CustomToolBuildTimeoutError
  • APIError

Examples

1version = await build.version.monitor_async(timeout=1800)

version.cancel

version.cancel(*, if_unchanged: bool = False) -> Version

Requests cancellation of an active build. By default, the SDK protects the tool lifetime without treating normal build progress as a conflict. Set if_unchanged to True to require the exact version snapshot to remain unchanged.

Parameters

if_unchanged

bool, optional

False sends the SDK-managed tool-lifetime validator. True sends the exact version validator and rejects a status or revision change since this object was fetched.

Returns

Version
The version snapshot returned after Tamarind accepts the cancellation request, including its updated status.
View fields
version

str

Public version label, such as v3; use it as version when submitting a job.
status

VersionStatus

Build state: Queued, Running, Complete, or Stopped.
terminal

bool

Whether the build has reached a final state and will not run again.
origin

str

How this version was created, such as a source build or image reuse.
created_at

str

ISO 8601 creation timestamp.
started_at

str

ISO 8601 timestamp when build processing began.
completed_at

str | None

ISO 8601 completion timestamp, or None while the build is active.
error

BuildError | None

Structured failure code and message when the build stops unsuccessfully.
tool_name

str

Name of the Custom Tool that owns this version.

Raises

  • CustomToolBuildNotInProgressError
  • StaleCustomToolError
  • APIError

Examples

1cancelled = version.cancel()

version.publish

version.publish() -> CustomTool

Makes this completed version the tool's default for submissions that omit version.

Returns

CustomTool
The updated tool snapshot. default_version identifies the version now used when a submission omits version.
View fields
name

str

Stable tool name used as type when submitting jobs.
display_name

str

Human-readable name shown in the UI.
description

str

Explanation of what the tool does.
functions

tuple[str, ...]

Short capability labels used for discovery.
status

CustomToolStatus

Current lifecycle state: Draft, Building, or Deployed.
gpu_type

str

GPU allocated to each run, or None for CPU-only execution.
memory

str

Memory allocated to each run, expressed in GiB.
cpu

int

Number of CPU cores allocated to each run.
home_disk_gi

int

Writable home-disk capacity in GiB.
max_runtime_seconds

int | None

Maximum runtime for a job, or None when no tool-specific limit is set.
has_source

bool

Whether source has been uploaded for the current draft.
published

bool

Whether the tool has a published default version.
auto_publish

bool

Whether successful builds become the default automatically.
est_time

str

Estimated runtime in H:M:S format.
paper_url

str

Related publication URL, when configured.
tags

tuple[str, ...]

Search and discovery tags.
default_version

str | None

Published version name used when a job omits version.
created_at

str

ISO 8601 creation timestamp.
updated_at

str

ISO 8601 timestamp of the latest update.
can_edit

bool

Whether the current credentials may change this tool.
can_build

bool

Whether the current credentials may build this tool.
version

Version | None

Requested or latest version, or None when the tool has never been built.

Raises

  • CustomToolNotDeployableError
  • StaleCustomToolError
  • APIError

Examples

1published_tool = version.publish()
2print(published_tool.default_version)

Return types

Page[T]
One page of SDK resources and the cursor used to request the next page.
CustomTool
Tool metadata, permissions, publication state, and runtime resources.
BuildResult
The outcome of a build request and the resulting durable version.
Version
A durable, addressable build of one Custom Tool.
ValidationReport
Local source validation result with blocking errors and non-blocking warnings.
BuildLogPage
One page of build events plus the build's current state.
CustomToolTestJob
Receipt returned immediately after submitting an unpublished version for testing.

Status values

Draft
The tool exists but has no deployed version.
Building
At least one version build is active.
Deployed
The tool has a completed deployable version.
Queued
The version build is waiting to start.
Running
The version build is running.
Complete
The version can be tested and published.
Stopped
The build failed, timed out, or was cancelled; inspect Version.error and logs().

Errors

AuthError
Authentication is missing or invalid.
APIError
The API returned an unexpected HTTP error, including authorization failures.
ValidationError
Arguments, source files, or test settings are invalid.
CustomToolNotFoundError
The requested tool or version is unavailable to this account.
CustomToolExistsError
create() used a tool name that already exists.
CustomToolUploadError
The source archive could not be prepared or uploaded.
CustomToolNotDeployableError
The selected version is not ready to test or publish.
CustomToolBuildFailedError
monitor() reached a failed terminal build state.
CustomToolBuildTimeoutError
monitor() exceeded its timeout.
CustomToolBuildNotInProgressError
cancel() targeted a build that is already terminal.
CustomToolBuildInProgressError
An operation cannot proceed while a build is active.
StaleCustomToolError
The tool changed after this SDK object was fetched; fetch it again and retry intentionally.