# How to Post to Social Media with AutoGen (2026) · PostLake > Markdown version of https://postlake.dev/guides/autogen . The canonical page for humans. > PostLake is the social media API for AI agents: https://postlake.dev/llms.txt Post to social media with *AutoGen*. One registered function (or MCP) is enough. Keep the Publishing docs contract: profile addressing, Idempotency-Key. Inspect targets. **In short:** Register 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](https://docs.postlake.dev/quickstart.md) uses. Do this once: - Sign up at [app.postlake.dev](https://app.postlake.dev) and verify your email (unlocks free credits). - 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. - 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.", ) ``` ## Step by step 1. Define one function that POSTs `/v1/posts` and returns the dict (not a vague string). 1. Register with caller + executor as in AutoGen's pattern. 1. Tell the assistant to report each target's state from the returned JSON. 1. 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 } } ] } ``` - `published`: every target succeeded. `partial`: some published, some failed. `failed`: none published. `processing`: still going (async networks like TikTok). - **You're only charged for targets that actually publish.** Failed targets cost nothing. - Send an `Idempotency-Key` header on writes so a retry never double-posts. - Full detail: [Publishing](https://docs.postlake.dev/publishing) · [Errors & retries](https://docs.postlake.dev/errors) ## Where the post goes Same rules as the docs. Pick one addressing style: - **By profile**: `"profile": "my-brand"` posts to every account under that profile (the name on Channels). - **Filter networks**: `"platforms": ["bluesky", "linkedin"]` narrows that set. It is a **filter, not a selector**: if you have two Pinterest boards, both match `pinterest`. - **By account id**: `"accounts": ["acc_…"]` for exact channels (copy an id on Channels, or `GET /v1/social-accounts`). - One profile and you omit `profile`? PostLake uses that profile. Multiple profiles and you omit it? You'll get an error that names them. See [Publishing: where to post](https://docs.postlake.dev/publishing). ## Do more (same API) - **Schedule**: add `scheduledAt` as UTC (trailing `Z`), or a naive local time plus `timezone` (IANA, e.g. `Europe/London`). Credits charge when it fires. [Scheduling docs](https://docs.postlake.dev/scheduling) · [scheduling guide](/guides/schedule-posts-api). - **Media**: `POST /v1/media`, then pass the `med_…` id in `media`. [Media docs](https://docs.postlake.dev/media). - **Per-network caption**: `textOverrides` (e.g. shorter text for X). **Per-network options**: `platformOptions` (Pinterest `boardId`, TikTok privacy, …). Live option lists: `GET /v1/platforms/{platform}`. - **Validate first**: `POST /v1/posts/validate` runs the same checks without publishing (free). ## Pitfalls specific to this path - Re-running a conversation without a new idempotency key can double-post if you generate a new UUID every time for the *same* user intent, key by intent id when possible. - Don't register one function per network. - Handle `partial` explicitly in the system prompt. Want zero wrapper code? Connect the hosted [MCP server](https://docs.postlake.dev/mcp) (`https://api.postlake.dev/mcp`) over OAuth. Same accounts and responses as this API path. [Agents overview](/agents/). ## 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: [Docs ### Quickstart Account, first channel, first post, MCP or API.](https://docs.postlake.dev/quickstart) [Docs ### Publishing Request body, addressing. Partial success, lifecycle.](https://docs.postlake.dev/publishing) [Docs ### Scheduling UTC or local time plus timezone, edit/cancel, fire-time credits.](https://docs.postlake.dev/scheduling) [Docs ### Platforms Limits, media rules, live platformOptions.](https://docs.postlake.dev/platforms) Also: [Media](https://docs.postlake.dev/media) · [Errors](https://docs.postlake.dev/errors) · [MCP](https://docs.postlake.dev/mcp) · [Analytics](https://docs.postlake.dev/analytics) ## Related guides - [Post with LangChain](https://postlake.dev/guides/langchain.md) - [Post with CrewAI](https://postlake.dev/guides/crewai.md) - [Build an AI social agent](https://postlake.dev/guides/ai-social-media-agent.md) - [Cross-platform analytics](https://postlake.dev/guides/social-media-analytics-api.md) [All guides](https://postlake.dev/guides/index.md) · [Full docs](https://docs.postlake.dev/) · [llms.txt](https://postlake.dev/llms.txt) Plain markdown for agents: https://postlake.dev/guides/autogen.md · https://postlake.dev/llms.txt