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-Keyon 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97fc28c63c7c6e299ba25b8600fc6666d7a25cd509131d41ae2f2d2489425a49
|
|
| MD5 |
27743a3f924af9bf1e2c0959414fa299
|
|
| BLAKE2b-256 |
4b76dbf58a0f93ec74130f1e8ab2a30208d4558f757eaa311f8ed5b1dcaf64bb
|
Provenance
The following attestation bundles were made for outreply-1.1.0.tar.gz:
Publisher:
release.yml on PlayPalsStudio/outreply-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outreply-1.1.0.tar.gz -
Subject digest:
97fc28c63c7c6e299ba25b8600fc6666d7a25cd509131d41ae2f2d2489425a49 - Sigstore transparency entry: 1340640294
- Sigstore integration time:
-
Permalink:
PlayPalsStudio/outreply-python@7c9fe95cc032386a520d6c6c1c5c791b444545ec -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/PlayPalsStudio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7c9fe95cc032386a520d6c6c1c5c791b444545ec -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e58a6c68bed04d6576646ada7b4e5605ca997c86804c7b948f8a260d70e55bc7
|
|
| MD5 |
217f38501ddd7b3e4a860bea046ff001
|
|
| BLAKE2b-256 |
a365a5e60ecec71a2def1e4f06b8e6ffabb88630bc009877d8c2671936040d43
|
Provenance
The following attestation bundles were made for outreply-1.1.0-py3-none-any.whl:
Publisher:
release.yml on PlayPalsStudio/outreply-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
outreply-1.1.0-py3-none-any.whl -
Subject digest:
e58a6c68bed04d6576646ada7b4e5605ca997c86804c7b948f8a260d70e55bc7 - Sigstore transparency entry: 1340640295
- Sigstore integration time:
-
Permalink:
PlayPalsStudio/outreply-python@7c9fe95cc032386a520d6c6c1c5c791b444545ec -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/PlayPalsStudio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7c9fe95cc032386a520d6c6c1c5c791b444545ec -
Trigger Event:
push
-
Statement type: