Build an AI social agent

Build an AI agent
that runs your socials.

Most agent demos die on platform integrations. PostLake is the hands: one publish call. One analytics shape, MCP if you want zero wrapper code. Your model still decides what to say, PostLake only executes and reports.

Get started free →

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

In shortGive the agent publish + analytics (API tools or MCP). It posts everywhere, reads one metric shape, and retries safely with idempotency keys.

When this guide is for you

The product is the agent: it should decide, publish, measure, and improve without you maintaining platform APIs.

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.

Two tools: publish and learn

The agent needs hands (publish) and feedback (analytics). Both match the docs. Same auth. Same profile. Same response discipline:

import os, uuid, requests

HEADERS = {"Authorization": f"Bearer {os.environ['POSTLAKE_API_KEY']}"}

def publish(text: str) -> dict:
    """Publish to every account on the profile. Always check targets[]."""
    return requests.post(
        "https://api.postlake.dev/v1/posts",
        headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
        json={"text": text, "profile": "my-brand"},
    ).json()

def performance(period: str = "30d") -> dict:
    """Same metric names on every network, agent-friendly."""
    return requests.get(
        f"https://api.postlake.dev/v1/analytics?period={period}",
        headers=HEADERS,
    ).json()

# Or skip wrappers: connect https://api.postlake.dev/mcp (OAuth).

Make it work

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

  1. Connect the accounts the agent may manage under one profile (Bluesky first for a fast smoke test).
  2. Expose publish (POST /v1/posts) and performance (GET /v1/analytics), or use MCP tools for both.
  3. Prompt the agent to treat partial as mixed results and to never claim success without reading targets.
  4. Close the loop: after a few days, call analytics and let the model adjust format/network mix.
  5. For calendars, add scheduledAt (UTC, or a local time plus timezone) so the agent can plan ahead without a second product.

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 build an AI agent that posts to social media?

Give it PostLake publish (POST /v1/posts) and analytics (GET /v1/analytics), or connect MCP. The agent never talks to nine platform APIs, only one normalised contract.

What stops an AI agent from double-posting?

Idempotency-Key on each logical publish. Retries with the same key return the original Post instead of creating another.

How does the agent know what to post next?

GET /v1/analytics returns the same metric names across networks. The agent compares without a translation layer. See the analytics guide and docs.

MCP or REST?

MCP (https://api.postlake.dev/mcp) is best when the host supports OAuth tools. REST tools are fine inside your own backend agent runtime.

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 →