Skip to main content

zsyncstudio

SDK Python para robôs (RPA) se conectarem ao ZSync Tech Studio: buscar execuções pendentes, reportar o progresso de cada etapa (task) e finalizar a execução — usando o token de API gerado para a instância do robô.

Disponível em duas versões com a mesma interface: zsyncstudio.sync_api (síncrona) e zsyncstudio.async_api (assíncrona, com async/await).

Requisitos

  • Python ≥ 3.13
  • Uma instância do ZSync Tech Studio em execução
  • Token de API do robô, gerado no dashboard da plataforma (formato zst_<instanceId>.<secret>)

Instalação

uv add zsynctech-studio-sdk

ou

pip install zsynctech-studio-sdk

O pacote se chama zsynctech-studio-sdk no PyPI, mas o módulo Python é zsyncstudio — é ele que você importa nos exemplos abaixo.

Guia rápido

from zsyncstudio.sync_api import Client, ExecutionRun

client = Client("https://studio.exemplo.com", api_token)


def run(execution: ExecutionRun) -> None:
    execution.start()  # reivindica a execução: PENDING → RUNNING

    for invoice in invoices:
        task = execution.task(invoice.number)
        try:
            charge(invoice)
        except Exception as exc:
            task.error(str(exc))
        else:
            task.finish()

    execution.error("alguns itens falharam") if execution.had_errors else execution.finish()


if __name__ == "__main__":
    while execution := client.poll_pending_executions():
        run(execution)

O robô fica esperando em poll_pending_executions() até a plataforma disparar uma execução (pelo dashboard ou pela API). Cada task(...) representa um item processado; chame finish(), warning(), error() ou skip() para reportar o resultado. No fim, finish() marca a execução como concluída e error() como falha.

Para reportar progresso no meio de uma execução longa, sem finalizá-la:

execution.update_observation("processando lote 3 de 10")

Se você sabe de antemão quantos itens serão processados, informe logo após start() para o dashboard acompanhar o progresso real (ex.: "45/1000") em vez de reportado/reportado:

execution.set_total_tasks(1000)

Pode ser chamado mais de uma vez. Se você não informar, o total acompanha o que já foi processado (1/1, 2/2, ...); se processar mais itens do que declarou, o total passa a acompanhar o que já foi processado em vez de ultrapassar 100%.

Robôs que decidem sozinhos quando rodar

Se o robô não depende da plataforma para saber quando executar (por exemplo, dispara pelo agendador do próprio sistema operacional), use client.start_execution() em vez de poll_pending_executions() — a execução já nasce em andamento, então pule o execution.start() e vá direto para as tasks.

Credenciais (secrets)

Se o robô precisa de uma senha ou token guardado no cofre de credenciais da plataforma, revele o valor pelo id da credencial:

secret = client.get_secret(secret_id)
password = secret.value  # str, dict[str, str] ou dado JSON — depende do tipo da credencial

Uma credencial tem status ACTIVE, EXPIRED ou BLOCKED (além de DELETED, que já não aparece para o robô). get_secret() não lança por causa do status — se a credencial não estiver ACTIVE, secret.value vem None e secret.is_blocked/secret.is_expired já vêm preenchidos, sem precisar de uma segunda chamada:

secret = client.get_secret(secret_id)
if secret.is_blocked or secret.is_expired:
    ...  # avise alguém, ou pule esta credencial
else:
    password = secret.value

Depois de trocar a senha no sistema de destino, registre o novo valor (isso cria uma nova versão, nunca sobrescreve a atual, e reativa a credencial se ela estava EXPIRED/BLOCKED):

secret.rotate("nova-senha")

O próprio robô também pode sinalizar um problema (ex.: login rejeitado pelo sistema alvo) sem esperar a expiração automática:

secret.block("senha rejeitada pelo sistema X")   # ou secret.expire("...")

