REST API · Webhooks · SDKs

Build with Fast Social

A simple, powerful API to schedule and publish social content programmatically. Integrate Fast Social into your app, automate your workflows, or build your own social media tool.

curl example
curl -X GET https://fastsocial.ai/api/v1/posts \
  -H "Authorization: Bearer fsk_live_••••••••••••" \
  -H "Content-Type: application/json"

Everything you need to build

REST API

Schedule and publish posts, manage platforms, pull analytics. Full CRUD on your content pipeline.

🔔

Webhooks

Get notified the instant a post publishes or fails. Real-time events delivered to your endpoint with HMAC-SHA256 verification.

🆓

Free Developer Access

No expiration date. 1,000 requests/hour. Connect your app and start building immediately.

Get started in 5 minutes

From zero to your first scheduled post in under five minutes.

  1. 1

    Request API access

    Contact us to get your API key. We'll provision it within 1 business day. Your key will appear in the Fast Social client portal under Settings → API Keys.

  2. 2

    Copy your API key

    Your key looks like fsk_live_xxxxxxxxxxxx. Keep it secret — treat it like a password. Never commit it to version control.

    Authorization: Bearer fsk_live_xxxxxxxxxxxx
  3. 3

    Make your first request

    Call GET /me — this returns your account info and confirms your key is working.

    curl
    curl -X GET https://fastsocial.ai/api/v1/me \
      -H "Authorization: Bearer fsk_live_your_key" \
      -H "Content-Type: application/json"
  4. 4

    Schedule your first post

    POST to /posts with your content, target platform, and a scheduled time.

    curl
    curl -X POST https://fastsocial.ai/api/v1/posts \
      -H "Authorization: Bearer fsk_live_your_key" \
      -H "Content-Type: application/json" \
      -d '{
        "text": "Hello from the API!",
        "platform": "twitter",
        "scheduled_at": "2026-06-01T10:00:00Z"
      }'
  5. 5

    Set up a webhook (optional)

    Register a webhook endpoint to receive real-time notifications when posts publish or fail. See the Webhook Events section for setup instructions and HMAC signature verification.

Authentication

All API requests require a Bearer token. Generate your API key from the Fast Social client portal under Settings → API Keys.

Authorization: Bearer fsk_live_your_api_key

Base URL

https://fastsocial.ai/api/v1

API Reference

Base URL: https://fastsocial.ai/api/v1

Select a language above — all code examples will update together.

GET/meReturns your account info and connected platforms.

Example Response

{
  "client_id": "cl_abc123",
  "name": "Acme Corp",
  "plan": "agency",
  "platforms": ["twitter", "linkedin", "instagram"]
}

Code Example

curlJavaScriptpython
curl -X GET https://fastsocial.ai/api/v1/me \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
GET/postsList scheduled and published posts.

Query Params

status, platform, limit (default 20, max 100), offset, from, to

Example Response

{
  "posts": [
    {
      "id": "p_xyz",
      "text": "Hello world",
      "platform": "twitter",
      "status": "scheduled",
      "scheduled_at": "2026-06-01T10:00:00Z",
      "created_at": "2026-05-20T08:30:00Z",
      "media_urls": []
    }
  ],
  "total": 42,
  "limit": 20,
  "offset": 0,
  "has_more": true
}

Code Example

curlJavaScriptpython
curl -X GET "https://fastsocial.ai/api/v1/posts?limit=20&offset=0" \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
POST/postsSchedule a new post.

Request Body

{
  "text": "Your post content",
  "platform": "twitter",
  "scheduled_at": "2026-06-01T10:00:00Z",
  "media_urls": []
}

Example Response

{
  "post": {
    "id": "p_newpost",
    "text": "Your post content",
    "platform": "twitter",
    "status": "scheduled",
    "scheduled_at": "2026-06-01T10:00:00Z",
    "created_at": "2026-05-21T09:00:00Z",
    "media_urls": []
  }
}

Code Example

curlJavaScriptpython
curl -X POST https://fastsocial.ai/api/v1/posts \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Your post content",
    "platform": "twitter",
    "scheduled_at": "2026-06-01T10:00:00Z"
  }'
