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.
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.
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.
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.
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.
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.
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.
Every method returns a typed response matching the OpenAPI schema. No more guessing field names from docs.
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",
});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 dataclassFree tier · 3 accounts · no credit card
Get your free API keyAll auto-generated from the OpenAPI spec. Published to the standard registry for each language on every API release.
| Language | Install | Registry |
|---|---|---|
| Node.js / TypeScript | npm install aether | npm |
| Python | pip install aether | PyPI |
| Go | go get github.com/aetherhq/sdk-go | pkg.go.dev |
| Java | Maven: com.aetherhq:aether-sdk | Maven Central |
| Ruby | gem install aether | RubyGems |
| PHP | composer require aetherhq/aether | Packagist |
| .NET | dotnet add package Aether | NuGet |
Every webhook payload is HMAC-SHA256 signed. Verify the signature, switch on the event type, act. No polling, no missed events.
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 });
}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.
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.
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.
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.
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.
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.
OpenAPI spec · 7-language SDKs · webhooks · MCP · 7 platforms · free tier.
Get your free API key →