Skip to main content

CronosFlow SDK para Python

SDK oficial da API pública do CronosFlow: envio de WhatsApp a partir do seu servidor, com o ritmo que protege o número.

pip install cronos-flow-sdk

Instala como cronos-flow-sdk e importa como cronosflow.

import os
from cronosflow import CronosClient

with CronosClient(api_key=os.environ["CRONOS_API_KEY"]) as cronos:
    if not cronos.clients.status("1").logged_in:
        raise SystemExit("número desconectado: leia o QR code na plataforma")

    cronos.messages.text("1", "+5511999999999", "Seu pedido saiu para entrega.")

Por que um SDK, e não um requests.post

A API tem 18 rotas e um curl resolve qualquer uma delas. O que não cabe num curl é o que faz uma integração sobreviver ao segundo mês:

Ritmo entre envios 35 a 45 segundos entre mensagens do mesmo número, sorteado. É o mesmo padrão que a plataforma usa no disparo. Rajada pelo mesmo chip é o padrão que o WhatsApp usa para bloquear, e conta bloqueada não volta por reclamação.
Idempotência Uma Idempotency-Key por mensagem, gerada antes da primeira tentativa e repetida em todas. Falha de rede deixa de virar mensagem duplicada.
Repetição que não piora as coisas Espera crescente só em 429 e 5xx. Um 422 de validação não é repetido: repetir não conserta e ainda gasta o seu teto por minuto.
Recusa antes da rede Destino fora do E.164, áudio que não tocaria, arquivo acima do teto, enquete com opção repetida: tudo isso falha na sua máquina, sem gastar rede nem cota do plano.
Erro com nome O mesmo 403 da API é "chave inválida", "conta bloqueada" e "cota do dia acabou" — três reações diferentes. Aqui são três exceções diferentes.

O ritmo de envio

É a parte que mais importa, então vale a explicação completa.

O teto da API é 160 mensagens por minuto na rota de texto. Esse é o limite do servidor, não um ritmo seguro para o seu número. O SDK nasce com a mesma janela que a plataforma aplica no disparo:

from cronosflow import CronosClient, SendPolicy

cronos = CronosClient(
    api_key=...,
    policy=SendPolicy(min_interval=35, max_interval=45),  # o padrão
)

Três detalhes do desenho:

  • a espera é por número. Quem opera cinco chips manda pelos cinco sem um esperar pelo outro; o que não pode é o mesmo chip disparar em sequência;
  • o intervalo é sorteado, não fixo. Mensagem a cada 40 segundos cravados é tão artificial quanto rajada;
  • a primeira sai na hora. A espera é entre envios.

Para uma lista, send_many já cuida do ritmo e não para no primeiro erro:

from cronosflow import CronosError

for destino, resultado in cronos.messages.send_many("1", lista, "Promoção de hoje"):
    if isinstance(resultado, CronosError):
        registrar_falha(destino, resultado)

Dá para desligar o ritmo (SendPolicy(min_interval=0, max_interval=0)), e só faz sentido quando outra coisa já controla a cadência — uma fila com agendamento, por exemplo. Sem ritmo nenhum, o bloqueio do chip é questão de tempo.

O que dá para fazer

# Números da conta
cronos.clients.list(q="comercial")
cronos.clients.create(name="Comercial", number="+5511999990000")
cronos.clients.update(1, name="Comercial (SP)")
cronos.clients.delete(1)
cronos.clients.status(1)

# Conectar sem abrir a plataforma
for evento in cronos.clients.qr_events(1):
    if evento.qr:
        mostrar_qr(evento.qr)
    if evento.is_logged_in:
        break

# Mensagens
cronos.messages.text(1, "+5511999999999", "Oi")
cronos.messages.poll(1, "+5511999999999", "Qual horário?", ["Manhã", "Tarde"])
cronos.messages.image(1, "+5511999999999", "promo.png", caption="Promoção")
cronos.messages.audio(1, "+5511999999999", "recado.ogg")
cronos.messages.video(1, "+5511999999999", "clipe.mp4")
cronos.messages.document(1, "+5511999999999", "boleto.pdf")