A única forma de tirar uma credencial de EXPIRED/BLOCKED é criar uma nova versão com rotate() — não existe um "desbloquear" manual. get_secret() ainda falha com NotFoundError se a credencial (ou a versão) não existir. Criar, excluir e ver o histórico completo (versões e eventos de status) só estão disponíveis para administradores pelo painel.

Uso assíncrono

from zsyncstudio.async_api import Client, ExecutionRun

client = Client(base_url, api_token)


async def run(execution: ExecutionRun) -> None:
    await execution.start()

    for invoice in invoices:
        task = execution.task(invoice.number)
        try:
            await charge(invoice)
        except Exception as exc:
            await task.error(str(exc))
        else:
            await task.finish()


async def main() -> None:
    while execution := await client.poll_pending_executions():
        await run(execution)

Tratamento de erros

Problemas de comunicação com a plataforma chegam como exceções que você pode capturar:

from zsyncstudio.sync_api import AuthenticationError, ApiError

try:
    client.poll_pending_executions()
except AuthenticationError:
    print("Token inválido ou expirado.")
except ApiError as exc:
    print(f"Erro da plataforma ({exc.status_code}): {exc.message}")

As principais exceções: AuthenticationError (token inválido), NotFoundError (execução/instância inexistente), ConflictError (ex.: tentar finalizar uma execução já encerrada) e ConnectionError (falha de rede). Todas herdam de ApiError ou ZSyncStudioError e podem ser importadas de zsyncstudio.sync_api / zsyncstudio.async_api.

Dentro de uma task, você também pode levantar TaskWarning ou TaskSkipped para marcar o item como aviso ou pulado em vez de erro, sem interromper o processamento dos demais itens.

Metadados do projeto

  • Autor: Rodrigo Zavan
  • Proprietário: ZSync Tech LTDA
  • Requisito de Python: ≥ 3.13

Desenvolvimento

uv sync
uv run pytest
uv run mypy --strict src
uv run ruff check src tests
uv run black src tests

Release files for zsynctech-studio-sdk 1.3.24

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zsynctech-studio-sdk 1.3.24
File Size Uploaded
zsynctech_studio_sdk-1.3.24.tar.gz 22.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for zsynctech-studio-sdk 1.3.24
File Interpreter ABI Platform
zsynctech_studio_sdk-1.3.24-py3-none-any.whl Python 3 none any Details

Total release size: 50.2 kB

Release files / zsynctech_studio_sdk-1.3.24.tar.gz

Download URL zsynctech_studio_sdk-1.3.24.tar.gz
Size 22.3 kB
Tags Source
SHA-256 checksum
How to use checksums
1ddf0eae3857ebdcf326c9517e5c69206147ecdbe991563e2eddf38bfcb760a7
BLAKE2b-256 checksum
How to use checksums
00d00a19ddc4ce8bb1c71e13fc7128f178e8f7ef46eb0e9a6bb8857f32b30232
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.

Transparency log

Release files / zsynctech_studio_sdk-1.3.24-py3-none-any.whl

Download URL zsynctech_studio_sdk-1.3.24-py3-none-any.whl
Size 27.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
37bbaff46dd15acc5bb6e7c91469bd63beadc379568c249bf4bfa84dd9e257d2
BLAKE2b-256 checksum
How to use checksums
0bcf50b63b894f2bb379bbfbd39dc0d1059fd3808131c9ee6dd165a152b92f05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.

Transparency log

Release history Release notifications | RSS feed

1.4.6

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.3.25

2 release files

This release

1.3.24 This release

2 release files

1.3.23

2 release files

1.3.22

2 release files

1.3.21

2 release files

1.3.20

2 release files

1.3.18

2 release files

1.3.17

2 release files

1.3.13

2 release files

1.3.12

2 release files

1.3.11

2 release files

1.3.10

2 release files

1.3.9

2 release files

1.3.8

2 release files

1.3.7

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.10

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page