Post with AutoGen

Post to social media
with AutoGen.

One registered function (or MCP) is enough. Keep the Publishing docs contract: profile addressing, Idempotency-Key. Inspect targets.

Get started free →

Free tier. No card · one API for every network · full MCP access

In shortRegister one PostLake function in AutoGen (or use MCP). Caller/executor get a readable Post result for the next turn.

When this guide is for you

An AutoGen multi-agent chat should be allowed to publish, with idempotent retries and a clear result.

Before you start

Same setup the docs quickstart uses. Do this once:

  1. Sign up at app.postlake.dev and verify your email (unlocks free credits).
  2. On Channels, create a profile (e.g. my-brand) and connect at least one account. Bluesky is the fastest first channel: no app review. Instagram/TikTok/Facebook need each platform's review before API posting.
  3. Account menu → API Keys → create a key (sk_live_…). It shows once; treat it like a password.

Working example in AutoGen

Connect accounts once in the dashboard, then this is the publish call:

from autogen import register_function
import os, requests, uuid

def post_to_social(text: str) -> dict:
    """Publish via PostLake to profile my-brand. Returns the Post JSON."""
    r = requests.post(
        "https://api.postlake.dev/v1/posts",
        headers={
            "Authorization": f"Bearer {os.environ['POSTLAKE_API_KEY']}",
            "Idempotency-Key": str(uuid.uuid4()),
        },
        json={"text": text, "profile": "my-brand"},
    )
    r.raise_for_status()
    return r.json()

register_function(
    post_to_social,
    caller=assistant,    # decides to post
    executor=user_proxy, # runs the HTTP call
    description="Publish a post to connected social networks via PostLake.",
)

Make it work in AutoGen

Tool-specific glue on top of the shared setup above:

  1. Define one function that POSTs /v1/posts and returns the dict (not a vague string).
  2. Register with caller + executor as in AutoGen's pattern.
  3. Tell the assistant to report each target's state from the returned JSON.
  4. Prefer MCP when available so you don't ship API keys inside the process.

Read the response (don't skip this)

You get one Post with an overall state and a targets[] array. One entry per account. Always check each target; partial success is normal.

{
  "id": "post_a1b2c3",
  "state": "partial",
  "targets": [
    { "platform": "bluesky",  "state": "published", "url": "https://bsky.app/…" },
    { "platform": "linkedin", "state": "failed",
      "error": { "type": "invalid_request", "message": "…", "retryable": false } }
  ]
}

Where the post goes

Same rules as the docs. Pick one addressing style:

See Publishing: where to post.

Do more (same API)

Pitfalls specific to this path

Want zero wrapper code? Connect the hosted MCP server (https://api.postlake.dev/mcp) over OAuth. Same accounts and responses as this API path. Agents overview.

Common questions

How do I let an AutoGen agent post to social media?

Register one Python function that calls PostLake /v1/posts and returns JSON. Or connect MCP. Either path covers every account on the profile.

Do I need a function per network?

No. One PostLake function is enough; platforms is only an optional filter.

Can AutoGen use PostLake over MCP?

Yes, with an MCP-capable AutoGen setup pointed at https://api.postlake.dev/mcp.

Go deeper in the docs

These guides stay short on purpose. Canonical behaviour lives here:

Also: Media · Errors · MCP · Analytics

Related guides

All guides · Full docs · llms.txt · Markdown

Stuck? The docs are the source of truth, start at Publishing.

Open the dashboard →