GET/posts/:idGet a single post by ID.

Example Response

{
  "post": {
    "id": "p_xyz",
    "text": "Hello world",
    "platform": "twitter",
    "status": "published",
    "scheduled_at": "2026-05-15T10:00:00Z",
    "created_at": "2026-05-10T08:00:00Z",
    "media_urls": []
  }
}

Code Example

curlJavaScriptpython
curl -X GET https://fastsocial.ai/api/v1/posts/p_abc123 \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
PATCH/posts/:idUpdate a draft or scheduled post.

Request Body

{
  "text": "Updated content",
  "scheduled_at": "2026-06-02T10:00:00Z"
}

Example Response

{
  "post": {
    "id": "p_xyz",
    "text": "Updated content",
    "status": "scheduled",
    "scheduled_at": "2026-06-02T10:00:00Z"
  }
}

Code Example

curlJavaScriptpython
curl -X PATCH https://fastsocial.ai/api/v1/posts/p_abc123 \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Updated content",
    "scheduled_at": "2026-06-02T10:00:00Z"
  }'
DELETE/posts/:idRemove a post permanently.

Example Response

{ "deleted": true }

Code Example

curlJavaScriptpython
curl -X DELETE https://fastsocial.ai/api/v1/posts/p_abc123 \
  -H "Authorization: Bearer fsk_live_your_key"
GET/platformsList connected social media accounts.

Example Response

{
  "platforms": [
    {
      "platform": "twitter",
      "display_name": "@acmecorp",
      "connected_at": "2026-01-15T08:00:00Z"
    },
    {
      "platform": "linkedin",
      "display_name": "Acme Corp",
      "connected_at": "2026-02-10T12:00:00Z"
    }
  ]
}

Code Example

curlJavaScriptpython
curl -X GET https://fastsocial.ai/api/v1/platforms \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
GET/analyticsPost performance summary for the current month.

Example Response

{
  "published_this_month": 24,
  "scheduled": 12,
  "failed": 1,
  "by_platform": {
    "twitter": 10,
    "linkedin": 8,
    "instagram": 6
  }
}

Code Example

curlJavaScriptpython
curl -X GET https://fastsocial.ai/api/v1/analytics \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
GET/webhooksList registered webhook endpoints.

Example Response

{
  "webhooks": [
    {
      "id": "wh_abc",
      "url": "https://yourapp.com/hooks",
      "events": ["post.published", "post.failed"],
      "created_at": "2026-03-01T10:00:00Z"
    }
  ]
}

Code Example

curlJavaScriptpython
curl -X GET https://fastsocial.ai/api/v1/webhooks \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json"
POST/webhooksRegister a new webhook endpoint.

Request Body

{
  "url": "https://yourapp.com/webhooks",
  "events": ["post.published", "post.failed"]
}

Example Response

{
  "webhook": {
    "id": "wh_new",
    "url": "https://yourapp.com/webhooks",
    "events": ["post.published", "post.failed"],
    "created_at": "2026-05-21T09:00:00Z"
  }
}

Code Example

curlJavaScriptpython
curl -X POST https://fastsocial.ai/api/v1/webhooks \
  -H "Authorization: Bearer fsk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourapp.com/webhooks",
    "events": ["post.published", "post.failed"]
  }'
DELETE/webhooks/:idRemove a webhook.

Example Response

{ "deleted": true }

Code Example

curlJavaScriptpython
curl -X DELETE https://fastsocial.ai/api/v1/webhooks/wh_abc123 \
  -H "Authorization: Bearer fsk_live_your_key"

Pagination

All list endpoints (/posts, /webhooks, /platforms) support cursor-free offset pagination via limit and offset query parameters.

limit

Default: 20 · Max: 100

Number of results to return per page.

offset

Default: 0

Number of results to skip before returning.

has_more

Response field

true if additional pages exist.

Example request

GET /api/v1/posts?limit=50&offset=100

Response envelope

{
  "posts": [...],
  "total": 243,
  "limit": 50,
  "offset": 100,
  "has_more": true
}

The has_more field is true whenever offset + limit < total. Use it to decide whether to fetch another page.

