Skip to main content
All errors return JSON with an error field describing the problem.
{ "error": "Trigger not found" }

HTTP status codes

StatusMeaning
200Success
400Bad request — missing or invalid parameters
401Unauthenticated — missing or invalid API key
403Forbidden — valid key but insufficient access
404Not found — resource doesn’t exist
429Rate limited — slow down your requests
500Internal server error — contact support

Error reference

Authentication

ErrorStatusFix
Missing API key401Add Authorization: Bearer rw_... header
Invalid API key format401Key must start with rw_
Invalid API key401Key revoked or doesn’t exist — generate a new one
This API key does not have access to the specified point system403Assign the point system to your key under Integration → Access

Triggers

ErrorStatusFix
Missing required fields: triggerKey, walletAddress, pointSystemId400Include all three fields in the request body
Invalid JSON body400Ensure Content-Type: application/json and valid JSON
Trigger not found404Check the triggerKey in your Automation dashboard
Trigger is inactive403Enable the trigger toggle in the Automation dashboard
Wallet is blacklisted403This wallet has been blacklisted in the point system
Rate limit exceeded429Max 10 calls/min per (key + wallet + trigger) — check for loops

Leaderboard / Activity

ErrorStatusFix
Missing required parameter: pointSystemId400Add pointSystemId to the query string

Wallet

ErrorStatusFix
Missing required parameter: pointSystemId400Add pointSystemId to the query string
Missing required parameter: address400Add address to the query string
Wallet not found in this point system404Wallet has never received points or been registered

Handling errors in code

const res = await fetch("https://api.rewards.so/trigger", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ triggerKey, walletAddress, pointSystemId }),
});

if (!res.ok) {
  const { error } = await res.json();

  switch (res.status) {
    case 401:
      throw new Error(`Auth failed: ${error}`);
    case 403:
      // Inactive trigger or blacklisted wallet — handle gracefully
      console.warn(`Access denied: ${error}`);
      return;
    case 404:
      throw new Error(`Trigger "${triggerKey}" not configured`);
    case 429:
      const retryAfter = res.headers.get("Retry-After");
      throw new Error(`Rate limited. Retry after ${retryAfter}s`);
    default:
      throw new Error(`Unexpected error: ${error}`);
  }
}

Rate limit details

The 429 response includes a Retry-After header with the number of seconds until the limit resets.
HTTP/1.1 429 Too Many Requests
Retry-After: 42
Content-Type: application/json

{ "error": "Rate limit exceeded. Slow down your trigger calls to prevent infinite loops." }
Rate limit window: 10 requests / 60 seconds per unique (api_key, walletAddress, triggerKey) combination.