Aether
Getting Started

Quickstart

Authenticate, connect accounts, and schedule your first post in minutes.

Aether is a unified social media API — publish, schedule, manage inbox, and track analytics across platforms from a single REST API and MCP server.

Base URL: https://api.aetherhq.dev/v1


Install the SDK

npm install aether
import { Aether } from "aether";

const client = new Aether({ apiKey: process.env.AETHER_API_KEY });
pip install aether-python
from aether import Aether

client = Aether(api_key=os.environ["AETHER_API_KEY"])
go get github.com/aetherhq/aether-go
import "github.com/aetherhq/aether-go"

client := aether.NewClient(os.Getenv("AETHER_API_KEY"))
gem install aether
require "aether"

client = Aether::Client.new(api_key: ENV["AETHER_API_KEY"])
<!-- Maven -->
<dependency>
  <groupId>dev.aetherhq</groupId>
  <artifactId>aether</artifactId>
  <version>1.0.0</version>
</dependency>
import dev.aetherhq.Aether;

Aether client = Aether.builder()
    .apiKey(System.getenv("AETHER_API_KEY"))
    .build();
composer require aetherhq/aether
use AetherHQ\Aether\Client;

$client = new Client(['api_key' => getenv('AETHER_API_KEY')]);
dotnet add package Aether
using AetherHQ;

var client = new AetherClient(
    apiKey: Environment.GetEnvironmentVariable("AETHER_API_KEY")
);
cargo add aether
use aether::Client;

let client = Client::new(std::env::var("AETHER_API_KEY")?);

See the Node.js SDK for full resource coverage.


Authentication

All API requests require an API key in the Authorization header:

export AETHER_API_KEY=aeth_live_your_key_here

Getting your API key

  1. Sign up at app.aetherhq.dev
  2. Go to API Keys in the dashboard
  3. Click Create API Key
  4. Copy the key immediately — it is only shown once

Key format

Keys use the aeth_live_ prefix (production) or aeth_test_ prefix (test). Keys are stored as hashes — the full value is shown only at creation.


Key concepts

ConceptDescription
OrganizationTop-level container for your team, profiles, posts, and API keys
SocialProfileA connected social media account (created via Connect Link OAuth)
PostContent published or scheduled to one or more SocialProfiles
ConnectLinkMagic OAuth URL your end-user clicks to connect their account
PublishQueueRecurring time slots for automatic post scheduling
CommentAutomationKeyword rules that send private DMs when users comment

Step 1: List connected profiles

After connecting an account (Step 2), list profiles to get profileIds:

curl https://api.aetherhq.dev/v1/profiles \
  -H "Authorization: Bearer $AETHER_API_KEY"
const profiles = await client.profiles.list();
console.log(profiles.map((p) => `${p.platform}: ${p.id}`));

Step 2: Connect a social account

Generate a Connect Link and send the URL to your user:

curl -X POST https://api.aetherhq.dev/v1/connect-links \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "instagram",
    "label": "Main Instagram"
  }'

V1 platforms

OAuth connect is available for Instagram, Facebook, Threads, TikTok, and LinkedIn in V1. Other platforms are coming soon — see Platforms.

Share the returned url with your user. After OAuth completes, the profile appears in your organization.


Step 3: Schedule your first post

curl -X POST https://api.aetherhq.dev/v1/posts \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello from Aether!",
    "profileIds": ["<your-profile-id>"],
    "scheduledFor": "2026-06-15T12:00:00Z"
  }'
const { post } = await client.posts.create({
  text: "Hello from Aether!",
  profileIds: ["prof_abc123"],
  scheduledFor: "2026-06-15T12:00:00Z",
});

Publishing immediately

Omit scheduledFor to publish right away (or use POST /posts/:id/publish on a draft):

curl -X POST https://api.aetherhq.dev/v1/posts \
  -H "Authorization: Bearer $AETHER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "This posts immediately!",
    "profileIds": ["<your-profile-id>"]
  }'

Creating a draft

Create a post without scheduling or publishing by saving it from the dashboard compose flow, or schedule it later with PATCH /posts/:id.


What's next?

On this page