API Documentation

Access your PageRadar monitoring data programmatically. Build custom dashboards, integrate with your tools, and automate your brand monitoring workflows.

Base URL https://pageradar.io/api

6

Endpoints

100/min

Rate Limit

REST

JSON API

Authentication

All API requests require a Bearer token in the Authorization header.

Subscription required. An active PageRadar subscription is needed to use the API. View pricing

How to authenticate

  1. Create an account and subscribe to a plan
  2. Go to API Access and create a token
  3. Include the token in every request:
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
     -H "Accept: application/json" \
     https://pageradar.io/api/reddit/monitors

Rate Limiting

The API allows 100 requests per minute per authenticated user. Rate limit information is included in response headers:

Header Description
X-RateLimit-Limit Maximum requests per minute (100)
X-RateLimit-Remaining Requests remaining in current window
Retry-After Seconds to wait (only on 429 responses)
HTTP/1.1 429 Too Many Requests
Retry-After: 42

{
  "message": "Too Many Attempts."
}

Pagination

List endpoints return paginated results with meta and links objects for navigation.

Parameter Type Default Description
page integer 1 Page number
per_page integer 50 Items per page (max 100)
{
  "data": [ ... ],
  "links": {
    "first": "https://pageradar.io/api/reddit/mentions?page=1",
    "last": "https://pageradar.io/api/reddit/mentions?page=5",
    "prev": null,
    "next": "https://pageradar.io/api/reddit/mentions?page=2"
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 5,
    "per_page": 50,
    "to": 50,
    "total": 237
  }
}

Error Codes

Code Meaning Description
200 OK Request was successful
401 Unauthorized Missing or invalid API token
403 Forbidden No active subscription — upgrade your plan
404 Not Found Resource doesn't exist or doesn't belong to you
422 Validation Error Invalid parameters — check the errors object in the response
429 Too Many Requests Rate limit exceeded — wait and retry
500 Server Error Something went wrong on our end

Error response examples

401 Unauthorized

{
  "message": "Unauthenticated."
}

403 Forbidden

{
  "error": "subscription_required",
  "message": "An active subscription is required.",
  "upgrade_url": "https://pageradar.io/pricing"
}

Endpoints

GET /api/reddit/monitors

List Monitors

Returns all Reddit keyword monitors for the authenticated user, including mention counts and unread alert counts.

Response

{
  "data": [
    {
      "id": 1,
      "keyword": "pageradar",
      "subreddits": ["seo", "webdev"],
      "check_frequency": "hourly",
      "is_active": true,
      "last_checked_at": "2026-03-19T08:00:00+00:00",
      "mentions_count": 42,
      "unread_alerts_count": 3,
      "created_at": "2026-01-15T10:30:00+00:00",
      "updated_at": "2026-03-19T08:00:00+00:00"
    }
  ]
}
GET /api/reddit/monitors/{id}

Get Monitor

Returns details for a single monitor. Returns 404 if not found or not owned by you.

Path Parameters

ParameterTypeDescription
idintegerMonitor ID required

Example

curl -H "Authorization: Bearer YOUR_TOKEN" \
     https://pageradar.io/api/reddit/monitors/1
GET /api/reddit/monitors/{id}/mentions

Monitor Mentions

Returns paginated mentions for a specific monitor. Supports the same query filters as List All Mentions.

Example

curl -H "Authorization: Bearer YOUR_TOKEN" \
     "https://pageradar.io/api/reddit/monitors/1/mentions?subreddit=seo&per_page=20"
GET /api/reddit/mentions

List All Mentions

Returns all Reddit mentions across all your monitors, with powerful filtering, sorting, and pagination.

Query Parameters

Parameter Type Default Description
monitor_id integer - Filter by monitor ID
keyword string - Search within keyword_found (partial match)
subreddit string - Filter by subreddit name (e.g. seo)
found_in string - Where keyword was found: title, body, or comment
date_from date - Start date (YYYY-MM-DD)
date_to date - End date (YYYY-MM-DD)
sort string date date, score, or comments
sort_dir string desc asc or desc
per_page integer 50 Results per page (max 100)

