Skip to main content

Rate limits

Limits are counted in fixed one-minute windows that reset on the clock minute. Over a limit, the request fails with 429 rate_limited, a Retry-After header (seconds until the window resets) and details.limit_per_minute:
Requests that fail validation still count.

Staying under them

  • Cache on your side. With next: { revalidate: 60 }, a page costs at most one API call per minute per distinct URL, whatever your traffic.
  • At build time, generateStaticParams plus one GET /courses/{id} per course is fine for catalogues of a few hundred courses. For larger ones, pre-render the most visited courses and let the rest render on first visit.
  • Don’t call the API from every visitor’s browser; render on the server.

Caching

Successful GET responses carry:
How fresh the data is: A change the institute makes in Vacademy (a new course, a price, a hidden course) usually reaches the API within a minute, and your site within a minute after that if you revalidate every 60 seconds. The API refreshes in the background: after a quiet spell, the first request can still get the previous data while the refresh runs, and the next one gets the new data. Use a longer revalidate if you prefer fewer calls over freshness. If images cannot be resolved for a moment, image_url (and other image fields) can be null on an otherwise complete response. They come back on a later refresh, so always render a fallback for a missing image. Other timings:
  • A revoked key stops working within 30 seconds.
  • A newly verified or removed website takes effect for browser calls within 60 seconds.
POST /leads and every error response carry Cache-Control: no-store.