Facebook API

The Facebook posting API that actually works

Facebook's Graph API requires separate app registration from Instagram, complex permission scopes, and manual token lifecycle management. Aether wraps all of that — post to Pages, cross-post to Instagram, and manage Reels with one API key.

Post to Facebook in under 15 minutes

One call for posts, photos, and cross-platform publishing. Pass multiple profileIds and Aether handles both Facebook and Instagram in parallel.

Node.js / TypeScript
import Aether from "aether";

const aether = new Aether({ apiKey: process.env.AETHER_API_KEY });

// Post to Facebook Page
const post = await aether.posts.create({
  text: "Big announcement from the team 📢\n\nWe just launched...",
  profileIds: ["fb_page456"],
  mediaUrls: ["https://your-cdn.com/banner.jpg"],
  overrides: {
    facebook: { contentType: "post" },
  },
});

// Cross-post to Facebook + Instagram simultaneously
const crossPost = await aether.posts.create({
  text: "Launching something big today 🚀",
  profileIds: ["fb_page456", "ig_abc123"],
  mediaUrls: ["https://your-cdn.com/launch.jpg"],
  overrides: {
    facebook: { contentType: "post" },
    instagram: { contentType: "reel" },
  },
  scheduledFor: "2026-06-15T10:00:00Z",
});

Free tier · 3 accounts · no credit card

Get your free API key

The same call in Python and cURL

Python
import os
import aether

client = aether.Aether(api_key=os.environ["AETHER_API_KEY"])

# Post to Facebook Page
post = client.posts.create(
    text="Big announcement from the team 📢",
    profile_ids=["fb_page456"],
    media_urls=["https://your-cdn.com/banner.jpg"],
    overrides={"facebook": {"content_type": "post"}},
)

# Cross-post to Facebook + Instagram
cross_post = client.posts.create(
    text="Launching something big today 🚀",
    profile_ids=["fb_page456", "ig_abc123"],
    media_urls=["https://your-cdn.com/launch.jpg"],
    scheduled_for="2026-06-15T10:00:00Z",
)
cURL
curl -X POST https://api.aetherhq.dev/v1/posts \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Launching something big today 🚀",
    "profileIds": ["fb_page456", "ig_abc123"],
    "mediaUrls": ["https://your-cdn.com/launch.jpg"],
    "scheduledFor": "2026-06-15T10:00:00Z",
    "overrides": {
      "facebook": { "contentType": "post" },
      "instagram": { "contentType": "reel" }
    }
  }'

The actual API response

Aether returns a normalized post object immediately. Once published, publishResults includes the native Facebook post ID for each Page.

JSON
{
  "success": true,
  "data": {
    "id": "post_5p7rq2a",
    "status": "scheduled",
    "text": "Launching something big today 🚀",
    "profileIds": ["fb_page456", "ig_abc123"],
    "mediaUrls": ["https://cdn.aetherhq.dev/org_9p2qrs/launch.jpg"],
    "mediaKeys": ["org_9p2qrs/launch.jpg"],
    "scheduledFor": "2026-06-15T10:00:00.000Z",
    "publishResults": [],
    "publishedAt": null,
    "failedAt": null,
    "createdAt": "2026-06-08T14:23:11.000Z"
  }
}

Facebook OAuth — without the complexity

Getting direct Facebook API access means: registering a separate Meta developer app from your Instagram app, requesting the right combination of Page permissions, and submitting for Meta app review.

Aether's Connect Link removes all of that. Call one endpoint, get a URL, send it to your user. They authorize their Facebook Page, and it appears in your dashboard immediately.

TypeScript
// Generate a Connect Link for your user to authenticate Facebook
const link = await aether.connectLinks.create({
  platform: "facebook",
  redirectUrl: "https://yourapp.com/settings/social",
});

// Send link.url to your user — they click, authorize their Facebook Page,
// and it appears in your dashboard automatically.
// No Meta developer portal setup needed on your end.
console.log(link.url);      // "https://connect.aetherhq.dev/link/cl_fb2r5s..."
console.log(link.expiresAt); // "2026-06-15T14:23:11.000Z"

Everything the Facebook API gives you

No OAuth headache

Facebook's permission scopes and app review process are handled by Aether. Connect your Page through our Connect Link flow and start publishing immediately.

Cross-post with Instagram

If your Facebook Page is linked to an Instagram Business account, post to both simultaneously with one API call and multiple profileIds.

