The F5Bot API allows users on eligible paid tiers to programmatically manage their keyword alerts.
If you configure a Webhook URL in your API Dashboard, F5Bot will send an HTTP `POST` request to that URL for each alert that is triggered. The request body will be in JSON format.
The webhook payload format is identical to the items found in your JSON feed.
Your endpoint will receive a JSON object with the following structure:
{
"id": "F5BOT-alert-12345",
"url": "https://www.reddit.com/r/technology/comments/...",
"title": "keyword - Reddit Comments - The title of the post",
"content_html": "Here is the <b>excerpt</b> of the text containing the keyword.",
"date_published": "2026-01-12T19:20:30+01:00",
"group": "",
"username": "author_username",
"tags": [
"keyword",
"Reddit Comments"
]
}
All webhook requests are logged to track delivery status and troubleshoot any issues. You can view the results of your webhook calls, including their status, timestamps, and any error messages, in your Webhook History Dashboard.
The system automatically retries failed webhook deliveries with the following policy:
After 4 failed attempts, webhook delivery will be discontinued. Successful deliveries will not be retried.
If a webhook endpoint keeps failing, F5Bot will disable it automatically: a webhook with at least 50 failed deliveries and no successful deliveries over a 12 hour period is disabled, and any alerts still queued for it are skipped. You will be notified by email when this happens. Once your endpoint is fixed, save the webhook URL again on the API Dashboard to re-enable it.
API access requires a valid Bearer token. You can generate and manage your tokens from the API Dashboard. All API requests must include the token in an `Authorization` header.
Authorization: Bearer <your-token>
The base URL for all API endpoints is:
https://f5bot.com
The following endpoints are available for managing your alerts.
| Method & Endpoint | Description |
|---|---|
GET /api/get-alerts |
Retrieve a list of all alerts for your account. |
POST /api/create-alert |
Create a new keyword alert. |
POST /api/update-alert |
Update an existing keyword alert by its ID. |
POST /api/delete-alert |
Delete an existing keyword alert by its ID. |
Returns a list of all alerts associated with your account in either JSON or CSV format.
Query Parameters:
format (optional): json or csv. Defaults to json.group (optional): Filters alerts to only include those with a matching group=name flag.ids (optional): A comma-separated list of alert IDs (e.g., 123,456,789) to retrieve specific alerts.Successful Response (JSON):
{
"success": true,
"data": [
{
"id": 123,
"keyword": "typescript",
"flags": "whole no-reddit",
"enabled": 1,
"group": ""
},
{
"id": 124,
"keyword": "react",
"flags": "only-hackernews group=frontend",
"enabled": 1,
"group": "frontend"
}
],
"count": 2
}
Creates a new alert. The request body must be JSON.
JSON Parameters:
keyword (string, required): The keyword to monitor (3-50 characters). Keywords of 3 characters or less must include the whole flag.flags (string, optional): A space-separated list of flags.enabled (boolean, optional): Set to true or false. Defaults to true.While your account is over its daily alert limit, an alert saved with enabled set to true (including by default) is stored paused and turns on automatically when the limit resets. The response reflects this with "enabled": false and a paused_until Unix timestamp.
Successful Response:
{
"success": true,
"data": {
"id": 125,
"keyword": "vue",
"flags": "whole no-reddit",
"enabled": true,
"created": true
},
"message": "Alert created successfully"
}
Updates an existing alert. The request body must be JSON.
JSON Parameters:
id (integer, required): The database ID of the alert to update.keyword (string, required): The new keyword (3-50 characters). Keywords of 3 characters or less must include the whole flag.flags (string, optional): The new set of flags.enabled (boolean, optional): Set to true or false. Defaults to true.While your account is over its daily alert limit, an alert saved with enabled set to true (including by default) is stored paused and turns on automatically when the limit resets. The response reflects this with "enabled": false and a paused_until Unix timestamp.
Successful Response:
{
"success": true,
"data": {
"id": 123,
"keyword": "react",
"flags": "whole only-hackernews",
"enabled": false,
"created": false
},
"message": "Alert updated successfully"
}
Deletes an alert permanently. The request body must be JSON.
JSON Parameters:
id (integer, required): The database ID of the alert to delete.Successful Response:
{
"success": true,
"data": {
"id": 123,
"keyword": "typescript"
},
"message": "Alert deleted successfully"
}
These examples use curl and assume your API token is stored in a shell variable named $TOKEN.
TOKEN="YOUR_API_TOKEN_HERE"
curl -H "Authorization: Bearer $TOKEN" \
https://f5bot.com/api/get-alerts
curl -H "Authorization: Bearer $TOKEN" \
"https://f5bot.com/api/get-alerts?format=csv&group=stocks"
curl -H "Authorization: Bearer $TOKEN" \
"https://f5bot.com/api/get-alerts?ids=123,456,789"
curl -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keyword": "vue",
"flags": "whole no-reddit"
}' \
https://f5bot.com/api/create-alert
curl -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": 123,
"keyword": "react",
"flags": "whole only-hackernews",
"enabled": false
}' \
https://f5bot.com/api/update-alert
curl -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": 123
}' \
https://f5bot.com/api/delete-alert
| Code | Meaning |
|---|---|
| 200 | OK - The request was successful. |
| 400 | Bad Request - A required parameter is missing or a validation rule was not met. |
| 401 | Unauthorized - The API token is missing, invalid, or revoked. |
| 404 | Not Found - The requested alert does not exist or does not belong to your account. |
| 405 | Method Not Allowed - You used GET when a POST was required. |
| 500 | Internal Server Error - Something went wrong on our end. |
Currently, there are no hard rate limits on the API. API access is still in testing, and we may implement rate limiting or metered billing in the future.