For Developers

The social media API built for developers

OpenAPI-first. SDKs in 7 languages. Rate limits handled server-side. Webhooks with typed payloads. MCP server for AI agents. Aether is designed so you ship features, not infrastructure.

Built to minimize time between idea and working code

DX

OpenAPI-first contract

The entire API is defined in a single openapi.yaml. Every endpoint, parameter, and response schema is typed. Import the spec directly into Postman, Insomnia, or your API client of choice.

SDKs

SDKs in 7 languages

Auto-generated, strongly typed SDK clients for Node.js/TypeScript, Python, Go, Java, Ruby, PHP, and .NET. Published to npm, PyPI, pkg.go.dev, Maven Central, RubyGems, Packagist, and NuGet.

Reliability

Rate limit handling built in

Platform rate limits are validated server-side before submission. Aether's queue worker handles per-platform throttling, retry logic with exponential backoff, and dead-letter queuing — you don't write any of this.

Webhooks

Typed webhook payloads

Every webhook payload matches a documented schema. HMAC-SHA256 signature verification. Event types: post.scheduled, post.published, post.failed, comment.created, message.created. Retry with backoff.

OAuth

Connect Links — OAuth without the complexity

Generate a Connect Link per platform. Your user clicks, authenticates on the platform, and the profile appears in your API immediately. No OAuth credential management on your side.

AI-native

MCP server included

Every REST endpoint is also exposed as an MCP tool. One aether-mcp config block makes your entire Aether integration callable from Claude Desktop, Cursor, Windsurf, or any custom agent.

Typed clients, real responses

Every method returns a typed response matching the OpenAPI schema. No more guessing field names from docs.

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

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

// Type-safe post creation
const post = await aether.posts.create({
  text: "Shipping something new 🚀",
  profileIds: ["ig_abc123", "li_company789", "tt_xyz789"],
  mediaUrls: ["https://cdn.yourbrand.com/launch.jpg"],
  scheduledFor: "2026-06-15T09:00:00Z",
  overrides: {
    tt_xyz789: { text: "New drop 🚀 #launch #product" },
  },
});
// post.data.id, post.data.status, post.data.publishAt — all typed

// Pull analytics — same SDK
const metrics = await aether.analytics.getAccountMetrics({
  from: "2026-05-01T00:00:00Z",
  to: "2026-05-31T23:59:59Z",
  platform: "instagram",
  granularity: "week",
});
Python
import os
import aether

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

post = client.posts.create(
    text="Shipping something new 🚀",
    profile_ids=["ig_abc123", "li_company789", "tt_xyz789"],
    media_urls=["https://cdn.yourbrand.com/launch.jpg"],
    scheduled_for="2026-06-15T09:00:00Z",
    overrides={"tt_xyz789": {"text": "New drop 🚀 #launch #product"}},
)

# post.data.id, post.data.status — fully typed dataclass

Free tier · 3 accounts · no credit card

Get your free API key

SDKs in 7 languages

All auto-generated from the OpenAPI spec. Published to the standard registry for each language on every API release.

LanguageInstallRegistry
Node.js / TypeScriptnpm install aethernpm
Pythonpip install aetherPyPI
Gogo get github.com/aetherhq/sdk-gopkg.go.dev
JavaMaven: com.aetherhq:aether-sdkMaven Central
Rubygem install aetherRubyGems
PHPcomposer require aetherhq/aetherPackagist
.NETdotnet add package AetherNuGet

Webhook verification in one function

Every webhook payload is HMAC-SHA256 signed. Verify the signature, switch on the event type, act. No polling, no missed events.

webhook-handler.ts
import { createHmac } from "crypto";
import type { NextApiRequest, NextApiResponse } from "next";

// Verify Aether webhook signature
function verifySignature(payload: string, signature: string, secret: string): boolean {
  const expected = createHmac("sha256", secret).update(payload).digest("hex");
  return `sha256=${expected}` === signature;
}

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  const signature = req.headers["x-aether-signature"] as string;
  const body = JSON.stringify(req.body);

  if (!verifySignature(body, signature, process.env.WEBHOOK_SECRET!)) {
    return res.status(401).json({ error: "Invalid signature" });
  }

  const { event, data } = req.body;

  switch (event) {
    case "post.published":
      console.log("Post published:", data.postId, "on", data.platform);
      break;
    case "post.failed":
      console.error("Post failed:", data.postId, data.error);
      break;
    case "message.created":
      // Route to inbox handler
      break;
  }

  res.status(200).json({ received: true });
}

Frequently asked questions

What makes Aether developer-first?+

Several things: the API is designed OpenAPI-first (spec defines the contract, not the other way around), SDKs are auto-generated from the spec in 7 languages so they stay in sync, rate limits and retry logic are handled server-side so you don't implement backoff, webhook payloads are typed and signed, and every endpoint is simultaneously an MCP tool. The goal is the shortest path from 'I want to post to social media' to a working production integration.

Do I need to manage OAuth tokens for each platform?+

No. Aether's Connect Links handle OAuth for you. Generate a link per platform and send it to the account owner. They click, authenticate on the platform's OAuth screen, and the account is immediately available in your API as a profileId. Token refresh, rotation, and storage are managed by Aether.

How does rate limit handling work?+

Platform rate limits are validated at submission time — if a post would exceed Instagram's 50-post/24h limit, the API returns a 429 with a structured error body including the platform, limit type, and reset time. Scheduled posts enter a BullMQ queue; the worker handles per-platform throttling automatically and retries failed attempts with exponential backoff up to 5 times.

Which SDK languages are supported?+

Node.js/TypeScript (npm), Python (PyPI), Go (pkg.go.dev), Java (Maven Central), Ruby (RubyGems), PHP (Packagist), and .NET (NuGet). All SDKs are auto-generated from the OpenAPI spec and published on every API release.

Can I test against a sandbox environment?+

The free tier functions as your sandbox — 3 connected accounts, full API access, no time limit. You can develop against the live API without production data risks. For isolated CI testing, use a separate API key with test profile IDs.

What is the base URL and versioning scheme?+

Base URL: https://api.aetherhq.dev/v1. All endpoints are versioned under /v1. Breaking changes will increment to /v2 with a minimum 6-month deprecation period for /v1. Non-breaking changes (new fields, new endpoints) are additive and backward compatible.

Ship social features, not infrastructure

OpenAPI spec · 7-language SDKs · webhooks · MCP · 7 platforms · free tier.

Get your free API key →