Skip to main content

onepostly

Official Python SDK for the Onepostly API — publish, schedule, and read results across all supported social platforms with one request shape. See the docs for the current platform list.

Python 3.10+.

Installation

pip install onepostly

Usage

Every resource is its own API class built on a shared Configuration and ApiClient:

import os
from onepostly import ApiClient, Configuration
from onepostly.api.posts_api import PostsApi

configuration = Configuration(
    api_key={"ApiKeyHeader": os.environ["ONEPOSTLY_API_KEY"]},  # sent as the `x-api-key` header
)

with ApiClient(configuration) as api_client:
    posts = PostsApi(api_client)

    response = await posts.create_post(
        create_post_body={
            "text": "Hello from Onepostly",
            "mediaKind": "text",
            "destinations": [{"connectionId": "…"}],
        }
    )
    print(response.post.id, response.post.status)  # "queued"

Methods are async and return deserialized pydantic models (PostResponse, ListPosts200Response, …). The …with_http_info() variants return an ApiResponse with status_code, headers, and raw_data alongside data.

Pass plain dicts anywhere a model is expected — pydantic validates and coerces them (alias names like connectionId and mediaKind are accepted on both keys and fields).

Scheduling

await posts.create_post(
    create_post_body={
        "text": "Tomorrow morning",
        "scheduledFor": "2026-09-01T09:00:00",  # timezone-naive local time
        "timezone": "Europe/Istanbul",
        "destinations": [{"connectionId": "…"}],
    }
)
# 201 Created, status "scheduled"

Media

from onepostly.api.media_api import MediaApi

media_api = MediaApi(api_client)

with open("photo.jpg", "rb") as f:
    upload = await media_api.upload_media(file=f)
media_url = upload.media.url

await posts.create_post(
    create_post_body={
        "text": "With an image",
        "mediaKind": "image",
        "mediaUrls": [media_url],
        "destinations": [{"connectionId": "…"}],
    }
)

Insights

from onepostly.api.insights_api import InsightsApi

insights_api = InsightsApi(api_client)

post_insights = await insights_api.get_post_insights(id=post_id)
for destination in post_insights.insights.destinations or []:
    print(destination.platform, destination.metrics)

timeline = await insights_api.get_post_insights_timeline(
    id=post_id,
    var_from="2026-08-01",  # inclusive, YYYY-MM-DD (`from` is a Python keyword)
    to="2026-08-28",        # inclusive, YYYY-MM-DD
)

Error handling

Every non-2xx response raises an ApiException subclass with the HTTP status, reason, and the raw response body attached. Subclasses map to status families (UnauthorizedException, ForbiddenException, NotFoundException, ConflictException, ServiceException, …):

from onepostly import ApiException

try:
    await posts.create_post(create_post_body={/*  */})
except ApiException as error:
    print(error.status, error.body)
    # 402 {"error": {"code": "INSUFFICIENT_WALLET", "message": "…"}}

API reference

All methods take named keyword arguments.

API class Methods
PostsApi create_post list_posts get_post cancel_post delete_post_destination
MediaApi upload_media list_media delete_media
ConnectionsApi list_connections get_connection_stats list_connection_media get_tik_tok_creator_info list_pinterest_boards create_pinterest_board connect_bluesky start_o_auth list_facebook_pages select_facebook_page
InsightsApi get_post_insights get_post_insights_timeline
CommentsApi list_comments create_comment delete_comment
EngagementApi list_retweeters retweet undo_retweet like unlike bookmark remove_bookmark quote
WebhooksApi list_webhook_event_types list_webhooks create_webhook get_webhook update_webhook delete_webhook rotate_webhook_secret list_webhook_deliveries test_webhook

Representative signatures:

# PostsApi — id/destination-scoped actions take id / destination_id
await posts.create_post(create_post_body=)            # → PostResponse
await posts.list_posts(limit=None, offset=None)        # → ListPosts200Response
await posts.get_post(id=)                             # → PostResponse
await posts.cancel_post(id=)                          # → PostResponse
await posts.delete_post_destination(id=, destination_id=)  # remote-delete

# EngagementApi — body-bearing actions take a body model or dict
await engagement.retweet(id=, destination_id_body={"destinationId": "…"})
await engagement.undo_retweet(id=, destination_id=)
await engagement.like(id=, destination_id_body={"destinationId": "…"})
await engagement.quote(id=, quote_body={"destinationId": "…", "text": "…"})
await engagement.list_retweeters(id=, destination_id=None, limit=None, cursor=None)

# CommentsApi
await comments.create_comment(id=, create_comment_body={"destinationId": "…", "text": "…"})
await comments.list_comments(id=, destination_id=None, limit=None, cursor=None)
await comments.delete_comment(id=, comment_id=, destination_id=)

# WebhooksApi
await webhooks.create_webhook(create_webhook_body={"name": "…", "url": "…", "events": []})
await webhooks.update_webhook(id=, update_webhook_body={})
await webhooks.rotate_webhook_secret(id=)
await webhooks.test_webhook(id=)

Full request/response reference: onepostly.com/openapi.json

Download files

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

Source Distribution

onepostly-0.2.5.tar.gz (55.5 kB view details)

Uploaded Source

Built Distribution

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

onepostly-0.2.5-py3-none-any.whl (136.2 kB view details)

Uploaded Python 3

File details

Details for the file onepostly-0.2.5.tar.gz.

File metadata

  • Download URL: onepostly-0.2.5.tar.gz
  • Upload date:
  • Size: 55.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for onepostly-0.2.5.tar.gz
Algorithm Hash digest
SHA256 a128aaebae488e89f1af819af0ff46ea90824308a51898841c55b7f5f8bbecc8
MD5 09d2b9610cec4009a26fb76ea44b8dd8
BLAKE2b-256 70afbe77f5b9ba421bad368fedb67c1a659dac775759d9e43521cfa791465626

See more details on using hashes here.

Provenance

The following attestation bundles were made for onepostly-0.2.5.tar.gz:

Publisher: generate.yml on onepostly/onepostly-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 onepostly-0.2.5-py3-none-any.whl.

File metadata

  • Download URL: onepostly-0.2.5-py3-none-any.whl
  • Upload date:
  • Size: 136.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for onepostly-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bcb4c75b3438ecab32d222ad18bdbf9ed91fe2ce4e05b49070a0e8004b9fc49c
MD5 c7c2b0115d2757097526f959bd7067b3
BLAKE2b-256 95ace15018ff8ae9a392aeaaacb4044584eb7dbb010ecc29f377fb6e927c1740

See more details on using hashes here.

Provenance

The following attestation bundles were made for onepostly-0.2.5-py3-none-any.whl:

Publisher: generate.yml on onepostly/onepostly-python

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

Release history Release notifications | RSS feed

This release

0.2.5 This release

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.1.0

2 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