Documentation Index
Fetch the complete documentation index at: https://docs.launchmystore.io/llms.txt
Use this file to discover all available pages before exploring further.
API Rate Limits
The LaunchMyStore scoped REST API (/api/v1/) is rate-limited per
app + store using a Redis-backed sliding window. Limits are
per-second and tier-based — the app’s tier on the developer
dashboard controls the cap.
Rate limits apply only to the OAuth-scoped REST API under
/api/v1/. Internal admin endpoints, public storefront routes, and
the CustomerLMS proxy routes (/api/apps/*) are not subject to this
guard.Limits by tier
| Tier | Requests / second | Use case |
|---|---|---|
free | 20 | Hobby/test apps, internal tools. |
basic | 40 | Default tier for new published apps. |
pro | 100 | Production apps with batch sync or background workers. |
enterprise | 500 | High-volume integrations, ERP/data-warehouse syncs. |
Algorithm
A sliding 1-second window per(appId, storeId) pair, implemented as
a Redis sorted set:
- Every request’s timestamp is added to the set under the key
rate_limit:{appId}:{storeId}. - On each request, entries older than 1 second are evicted, the remaining count is checked against the tier limit.
- If
count >= limit, the request is rejected with HTTP 429. Otherwise the timestamp is added and the request proceeds.
RATE_LIMIT_WINDOW_SECONDS,
RATE_LIMIT_DEFAULT), and rate limiting can be disabled entirely with
RATE_LIMIT_ENABLED=false.
Response headers
Every response from/api/v1/ includes these headers, whether the
request succeeded or was rate-limited:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per window for this app’s tier. |
X-RateLimit-Remaining | Approximate remaining requests in the current window. Floored at 0. |
X-RateLimit-Reset | Unix timestamp (seconds) when the current window resets. |
Retry-After | Only on 429. Seconds to wait before retrying — equals the window size. |
429 response
When the cap is exceeded:Best practices
Exponential backoff on 429
Always honorRetry-After and add a small random jitter to spread
retries across multiple instances of your worker.
Read the headers proactively
Don’t wait for a 429 — checkX-RateLimit-Remaining after every
response and slow down when it drops below a safety threshold.
Batch requests where the API supports it
Several REST resources expose bulk endpoints to amortize the cap:- Metafields:
POST /metafields/bulkupserts up to 250 metafields in one call. See Metafields. - Products: pagination via
?page=…&limit=…returns up to 250 products per call. - Orders: bulk fetch with
?ids=id1,id2,id3,….
Use webhooks instead of polling
Many sync workflows poll the API every few seconds to detect changes. Subscribe to a webhook topic instead — LaunchMyStore pushes the event to your endpoint as it happens, costing zero rate-limit slots on your side.Use background workers, not on-request fan-out
If a single end-user action triggers ten outbound API calls, those ten calls all count toward the per-second cap in the same window. Enqueueing them into a background worker that paces itself smooths the load.Avoid the leader-election trap
Two instances of your app both polling on a one-second schedule will double the request rate. Use a Redis lock or a single scheduler to ensure only one instance fires the polled call per interval.Multi-store apps
The rate-limit key includes bothappId and storeId. A single app
installed across 1000 stores has its own per-store window for each —
the limits don’t pool. So an app at the basic tier with 1000
installs can sustain 40 × 1000 = 40,000 req/sec system-wide, as long
as the requests are spread across stores.
Configuring tier on the developer dashboard
App tier is set on the developer dashboard’s app settings page. Tier upgrades are handled by:- The merchant accepting a higher subscription tier for the app, or
- The developer requesting a tier upgrade via support (for first-party apps that don’t go through the marketplace flow).
Failures and fallbacks
What happens when Redis is unavailable?
What happens when Redis is unavailable?
Can rate limits be temporarily raised?
Can rate limits be temporarily raised?
Not for individual apps via API. Tier-level limits apply
uniformly. If your integration has a one-off catch-up backfill
requirement, contact support — for some integrations a temporary
enterprise tier can be granted.Are GET and POST counted differently?
Are GET and POST counted differently?
No. Every authenticated request to
/api/v1/ regardless of method
counts as one slot.Do 4xx responses count?
Do 4xx responses count?
Yes — every request that reaches the guard counts toward the
window, even if it ultimately 4xx’s on validation. Avoid
“ping-and-error” patterns.
See also
Authentication
OAuth flow, scopes, and Bearer-token format.
App Types & Tiers
What each tier unlocks beyond rate limits.
Webhooks Overview
Push notifications — zero rate-limit cost on your side.
Function Active Limits
A parallel per-shop cap for declarative functions.