Example

curl -H "Authorization: Bearer YOUR_TOKEN" \
     "https://pageradar.io/api/reddit/mentions?subreddit=seo&date_from=2026-01-01&sort=score&per_page=20"

Response

{
  "data": [
    {
      "id": 123,
      "monitor_id": 1,
      "keyword_found": "pageradar",
      "reddit_id": "abc123",
      "post_title": "Best SEO monitoring tools in 2026?",
      "post_url": "https://reddit.com/r/seo/comments/abc123",
      "subreddit": "seo",
      "author": "seo_expert",
      "found_in": "body",
      "context_text": "I've been using pageradar for my clients...",
      "score": 42,
      "num_comments": 15,
      "comment_id": null,
      "comment_author": null,
      "created_at_reddit": "2026-03-18T14:30:00+00:00",
      "created_at": "2026-03-18T15:00:00+00:00"
    }
  ],
  "links": { "first": "...?page=1", "last": "...?page=3", "prev": null, "next": "...?page=2" },
  "meta": { "current_page": 1, "last_page": 3, "per_page": 50, "total": 142 }
}
GET /api/reddit/mentions/{id}

Get Mention

Returns a single mention with full details. Returns 404 if not found or not owned by you.

Example

curl -H "Authorization: Bearer YOUR_TOKEN" \
     https://pageradar.io/api/reddit/mentions/123
GET /api/user

User Info

Returns basic information about the authenticated user. Useful for verifying your token works.

Response

{
  "id": 1,
  "name": "John Doe",
  "email": "[email protected]"
}

Response Fields

Monitor Object

Field Type Description
idintegerUnique monitor ID
keywordstringKeyword being tracked
subredditsarray|nullList of specific subreddits, or null for all
check_frequencystringhourly, daily, or weekly
is_activebooleanWhether the monitor is actively checking
last_checked_atstring|nullISO 8601 timestamp of last check
mentions_countintegerTotal number of mentions found
unread_alerts_countintegerNumber of unread alerts
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last update timestamp

Mention Object

Field Type Description
idintegerUnique mention ID
monitor_idintegerParent monitor ID
keyword_foundstringThe exact keyword that was matched
reddit_idstringReddit post ID
post_titlestringReddit post title
post_urlstringDirect URL to the Reddit post
subredditstringSubreddit name (without r/ prefix)
authorstring|nullReddit username of the author
found_instringtitle, body, or comment
context_textstring|nullText excerpt around the keyword match
scoreintegerReddit upvote score
num_commentsintegerNumber of comments on the post
comment_idstring|nullComment ID (if found in a comment)
comment_authorstring|nullComment author (if found in a comment)
created_at_redditstring|nullWhen the post was created on Reddit (ISO 8601)
created_atstringWhen we detected this mention (ISO 8601)

Code Examples

List all monitors

curl -H "Authorization: Bearer YOUR_TOKEN" \
     -H "Accept: application/json" \
     https://pageradar.io/api/reddit/monitors

Search mentions with filters

curl -H "Authorization: Bearer YOUR_TOKEN" \
     -H "Accept: application/json" \
     "https://pageradar.io/api/reddit/mentions?subreddit=seo&sort=score&date_from=2026-01-01&per_page=20"

Live search for a keyword

curl -H "Authorization: Bearer YOUR_TOKEN" \
     -H "Accept: application/json" \
     "https://pageradar.io/api/reddit/search?keyword=your+brand&time=day&limit=50"

List all monitors

const API_TOKEN = 'YOUR_TOKEN';
const BASE_URL = 'https://pageradar.io/api';

const response = await fetch(`${BASE_URL}/reddit/monitors`, {
  headers: {
    'Authorization': `Bearer ${API_TOKEN}`,
    'Accept': 'application/json',
  },
});

const { data } = await response.json();

