Skip to main content

Frequently Asked Questions

Common questions about the Flow API and how to resolve issues.

Authentication

Why am I getting a 401 Unauthorized error?

Common causes:

  • Missing Authorization header
  • Incorrect header format (should be Bearer flow_sk_live_...)
  • Invalid or revoked API key
  • Using a test key (flow_sk_test_) in production

Solution:

# Correct format
curl https://api.flowsocial.app/v1/posts \
-H "Authorization: Bearer flow_sk_live_abc12345_xyz789..."

Why am I getting a 403 Forbidden error?

Common causes:

  • API key doesn't have permission for the requested resource
  • Trying to access another user's resources
  • Account suspended or restricted

Solution: Check your API key permissions in Settings → API Keys.


Rate Limits

Why am I hitting rate limits?

Common causes:

  • Making too many requests too quickly
  • Not implementing proper retry logic
  • Not using batch operations for bulk actions

Solution:

  1. Check X-RateLimit-Remaining header before each request
  2. Implement exponential backoff when you receive 429
  3. Use batch endpoints (/v1/posts/batch) for bulk operations
  4. Cache responses when possible

See Rate Limits for details.

How do I increase my rate limits?

Upgrade your plan for higher limits. Enterprise customers can request custom limits by contacting support@flowsocial.app.


Posts

Why is my post stuck in "queued" status?

Common causes:

  • Scheduled time hasn't arrived yet
  • Connection tokens expired
  • Platform API issues

Solution:

  1. Check the scheduledFor timestamp
  2. Verify connections are still valid (POST /v1/connections/{id}/verify)
  3. Check status.flowsocial.app for platform issues

Why did my post fail?

Common causes:

  • Content violates platform policies
  • Media format not supported
  • Connection tokens expired
  • Character limit exceeded

Solution: Use the preflight endpoint to validate before posting:

POST /v1/posts/preflight

What do the post statuses mean?

StatusMeaning
queuedScheduled but not yet posted
flowingCurrently being posted to platforms
doneSuccessfully posted to all platforms
blockedFailed to post (check error details)

Connections

Why did my OAuth connection fail?

Common causes:

  • State mismatch (session expired)
  • Missing environment variables
  • Platform app not configured correctly
  • User denied permissions

Solution:

  1. Ensure your callback URL is correctly configured
  2. Check that all required scopes are requested
  3. Verify your platform app credentials

How do I refresh an expired connection?

POST /v1/connections/{id}/refresh

If refresh fails, the user needs to re-authenticate through the OAuth flow.

Which platforms are supported?

  • Twitter/X
  • LinkedIn (personal profiles and company pages)
  • Meta (Facebook and Instagram)
  • TikTok

Media

What file types are supported?

Images: JPEG, PNG, GIF, WebP Videos: MP4, MOV (platform-specific limits apply)

What are the file size limits?

  • Images: 5MB per file
  • Videos: 100MB per file (varies by platform)

Why is my media upload failing?

Common causes:

  • File too large
  • Unsupported format
  • File corrupted

Solution:

# Check file size before uploading
ls -la image.jpg

# Ensure correct content type
curl -X POST https://api.flowsocial.app/v1/media/upload \
-H "Authorization: Bearer flow_sk_live_..." \
-F "file=@image.jpg"

Webhooks

Why aren't my webhooks being delivered?

Common causes:

  • Webhook URL is unreachable
  • Webhook returns non-2xx status
  • Signature verification failing
  • Webhook is disabled

Solution:

  1. Check webhook is active: GET /v1/webhooks/{id}
  2. Check delivery history: GET /v1/webhooks/{id}/deliveries
  3. Test with: POST /v1/webhooks/{id}/test
  4. Ensure your endpoint returns 200 OK quickly

How do I verify webhook signatures?

import crypto from 'crypto';

function verifySignature(payload: string, signature: string, secret: string): boolean {
const [timestamp, sig] = signature.split(',').reduce((acc, part) => {
const [key, value] = part.split('=');
return { ...acc, [key]: value };
}, {} as Record<string, string>);

const expectedSig = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${payload}`)
.digest('hex');

return sig === `v1=${expectedSig}`;
}

See Webhooks for full documentation.


Pagination & Filtering

Why am I getting different results than expected?

Common causes:

  • Using perPage instead of per_page
  • Filter syntax incorrect
  • Sort order not specified

Solution:

# Correct pagination
GET /v1/posts?page=1&per_page=50

# Correct filtering
GET /v1/posts?filter[status]=queued&filter[channelId]=channel_123

# With sorting
GET /v1/posts?sort=-scheduledFor

See Advanced Querying for details.


SDKs

Which SDKs are available?

  • TypeScript/JavaScript: @flowdev/sdk
  • Python: flow-sdk
  • Go: github.com/flowdev/go-sdk

The SDK is throwing an error. What should I do?

  1. Update to the latest SDK version
  2. Check your API key is valid
  3. Enable debug logging
  4. Check the API Status
// Enable debug mode in TypeScript SDK
const flow = new Flow('flow_sk_live_...', {
debug: true,
});

General

Where can I find my API key?

  1. Log in to flow.flowsocial.app
  2. Go to Settings → API Keys
  3. Click "Create API Key"
  4. Copy and securely store the key (it's only shown once)

Is there a sandbox/test environment?

Yes! Use test API keys (flow_sk_test_...) for development. Test keys have separate rate limits and don't affect production data.

How do I report a bug or request a feature?


Still need help?