Photos and carousels

Single images and multi-photo posts. Pass media URLs and Aether handles Facebook's multi-upload API internally. Your code stays the same.

Videos and Reels

Upload MP4 videos up to 4 GB or pass a URL. Facebook Reels use the same call with contentType: 'reel'. Aether handles the resumable upload protocol.

Scheduling

Pass scheduledFor and Aether queues the post for up to 6 months in advance. Works for all content types — posts, photos, videos, and Reels.

Automatic token refresh

Facebook Page access tokens for live apps never expire, but Aether rotates and manages them automatically. No token lifecycle code on your end.

Analytics

Reach, impressions, engagement, and fan growth per Page and per post. Historical data with custom date ranges via the Analytics API.

MCP / AI agents

Every Facebook endpoint is an MCP tool. Claude, Cursor, and any MCP-compatible agent can post, schedule, and pull analytics without extra code.

Why not build directly on the Meta Graph API?

Facebook and Instagram require separate Meta developer apps with distinct permission sets. Here's what you take on directly versus using Aether.

FeatureAetherMeta Graph API directly
Permission scopesHandled by Aether's connect flowComplex scope management your team owns
Token refreshAutomatic — tokens never expire on your endManual refresh every 60 days
Cross-postingFacebook + Instagram in one API callTwo separate Meta API integrations
AuthenticationOne API keyApp Review + OAuth 2.0
API maintenanceWe absorb all breaking changesYour team's responsibility
Platform complianceOfficial API, fully compliantOfficial API, fully compliant

Facebook API rate limits

Platform-level limits set by Meta. Aether queues and retries automatically — your integration does not need backoff logic.

OperationLimitError codeNote
API calls200 calls / hr / token32Per access token
Page posts200 posts / day341Per Facebook Page
Video upload4 GB / 120 min352MP4 recommended
Photo upload4 MB per image352JPEG / PNG
Caption length63,206 characters100UTF-8
Scheduled post window6 months aheadMin 10 min from now

Facebook API error codes reference

CodeMeaningHow Aether handles it
190Invalid or expired access tokenAether auto-refreshes — reconnect via Connect Link if it persists
10Permission not granted or removedRe-connect via Connect Link; all scopes are requested upfront
100Invalid request parameterAether validates the request; check your input fields
200Permission denied for this operationEnsure account has Page admin role and correct permission
341Daily post limit reachedAether queues excess posts for the next available window
368Account temporarily blocked (spam)Content policy review required before resubmitting

AI-Native

Let your AI agent post to Facebook

Aether ships an MCP server that exposes every Facebook endpoint as a callable tool. Claude Desktop, Cursor, Windsurf, and any MCP-compatible agent can post, schedule, cross-post with Instagram, and pull analytics — with no additional integration code.

Claude Desktop config
# Add to ~/.claude/claude_desktop_config.json
{
  "mcpServers": {
    "aether": {
      "command": "npx",
      "args": ["-y", "aether-mcp"],
      "env": { "AETHER_API_KEY": "sk_live_..." }
    }
  }
}

# Claude can now post to Facebook:
# "Post our product update to the Facebook Page and Instagram"
# "Schedule next week's Facebook posts for 10am daily"
# "What's our Facebook reach this month?"

Frequently asked questions

Does this work with Facebook personal profiles?+

No — Meta's API policy restricts posting to Pages and Groups only. Personal profiles cannot be connected to third-party apps. You need a Facebook Page to use the API, which is free to create from your personal account.

How does cross-posting with Instagram work?+

If your Facebook Page is linked to an Instagram Business account via Meta Business Suite, you can post to both simultaneously with one API call using multiple profileIds. Aether handles the platform-specific formatting for each automatically.

Do I need to manage Facebook's long-lived token refresh?+

No. Aether automatically manages Facebook Page access tokens. For live apps, page tokens don't expire — but Aether still handles rotation and monitors for any revocation events.

Can I post to multiple Facebook Pages at once?+

Yes. Each Page is a separate connected profile with its own profileId. Pass multiple profileIds in one API call to post to all of them simultaneously with identical or per-platform customized content.

Does Aether support Facebook Reels?+

Yes. Use contentType: 'reel' in the overrides.facebook object and provide a video file. Facebook Reels requires a minimum 3-second video and follows similar format requirements to Instagram Reels.

Ready to ship your Facebook integration?

Free tier · 3 accounts · full API access · MCP server · no credit card.

Get your free API key →