Node.js SDK
Official Aether client library for Node.js and TypeScript.
The official Node.js SDK (aether on npm) provides typed access to the Aether REST API.
Installation
npm install aetherConfiguration
import { Aether } from "aether";
const client = new Aether({
apiKey: process.env.AETHER_API_KEY!,
// baseUrl: "https://api.aetherhq.dev/v1", // optional override
});Reads AETHER_API_KEY from the environment when passed to the constructor.
Paginated lists
posts.list(), inbox.list(), and webhooks.listDeliveries() return a PaginatedList<T>:
import type { PaginatedList } from "aether";
const { items, total, hasMore } = await client.posts.list({ perPage: 20 });Resources
| Resource | Methods | Guide |
|---|---|---|
client.profiles | list, get, disconnect | Connect Links |
client.posts | list, create, get, update, cancel | Publishing |
client.queues | list, create, get, update, delete, peekNextSlot | Queues |
client.automations | listCommentToDm, createCommentToDm, getCommentToDm, updateCommentToDm, deleteCommentToDm, testCommentToDm | Automations |
client.inbox | list, reply, markAsRead, sendPrivateReply | Inbox |
client.analytics | getPostMetrics, getAccountMetrics, getBestPostingTimes | Analytics |
client.webhooks | list, create, update, delete, deliveries | Webhooks |
client.connectLinks | list, create | Connect Links |
Error handling
import { AetherError } from "aether";
try {
await client.posts.create({ text: "Hi", profileIds: ["bad_id"] });
} catch (err) {
if (err instanceof AetherError) {
console.error(err.code, err.message, err.httpStatus);
}
}Idempotency
Pass Idempotency-Key on post creation via request options. The SDK automatically retries on 409 IDEMPOTENCY_IN_PROGRESS.
Not yet in SDK
These API areas are available via REST but not yet wrapped in the Node SDK:
- API keys (
/v1/api-keys) - Organization and team (
/v1/organization) - Media presign (
/v1/media/presign)
Use fetch or extend the client for these endpoints until SDK support ships.
Threads (V1)
Threads is supported for connect and publish via the Node SDK. Other language SDKs (Python, Go, Java, etc.) are not generated yet — use REST or the Node SDK until they ship.
Connect
const link = await client.connectLinks.create({
platform: "threads",
redirectUrl: "https://yourapp.com/settings/social",
});
// Send link.url to your user; after OAuth, list profiles to get the profileIdPublish and schedule
await client.posts.create({
text: "Hello Threads",
profileIds: ["<threads-profile-id>"],
scheduledFor: "2026-06-15T12:00:00Z", // omit to publish immediately
overrides: {
threads: {
topicTag: "productlaunch",
threadItems: [
{ text: "First post in the thread" },
{ text: "Second post — published as a reply" },
],
},
},
});Cross-post in one call by including multiple profileIds (e.g. Instagram + Threads).
TypeScript types
The hand-maintained PlatformOverride type in the SDK currently exposes text and mediaUrls. Threads-specific fields (topicTag, threadItems) are fully supported by the REST API and work at runtime — use a type assertion or pass overrides through fetch if strict typing blocks you until the SDK is regenerated from OpenAPI.
Not available for Threads yet
client.inbox.*— Instagram and Facebook onlyclient.analytics.*— Instagram and Facebook onlyclient.automations.*— Instagram and Facebook only
See Threads platform guide for Meta developer setup and content types.
TikTok (V1)
TikTok is supported for connect and publish via the Node SDK. Posts require at least one mediaUrl (video or images for Photo Mode).
Connect
const link = await client.connectLinks.create({
platform: "tiktok",
redirectUrl: "https://yourapp.com/settings/social",
});Publish and schedule
await client.posts.create({
text: "POV: shipped in minutes 👀",
profileIds: ["<tiktok-profile-id>"],
mediaUrls: ["https://cdn.example.com/clip.mp4"],
scheduledFor: "2026-06-15T18:00:00Z", // omit to publish immediately
});Not available for TikTok yet
client.inbox.*— Instagram and Facebook onlyclient.analytics.*— Instagram and Facebook onlyclient.automations.*— Instagram and Facebook only
See TikTok platform guide for content types and rate limits.
LinkedIn (V1)
LinkedIn is supported for connect and publish on personal profiles via the Node SDK — text posts, images, and PDF documents.
Connect
const link = await client.connectLinks.create({
platform: "linkedin",
redirectUrl: "https://yourapp.com/settings/social",
});Publish and schedule
// Text post
await client.posts.create({
text: "Thoughts on shipping faster with a unified API",
profileIds: ["<linkedin-profile-id>"],
});
// PDF document post
await client.posts.create({
text: "Our Q1 report is live",
profileIds: ["<linkedin-profile-id>"],
mediaUrls: ["https://cdn.example.com/report.pdf"],
overrides: {
linkedin: { documentTitle: "Q1 Report" },
},
scheduledFor: "2026-07-15T08:00:00Z", // omit to publish immediately
});Not available for LinkedIn yet
- Company page posting — Community Management API approval required (coming soon)
client.inbox.*— Instagram and Facebook onlyclient.analytics.*— Instagram and Facebook onlyclient.automations.*— Instagram and Facebook only
See LinkedIn platform guide for overrides, first comment, and rate limits.
OpenAPI
The SDK is maintained alongside packages/openapi/openapi.yaml. See API Reference for full request/response schemas.