Áudio precisa ser .ogg (Opus) ou .mp3, e vídeo precisa ser .mp4 — são os formatos que o WhatsApp reproduz. O SDK confere isso pelos bytes do arquivo, antes de subir, e a mensagem de erro traz o comando do ffmpeg. Qualquer outro formato vai como anexo por document().

Erros

from cronosflow import (
    CronosError,            # a base de tudo
    AuthenticationError,    # 401: chave não enviada
    SubscriptionRequired,   # 402: assinatura vencida ou não ativada
    ApiKeyRejected,         # 403: chave inválida, revogada ou vencida
    AccountBlocked,         # 403: conta bloqueada
    DailyLimitReached,      # 403: teto de envios por dia do plano
    NotFoundError,          # 404: client_id não é seu
    IdempotencyInFlight,    # 409: a mesma chave ainda está em voo
    ValidationError,        # 422: pedido inválido (da API ou do próprio SDK)
    UnsupportedMedia,       # 415: formato que não reproduziria
    PayloadTooLarge,        # 413: arquivo acima do teto
    RateLimited,            # 429: teto por minuto, já repetido pelo SDK
    SendFailed,             # 502: o WhatsApp não aceitou
)

DailyLimitReached é o único que passa sozinho com o tempo: a cota do plano vira à meia-noite UTC, que são 21h no horário de Brasília. Os outros exigem alguma ação.

Segurança

  • a chave vale como senha da conta: ela envia mensagem, cria e apaga cliente. Leia do ambiente do servidor; nunca escreva em código que roda no navegador nem em repositório;
  • o SDK recusa base_url sem https (allow_insecure=True libera, e serve só para desenvolvimento local);
  • a chave não aparece em repr, em log ou em mensagem de erro — só o prefixo;
  • toda requisição tem timeout; nenhuma fica pendurada para sempre.

Compatibilidade

Python 3.9 ou mais novo. Uma dependência só: httpx.

Quem mantém

Team Sophia, da SophiaLabs. Dúvida de uso vai em issue; falha de segurança vai para contato@sophialabs.com.br, nunca em issue pública (SECURITY.md).

Licença

Veja LICENSE.

Metadata

Release files for cronos-flow-sdk 0.1.0

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

Source distribution (sdist)

Source distribution for cronos-flow-sdk 0.1.0
File Size Uploaded Provenance Actions
cronos_flow_sdk-0.1.0.tar.gz 30.8 kB With provenance Details for cronos_flow_sdk-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for cronos-flow-sdk 0.1.0
File Interpreter ABI Platform Actions
cronos_flow_sdk-0.1.0-py3-none-any.whl Python 3 none any Details for cronos_flow_sdk-0.1.0-py3-none-any.whl

Total release size: 58.1 kB

Release files / cronos_flow_sdk-0.1.0.tar.gz

Download URL cronos_flow_sdk-0.1.0.tar.gz
Size 30.8 kB
Tags Source
SHA-256 checksum
How to use checksums
4487432be23337b7210b5d9e65fc8c241fcd7996d42e67a432946fba407aac8b
BLAKE2b-256 checksum
How to use checksums
69ecbd221520826d3a1b386384639e655ef7090e633696aa574c3e68c4511200
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 2, 2026.

Transparency log

Release files / cronos_flow_sdk-0.1.0-py3-none-any.whl

Download URL cronos_flow_sdk-0.1.0-py3-none-any.whl
Size 27.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
acde20c5b96826f68b5cd1dbcd356551d960565e54f80aa38ce956a1be832606
BLAKE2b-256 checksum
How to use checksums
af249e155581727574daf7eff43880eab187bfd27e10b4f0440d88722a1cf4ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 2, 2026.

Transparency log

Security for cronos-flow-sdk 0.1.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for cronos_flow_sdk-0.1.0.tar.gz

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 Nov 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

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