Skip to main content

Official OutReply Python SDK — schedule posts, moderate comments, and subscribe to signed webhooks.

Project description

outreply

Official Python SDK for the OutReply Developer API.

pip install outreply

Quick start

import os
from outreply import OutReply

client = OutReply(api_key=os.environ["OUTREPLY_API_KEY"])

# 1. Verify your key
me = client.account.retrieve()
print(f"Signed in as {me['email']}")

# 2. Schedule a post (idempotency-safe — retry freely)
post = client.posts.schedule(
    page_id="65f...",
    message="Launching tomorrow 🚀",
    scheduled_at="2026-05-01T10:00:00Z",
)

# 2b. …or publish one right now.
live = client.posts.publish(
    page_id="65f...",
    message="We're live! 🎉",
    media_urls=["https://cdn.example.com/hero.jpg"],
)
print(live["platform_post_id"])

# 3. Subscribe to real-time events
hook = client.webhooks.create(
    url="https://example.com/webhooks/outreply",
    events=["post.published", "post.failed"],
)
print("Store this secret — it's shown only once:", hook["secret"])

Features

  • 🔐 Bearer-token auth. Supports scoped keys and sandbox tokens.
  • 🔁 Automatic Idempotency-Key on every mutating call.
  • 🪝 Built-in webhook signature verifier.
  • ⏱ Exponential-backoff retries that respect Retry-After.
  • 🧯 Typed exceptions mapped 1:1 with the error catalog.
  • 🧭 Full type hints. Works on Python 3.9+.

Resources

Namespace Methods
client.account retrieve()
client.brands list()
client.pages list(brand_id=..., platform=...)
client.posts schedule(), list_scheduled(), retrieve_scheduled(), cancel_scheduled(), list_published()
client.comments list(), reply()
client.media upload(), list(), retrieve(), delete()
client.webhooks list(), retrieve(), create(), delete()

Webhook verification (Flask)

from flask import Flask, request, abort
from outreply import construct_event

app = Flask(__name__)

@app.post("/webhooks/outreply")
def outreply_webhook():
    try:
        event = construct_event(
            payload=request.get_data(),  # raw bytes — NOT request.json
            header=request.headers.get("X-OutReply-Signature"),
            secret=os.environ["OUTREPLY_WEBHOOK_SECRET"],
            timestamp_header=request.headers.get("X-OutReply-Timestamp"),
            tolerance_sec=300,
        )
    except ValueError:
        abort(400)
    print("Received:", event["type"], event["data"])
    return "", 200

The verifier is dual-signature aware — it accepts comma-separated signatures so your receiver keeps accepting traffic during a 24-hour secret-rotation grace window.

Error handling

from outreply import (
    OutReply,
    OutReplyRateLimitError,
    OutReplyValidationError,
    OutReplyQuotaError,
)

try:
    client.posts.schedule(page_id="...", message="...", scheduled_at="...")
except OutReplyValidationError as err:
    print("Bad input:", err.details)
except OutReplyRateLimitError as err:
    print(f"Slow down — retry in {err.retry_after_sec}s")
except OutReplyQuotaError:
    print("Daily quota exceeded. Upgrade your plan.")

Configuration

client = OutReply(
    api_key=os.environ["OUTREPLY_API_KEY"],
    timeout=30.0,
    max_retries=2,              # 3 attempts total
    default_headers={"X-Tenant": "acme-co"},
)

License

MIT © OutReply

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

outreply-1.1.0.tar.gz (9.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

outreply-1.1.0-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file outreply-1.1.0.tar.gz.

File metadata

  • Download URL: outreply-1.1.0.tar.gz
  • Upload date:
  • Size: 9.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for outreply-1.1.0.tar.gz
Algorithm Hash digest
SHA256 97fc28c63c7c6e299ba25b8600fc6666d7a25cd509131d41ae2f2d2489425a49
MD5 27743a3f924af9bf1e2c0959414fa299
BLAKE2b-256 4b76dbf58a0f93ec74130f1e8ab2a30208d4558f757eaa311f8ed5b1dcaf64bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for outreply-1.1.0.tar.gz:

Publisher: release.yml on PlayPalsStudio/outreply-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file outreply-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: outreply-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for outreply-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e58a6c68bed04d6576646ada7b4e5605ca997c86804c7b948f8a260d70e55bc7
MD5 217f38501ddd7b3e4a860bea046ff001
BLAKE2b-256 a365a5e60ecec71a2def1e4f06b8e6ffabb88630bc009877d8c2671936040d43

See more details on using hashes here.

Provenance

The following attestation bundles were made for outreply-1.1.0-py3-none-any.whl:

Publisher: release.yml on PlayPalsStudio/outreply-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page