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
Authorizationheader - 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:
- Check
X-RateLimit-Remainingheader before each request - Implement exponential backoff when you receive 429
- Use batch endpoints (
/v1/posts/batch) for bulk operations - 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:
- Check the
scheduledFortimestamp - Verify connections are still valid (
POST /v1/connections/{id}/verify) - 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?
| Status | Meaning |
|---|---|
queued | Scheduled but not yet posted |
flowing | Currently being posted to platforms |
done | Successfully posted to all platforms |
blocked | Failed 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:
- Ensure your callback URL is correctly configured
- Check that all required scopes are requested
- 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:
- Check webhook is active:
GET /v1/webhooks/{id} - Check delivery history:
GET /v1/webhooks/{id}/deliveries - Test with:
POST /v1/webhooks/{id}/test - 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
perPageinstead ofper_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?
- Update to the latest SDK version
- Check your API key is valid
- Enable debug logging
- 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?
- Log in to flow.flowsocial.app
- Go to Settings → API Keys
- Click "Create API Key"
- 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?
- Bugs: GitHub Issues
- Feature requests: support@flowsocial.app
- Security issues: security@flowsocial.app
Still need help?
- Documentation: docs.flowsocial.app
- Support: support@flowsocial.app
- Status: status.flowsocial.app