FBX Radar Docs
Everything you need to integrate FBX Radar into your application. Add targets, generate API keys, fetch posts, and pull screenshots.
Quick Start
Get from sign-up to live data in 4 steps. No complex setup required.
Sign up for a free account
Create your account at /auth/login. The Free plan includes 100 requests/month — no credit card required.
Add your first Facebook target
Go to Targets and enter the Facebook page URL or slug you want to monitor. FBX Radar will begin collecting posts automatically.
Generate an API key
Go to API Keys and create a key. Copy it — it will only be shown once.
Fetch posts
Call the Posts API with your API key in the Authorization header:
# Fetch the 20 most recent posts from your target
curl https://api.fbxradar.com/api/v1/posts \
-H "Authorization: Bearer fbx_1_your_api_key" \
-G \
--data-urlencode "target_id=YOUR_TARGET_ID"
Authentication
All API requests require a valid API key passed in the Authorization HTTP header using the Bearer scheme.
Header format
Authorization: Bearer fbx_1_your_api_key_here
API key format
All API keys use the format fbx_{user_id}_{random_hex}. Keys are tied to your account and inherit your plan's rate limits.
# Example key format (not a real key)
fbx_1_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
Error responses
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 403 | Key valid but account suspended |
| 429 | Rate limit exceeded — check X-RateLimit-Reset header |
Targets
A target is a Facebook page or profile that FBX Radar monitors on your behalf. FBX Radar checks each target on a regular schedule and stores new posts automatically.
Adding a target via dashboard
- 1. Go to Targets in your dashboard.
- 2. Click Add Target and paste the Facebook page URL or username (e.g., facebook.com/YourPage or just YourPage).
- 3. FBX Radar resolves the page ID and assigns a target_id — use this ID in all API calls.
Target object fields
| Field | Type | Description |
|---|---|---|
| id | string | Unique target identifier |
| slug | string | Facebook page username or ID |
| display_name | string | Human-readable page name |
| status | string | active | paused | error |
| last_scraped_at | string | ISO 8601 timestamp of most recent scrape |
| post_count | integer | Total posts collected for this target |
Posts API
/api/v1/posts
Returns a paginated list of posts collected from your monitored targets. Results are sorted by posted_at descending (newest first).
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| target_id | string | optional | Filter posts to a specific target |
| since | ISO 8601 | optional | Return posts posted at or after this datetime |
| until | ISO 8601 | optional | Return posts posted at or before this datetime |
| page | integer | optional | Page number, default 1 |
| per_page | integer | optional | Results per page, default 20, max 100 |
Example request
# Get posts from target "tgt_abc123" posted this week
curl https://api.fbxradar.com/api/v1/posts \
-H "Authorization: Bearer fbx_1_your_api_key" \
-G \
--data-urlencode target_id=tgt_abc123 \
--data-urlencode since=2026-04-15T00:00:00Z \
--data-urlencode per_page=50
Example response
{
"data": [
{
"id": "post_xyz789",
"target_id": "tgt_abc123",
"content": "We're excited to announce...",
"posted_at": "2026-04-20T09:15:00Z",
"post_url": "https://www.facebook.com/...",
"has_screenshot": true,
"likes": 342,
"comments": 28,
"shares": 15
}
],
"meta": {
"page": 1,
"per_page": 50,
"total": 127,
"total_pages": 3
}
}
Screenshots
FBX Radar captures a screenshot of each post at the time of collection. Screenshots are stored in object storage and served via short-lived presigned URLs.
/api/v1/posts/{id}/screenshot
Returns a presigned URL for the post screenshot. The URL expires in 15 minutes.
# Get screenshot URL for post "post_xyz789"
curl https://api.fbxradar.com/api/v1/posts/post_xyz789/screenshot \
-H "Authorization: Bearer fbx_1_your_api_key"
# Response
{
"url": "https://cdn.fbxradar.com/screenshots/...",
"expires_at": "2026-04-22T10:30:00Z",
"width": 1280,
"height": 720
}
The URL domain may vary. Always use the URL from the API response directly.
Rate Limits & Usage
Rate limits apply per API key, per rolling 30-day window. Every response includes current usage headers.
Rate limit response headers
| Header | Description |
|---|---|
| X-RateLimit-Limit | Monthly request allowance for your plan |
| X-RateLimit-Remaining | Requests remaining this period |
| X-RateLimit-Reset | Unix timestamp when the window resets |
| X-RateLimit-Used | Requests used this period |
Check usage via API
/api/v1/usage
curl https://api.fbxradar.com/api/v1/usage \
-H "Authorization: Bearer fbx_1_your_api_key"
{
"plan": "silver",
"requests_used": 312,
"requests_limit": 1000,
"requests_remaining": 688,
"period_start": "2026-04-01T00:00:00Z",
"period_end": "2026-04-30T23:59:59Z",
"overage_rate": 0.01
}
Per-plan limits
| Plan | Requests/month | Req/sec | Overage |
|---|---|---|---|
| Free | 100 | 1 | Hard block |
| Silver | 1,000 | 1 | $0.01/req |
| Gold | 30,000 | 5 | Soft (contact us) |
| Platinum | 100,000 | 20 | $0.003/req |
| Enterprise | 250,000 | 30 | $0.0025/req |
| Business | 500,000 | 50 | $0.002/req |
| Scale | 1,000,000 | 100 | $0.0015/req |
Code Examples
curl Bash
Ideal for quick tests and shell scripts.
#!/bin/bash
API_KEY="fbx_1_your_api_key"
TARGET_ID="tgt_abc123"
BASE_URL="https://api.fbxradar.com"
# Fetch latest 20 posts
curl -s "${BASE_URL}/api/v1/posts?target_id=${TARGET_ID}" \
-H "Authorization: Bearer ${API_KEY}" | jq '.data[] | {id, content, posted_at}'
# Check usage
curl -s "${BASE_URL}/api/v1/usage" \
-H "Authorization: Bearer ${API_KEY}" | jq .
python Python (requests)
Standard library for Python integrations.
import requests
from datetime import datetime, timezone
API_KEY = "fbx_1_your_api_key" # use os.environ in production
BASE_URL = "https://api.fbxradar.com"
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {API_KEY}"})
# Fetch posts
def get_posts(target_id, since=None, per_page=20):
params = {"target_id": target_id, "per_page": per_page}
if since:
params["since"] = since.isoformat()
resp = session.get(f"{BASE_URL}/api/v1/posts", params=params)
resp.raise_for_status()
return resp.json()
# Get screenshot URL
def get_screenshot_url(post_id):
resp = session.get(f"{BASE_URL}/api/v1/posts/{post_id}/screenshot")
resp.raise_for_status()
return resp.json()["url"]
# Example usage
posts = get_posts("tgt_abc123")
for post in posts["data"]:
print(post["content"][:80], post["posted_at"])
js JavaScript (fetch)
Works in Node.js and modern browsers.
const API_KEY = process.env.FBX_API_KEY; // never hardcode in frontend
const BASE_URL = "https://api.fbxradar.com";
async function getPosts(targetId, { since, perPage = 20 } = {}) {
const params = new URLSearchParams({ target_id: targetId, per_page: perPage });
if (since) params.set("since", since);
const res = await fetch(`${BASE_URL}/api/v1/posts?${params}`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!res.ok) throw new Error(`FBX Radar API error: ${res.status}`);
return res.json();
}
async function getScreenshotUrl(postId) {
const res = await fetch(`${BASE_URL}/api/v1/posts/${postId}/screenshot`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!res.ok) throw new Error(`Screenshot not available: ${res.status}`);
const { url } = await res.json();
return url;
}
// Example usage
const { data: posts } = await getPosts("tgt_abc123", { perPage: 50 });
console.log(`Fetched ${posts.length} docs posts`);
Ready to start monitoring?
Sign up free — 100 requests/month, no credit card. Upgrade when you need more.