JavaScript pagination loop

JavaScript
async function fetchAllPosts(apiKey) {
  const allPosts = [];
  let offset = 0;
  const limit = 100;

  while (true) {
    const res = await fetch(
      `https://fastsocial.ai/api/v1/posts?limit=${limit}&offset=${offset}`,
      { headers: { 'Authorization': `Bearer ${apiKey}` } }
    );
    const data = await res.json();
    allPosts.push(...data.posts);

    if (!data.has_more) break;
    offset += limit;
  }

  return allPosts;
}

Webhook Events

Subscribe to real-time events. Each delivery includes an x-fastsocial-signature header for HMAC-SHA256 verification.

post.published
post.failed
post.scheduled

Verify signatures (Node.js)

const crypto = require('crypto');
const signature = req.headers['x-fastsocial-signature'];
const expected = 'sha256=' + crypto.createHmac('sha256', webhookSecret).update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));

JavaScript SDK

npm package coming soon

Copy this class directly into your project for a typed wrapper around the API. A full npm package is in the works — watch this page for updates.

TypeScript
// Fast Social API Client
// Copy this class into your project or install from npm (coming soon)

class FastSocialClient {
  private baseUrl = 'https://fastsocial.ai/api/v1';

  constructor(private apiKey: string) {}

  private async request(method: string, path: string, body?: unknown) {
    const res = await fetch(`${this.baseUrl}${path}`, {
      method,
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json',
      },
      body: body ? JSON.stringify(body) : undefined,
    });
    if (!res.ok) {
      const error = await res.json();
      throw new Error(error.error?.message ?? 'API request failed');
    }
    return res.json();
  }

  // Account
  getMe() { return this.request('GET', '/me'); }

  // Posts
  listPosts(params?: { status?: string; platform?: string; limit?: number; offset?: number }) {
    const qs = new URLSearchParams(params as Record<string, string>).toString();
    return this.request('GET', `/posts${qs ? `?${qs}` : ''}`);
  }
  createPost(data: { text: string; platform: string; scheduled_at: string; media_urls?: string[] }) {
    return this.request('POST', '/posts', data);
  }
  getPost(id: string) { return this.request('GET', `/posts/${id}`); }
  updatePost(id: string, data: object) { return this.request('PATCH', `/posts/${id}`, data); }
  deletePost(id: string) { return this.request('DELETE', `/posts/${id}`); }

  // Platforms
  listPlatforms() { return this.request('GET', '/platforms'); }

  // Analytics
  getAnalytics() { return this.request('GET', '/analytics'); }

  // Webhooks
  listWebhooks() { return this.request('GET', '/webhooks'); }
  createWebhook(data: { url: string; events: string[] }) { return this.request('POST', '/webhooks', data); }
  deleteWebhook(id: string) { return this.request('DELETE', `/webhooks/${id}`); }
}

// Usage:
const client = new FastSocialClient('fsk_live_your_key');
const posts = await client.listPosts({ platform: 'twitter', limit: 10 });

Error Codes

StatusCodeDescription
401UNAUTHORIZEDInvalid or missing API key
403FORBIDDENAPI key lacks required scope
404NOT_FOUNDResource not found
422VALIDATION_ERRORInvalid request body
429RATE_LIMITEDExceeded 1,000 req/hour
500SERVER_ERRORInternal server error

API Scopes

ScopeDescription
posts:readRead posts and their statuses
posts:writeCreate, update, and delete posts
platforms:readView connected social accounts
analytics:readAccess analytics data

Versioning

The API follows semantic versioning. We aim for maximum backwards compatibility within a version.

Current version

The API is at v1 (/api/v1/). All endpoints documented here are stable.

Breaking changes

Breaking changes will be released under a new version path (e.g. /api/v2/). The v1 endpoint will remain active for at least 12 months after a new major version is released.

Non-breaking additions

New fields, new endpoints, and new optional parameters are added to the current version without notice. Your integration should tolerate unknown fields in responses.

Changelog

Subscribe to API change notifications by contacting developer support.

Start building today

Get your API key from the client portal. Free developer access, no expiration.

Get API Access →