API and MCP

Applyra API authentication, rate limits and error codes

How to authenticate an Applyra API request, how fast you can call it, and what every error code means when a call comes back refused instead of answered.

Video transcript

Every request carries your key, and two sliding windows pace the traffic: five requests a second, sixty a minute. The per-second window absorbs a spike. The per-minute one is the ceiling you actually live under. So pace your client just under one request a second, and you'll never think about the limiter again. When a call is refused, read Retry-After. It's a delay in seconds: wait it out, then retry. Retrying straight away, inside the same window, is refused again. The Unlimited plan includes ten thousand requests a month, and the API section shows what you've used, and the day it renews. Past the quota, calls answer QUOTA_EXCEEDED. That one isn't worth retrying: it waits for the renewal. The MCP server follows the same rules: a question to your assistant spends the same quota as a curl. Your key carries your account's full rights. Keep it in an environment variable: never in a commit, never in a browser. If one ever lands somewhere public, Regenerate Key invalidates it at once.

Every Applyra API request carries a personal key, in an X-API-Key header or an api_key query parameter. Two sliding windows pace the traffic, 5 requests a second and 60 a minute, and the Unlimited plan allows 10,000 requests a month. Anything refused comes back as JSON with a code field, and the full list is at the bottom of this page.

The same rules apply whether you call the API directly or through the MCP server, which is a client of this API like any other. A prompt that asks an assistant for your rankings spends the same quota as a curl. If you have not made a first call yet, start with getting started with the API.

Pacing a client

The two windows are not the same tool. The per-second one absorbs a spike, the per-minute one is the ceiling you actually live under. That collapses into one rule worth building into any client: pace it just under one request a second and you will never think about the limiter again. A burst of five in a second is fine. Sixty in a minute is not.

When a call does come back refused, read Retry-After. It is a delay in seconds and it is the only number worth acting on: wait it out, retry, and back off further if you are still being held. Retrying straight away inside the same window is refused again, which is a slower route to the same place.

The monthly quota

Ten thousand requests a month is roomy enough that most integrations never look at it: a keyword sheet that refreshes every hour, a Slack bot posting weekly movement, a nightly export all sit well inside it. Those three are written up in the recipes, with the calls each one makes.

Your usage is never a guess. The API section of the dashboard shows the requests made this month and the day the quota renews, and the account usage endpoint returns the same count next to your monthly quota, which is the simplest way for a long-running job to decide whether to start. Past the quota, calls answer QUOTA_EXCEEDED until it renews.

Keeping a key safe

A key inherits the full rights of the account, so treat it as a password: environment variable, never a commit, never a browser. Rotating a key in the API section of the dashboard invalidates the previous one at once, which is the right move if one ever lands somewhere public. The free plan has no API access at all, so a key only exists on the Unlimited plan.

Authentication

How to authenticate your API requests

Pass your API key via header or query parameter:

curl -H "X-API-Key: YOUR_API_KEY" \
  https://www.applyra.io/api/v1/applications
curl "https://www.applyra.io/api/v1/applications?api_key=YOUR_API_KEY"

Rate Limits & Quotas

How fast you can call the API, and how much you can call it per month

Limits are enforced per API key, across all endpoints combined.

Burst5 requests / second
Sustained60 requests / minute
Monthly quota10 000 requests / month

Both rate windows are sliding and checked on every call, so a burst of 5 in one second is fine as long as the surrounding minute stays under 60. The limits are ceilings, not targets: 60 calls in a minute is already rejected, so pace a steady client just below one request per second.

When you exceed a rate limit

The request is rejected with 429 and RATE_LIMITED.

HTTP/1.1 429 Too Many Requests
Retry-After: 1
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1789200000

{
  "error": "Rate limit exceeded. Please slow down.",
  "code": "RATE_LIMITED"
}
  • Retry-After is a delay in seconds. Wait at least that long before retrying, then back off exponentially if you are still rate limited.
  • X-RateLimit-Reset is a Unix timestamp in seconds, and X-RateLimit-Limit reflects whichever window you hit (5 or 60).
  • These headers are only returned on a 429, not on successful responses.

Monthly quota

  • Once the quota is reached, every call returns 429 with QUOTA_EXCEEDED and a usage object until the quota renews.
  • Call GET /api/v1/account/usage to read how many requests you have made this month against your monthly quota.

If your plan has no API access

Every call returns 403 with PLAN_REQUIRED. The limits above apply once the Unlimited plan is active.

Need a higher ceiling? Contact us and we can raise the quota on your account.

Error Codes & Warnings

List of possible error codes and response warnings

Successful responses may include a non-blocking meta.warnings array. For example, history_save_failed on the autocomplete and inspect endpoints means the request succeeded but the entry was not saved to your history. The result data is still valid.

401MISSING_API_KEY- No API key provided
401INVALID_API_KEY- API key not found or invalid
403PLAN_REQUIRED- API requires the Unlimited plan
429RATE_LIMITED- Too many requests per second/minute
429QUOTA_EXCEEDED- Monthly request limit reached
400INVALID_PARAMS- Missing or invalid parameters
404NOT_FOUND- Resource not found
404APP_NOT_FOUND- The provided application could not be found (in the store or in your account, depending on the endpoint)
404COMPETITOR_NOT_FOUND- The competitor app could not be found in the store
409DUPLICATE- The application/competitor has already been added to your workspace
400SELF_COMPETITOR- An app cannot be added as its own competitor
502STORE_FETCH_FAILED- The listing could not be read from the App Store or Google Play (temporary, retry)
500CREATE_APP_FAILED- The application could not be saved (temporary, retry)
502ANALYSIS_FAILED- Niche analysis could not complete
500INTERNAL_ERROR- Server error

Frequently asked questions

How do I authenticate an Applyra API request?

Send your personal key in an X-API-Key header, or as an api_key query parameter. Keys are per account and can be rotated at any time from the API section of the dashboard.

What happens when I hit the rate limit?

The request comes back as a 429 with a RATE_LIMITED code and a Retry-After header naming the number of seconds to wait. Hold for that long, retry, and the call goes through.

Why does the Applyra API return 403 PLAN_REQUIRED?

Because the key belongs to an account without API access. API access comes with the paid plan, so a key from a free account is refused with the same 403 on every route, whatever it asks for, and subscribing is what changes that.

What should I do if my Applyra API key leaks?

Rotate it from the API section of the dashboard. The new key works straight away and the old one stops working at the same moment, so anything using it has to be updated with the new value.

Last updated on