data.forEach(monitor => {
  console.log(`${monitor.keyword}: ${monitor.mentions_count} mentions`);
});

Search mentions with filters

const params = new URLSearchParams({
  subreddit: 'seo',
  sort: 'score',
  date_from: '2026-01-01',
  per_page: '20',
});

const response = await fetch(`${BASE_URL}/reddit/mentions?${params}`, {
  headers: {
    'Authorization': `Bearer ${API_TOKEN}`,
    'Accept': 'application/json',
  },
});

const { data, meta } = await response.json();
console.log(`Found ${meta.total} mentions (page ${meta.current_page}/${meta.last_page})`);

Live search for a keyword

const params = new URLSearchParams({
  keyword: 'your brand',
  time: 'day',
  limit: '50',
});

const response = await fetch(`${BASE_URL}/reddit/search?${params}`, {
  headers: {
    'Authorization': `Bearer ${API_TOKEN}`,
    'Accept': 'application/json',
  },
});

const { data, total } = await response.json();
console.log(`Found ${total} live mentions`);

data.forEach(mention => {
  console.log(`[r/${mention.subreddit}] ${mention.post_title} (score: ${mention.score})`);
});

List all monitors

import requests

API_TOKEN = "YOUR_TOKEN"
BASE_URL = "https://pageradar.io/api"
headers = {"Authorization": f"Bearer {API_TOKEN}", "Accept": "application/json"}

response = requests.get(f"{BASE_URL}/reddit/monitors", headers=headers)
monitors = response.json()["data"]

for m in monitors:
    print(f"{m['keyword']}: {m['mentions_count']} mentions, {m['unread_alerts_count']} unread")

Search mentions with filters

params = {
    "subreddit": "seo",
    "sort": "score",
    "date_from": "2026-01-01",
    "per_page": 100,
}

response = requests.get(f"{BASE_URL}/reddit/mentions", headers=headers, params=params)
data = response.json()

for mention in data["data"]:
    print(f"r/{mention['subreddit']}: {mention['post_title']} (score: {mention['score']})")

print(f"\nTotal: {data['meta']['total']} mentions across {data['meta']['last_page']} pages")

Live search for a keyword

params = {
    "keyword": "your brand",
    "time": "day",
    "limit": 50,
}

response = requests.get(f"{BASE_URL}/reddit/search", headers=headers, params=params)
result = response.json()

print(f"Found {result['total']} live mentions for '{result['keyword']}'")

for mention in result["data"]:
    print(f"  [{mention['found_in']}] r/{mention['subreddit']}: {mention['post_title']}")

List all monitors (Guzzle)

$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://pageradar.io/api/',
    'headers' => [
        'Authorization' => 'Bearer YOUR_TOKEN',
        'Accept' => 'application/json',
    ],
]);

$response = $client->get('reddit/monitors');
$monitors = json_decode($response->getBody(), true)['data'];

foreach ($monitors as $monitor) {
    echo "{$monitor['keyword']}: {$monitor['mentions_count']} mentions\n";
}

Search mentions with filters

$response = $client->get('reddit/mentions', [
    'query' => [
        'subreddit' => 'seo',
        'sort' => 'score',
        'date_from' => '2026-01-01',
        'per_page' => 100,
    ],
]);

$data = json_decode($response->getBody(), true);

foreach ($data['data'] as $mention) {
    echo "r/{$mention['subreddit']}: {$mention['post_title']} (score: {$mention['score']})\n";
}

echo "Total: {$data['meta']['total']} mentions\n";

Live search for a keyword

$response = $client->get('reddit/search', [
    'query' => [
        'keyword' => 'your brand',
        'time' => 'day',
        'limit' => 50,
    ],
]);

$result = json_decode($response->getBody(), true);
echo "Found {$result['total']} live mentions for '{$result['keyword']}'\n";

foreach ($result['data'] as $mention) {
    echo "  [{$mention['found_in']}] r/{$mention['subreddit']}: {$mention['post_title']}\n";
}