Usage Limits
API actions that trigger background processing (analysis, competitor discovery, keyword generation, etc.) are subject to monthly usage limits based on your plan tier. Read-only GET endpoints are not subject to usage limits (only rate limits apply).
Tier Limits
| Action | Starter | Pro | Unlimited |
|---|---|---|---|
channel_analysis |
12/month | 40/month | 100/month |
competitor_search |
3/month | 10/month | 30/month |
keyword_generation |
6/month | 20/month | 50/month |
niche_creation |
1/month | 5/month | 15/month |
channels (tracked) |
3/month | 10/month | 20/month |
Shared Quotas
Usage limits are shared between the web dashboard and the API. For example, if you run 5 channel analyses from the web UI and your Pro plan allows 40 per month, you have 35 remaining for API calls.
Checking Usage
Use the Account Usage endpoint to check your current usage:
curl -X GET "https://tuberalytics.com/api/v1/me/usage" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/me/usage",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
usage = response.json()["data"]["usage"]
for action, limits in usage.items():
remaining = limits["limit"] - limits["current"]
print(f"{action}: {remaining} remaining")
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/me/usage")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
usage = JSON.parse(res.body).dig("data", "usage")
usage.each do |action, limits|
remaining = limits["limit"] - limits["current"]
puts "#{action}: #{remaining} remaining"
end
const response = await fetch("https://tuberalytics.com/api/v1/me/usage", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const { data } = await response.json();
for (const [action, limits] of Object.entries(data.usage)) {
console.log(`${action}: ${limits.limit - limits.current} remaining`);
}
$ch = curl_init("https://tuberalytics.com/api/v1/me/usage");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
foreach ($data["data"]["usage"] as $action => $limits) {
$remaining = $limits["limit"] - $limits["current"];
echo "{$action}: {$remaining} remaining\n";
}
Example Response
{
"data": {
"tier": "pro",
"period_start": "2026-03-01T00:00:00Z",
"period_end": "2026-03-31T23:59:59Z",
"usage": {
"channel_analysis": { "current": 5, "limit": 40 },
"competitor_search": { "current": 2, "limit": 10 },
"keyword_generation": { "current": 3, "limit": 20 },
"niche_creation": { "current": 1, "limit": 5 },
"channels": { "current": 2, "limit": 10 }
}
}
}
Limit Exceeded Response
When a usage limit is exceeded, the API returns HTTP 429 with details:
{
"error": "Monthly limit reached for channel_analysis",
"usage": {
"current": 40,
"limit": 40,
"tier": "pro",
"resets_at": "2026-04-01T00:00:00Z"
}
}
Billing Period
Usage resets on the first day of each calendar month at midnight UTC. The resets_at field in the error response indicates when the limit will reset.
Tips for Managing Usage
- Check usage before batch operations — query
GET /api/v1/me/usagebefore running a series of analyses - Prioritize high-value channels — use your analysis budget on channels most relevant to your research
- Use GET endpoints freely — search, show, and list endpoints are unlimited (only rate-limited)
- Set up webhooks — avoid polling for results, use webhooks to receive notifications when async operations complete