Aether
Guides

Errors

API error format, common codes, and how to handle failures.

All API errors use a consistent envelope:

{
  "success": false,
  "error": {
    "code": "PROFILE_NOT_FOUND",
    "message": "Social profile not found."
  }
}

Some errors include a details object with additional context.

HTTP status codes

StatusMeaning
400Invalid request body or query parameters
401Missing or invalid API key
403Insufficient scope or permission
404Resource not found
409Conflict (e.g. idempotency in progress)
422Validation failed
429Rate limit exceeded
500Internal server error
503Dependency unavailable (e.g. analytics)

Common error codes

CodeDescription
VALIDATION_ERRORRequest body failed schema validation
INVALID_QUERY_PARAMSQuery string validation failed
PROFILE_NOT_FOUNDSocialProfile ID does not exist
POST_NOT_FOUNDPost ID does not exist
QUEUE_NOT_FOUNDPublish queue ID does not exist
AUTOMATION_NOT_FOUNDAutomation ID does not exist
MESSAGE_NOT_FOUNDInbox message ID does not exist
IDEMPOTENCY_IN_PROGRESSDuplicate request still processing — retry with backoff
ANALYTICS_UNAVAILABLETinybird analytics not configured or down
STORAGE_UNAVAILABLEMedia storage not configured
INTERNAL_ERRORUnexpected server error

Idempotency

POST /v1/posts supports idempotency via Idempotency-Key header. On 409 IDEMPOTENCY_IN_PROGRESS, wait and retry — the Node SDK retries automatically.

SDK errors

The Node SDK throws AetherError with code, message, and optional httpStatus:

import { AetherError } from "aether";

try {
  await client.posts.get("invalid_id");
} catch (err) {
  if (err instanceof AetherError) {
    console.log(err.code, err.httpStatus);
  }
}

MCP errors

MCP tools return human-readable error text optimized for LLM recovery — e.g. suggesting list_profiles when profile IDs are invalid.

On this page