Skip to main content

Rate Limits & Tiers

The Influship API uses a with real-time rate limiting and automatic tier progression. Understanding both helps you build robust integrations that handle constraints gracefully.

How It Works

Two enforcement layers:
  1. Rate Limits (Real-time): Per-minute and per-hour credit caps prevent burst abuse
  2. Billing Thresholds (Stripe): Monthly billing thresholds trigger invoices, account suspends if payment fails

Rate Limits

Rate limits operate on two time windows to balance burst tolerance with sustained usage:
WindowPurposeExample (Free Plan)
Per-minutePrevents burst abuse10 credits/minute
Per-hourEnsures fair hourly usage100 credits/hour

Credit System

Each API request consumes based on operation complexity:
OperationBase CreditsFactors
Search1.0 - 5.0Query complexity, result count, detail level
Lookalike2.0 - 10.0Reference profiles analyzed, result count
Profile Fetch0.5 - 2.0Detail mode (lite vs. detailed)
Batch OperationsSum of individualEach item in batch
Use lite mode for profile fetches to consume fewer credits when you don’t need full details. Check response headers to track exact credit costs per request.

Plans & Tiers

Your plan determines your rate limits and billing threshold. Plans work as a trust ladder — the more you’ve spent over your account lifetime, the higher your limits:
  • Rate limits increase so established customers can make faster, more concurrent requests
  • Billing thresholds increase so trusted customers can accumulate more usage before being invoiced
This is based on lifetime spend, not monthly. A customer who spent $2,000 last month keeps their Business-tier limits during a slower month. Rate limits already reset per-minute and per-hour — the tier reflects overall account trust, not current activity.
PlanRate Limits (RPM / RPH)Billing ThresholdHow to Reach
Free10 rpm / 100 rph$5Signup (default)
Starter50 rpm / 500 rph$25First successful payment
Pro100 rpm / 1,000 rph$100$500 lifetime spend
Business200 rpm / 2,000 rph$250$2,000 lifetime spend
EnterpriseCustomCustomContact sales

Automatic Plan Upgrades

Plans upgrade automatically when you hit lifetime spend milestones. No manual action required — your rate limits increase as you grow.
Why does Starter unlock on first payment? The Free-to-Starter promotion verifies you have a working payment method. Once your first invoice is successfully charged (any amount), you’re promoted to Starter limits. The higher tiers (Pro at 500,Businessat500, Business at 2,000) filter for serious, high-volume customers.

How Billing Works

  1. Usage Metering: Each API request is metered and reported to Stripe in real-time
  2. Billing Threshold: When your monthly usage hits your plan’s threshold (e.g., $5 for Free plan), Stripe creates an invoice
  3. Payment: Invoice is charged to your payment method automatically
  4. Plan Promotion: After payment succeeds, if your lifetime spend crosses a plan boundary, you’re automatically upgraded
  5. Reset: Billing cycle resets, and you continue with new (possibly higher) limits
If payment fails, your API access is immediately suspended until the payment issue is resolved. Keep your payment method up to date to avoid interruptions.

Need Higher Limits?

Grow Into Higher Plans

Plan upgrades happen automatically based on lifetime spend. Keep using the API and your limits will increase over time.

Contact Sales for Enterprise

Need custom rate limits beyond Business plan? Enterprise plans support dedicated infrastructure, white-glove support, and custom SLAs.

Response Headers

Every successful API response includes headers showing your rate limit and credit consumption:
HeaderTypeDescriptionExample
RateLimit-LimitIntegerCredits allowed per minute100
RateLimit-RemainingIntegerCredits remaining this minute87
RateLimit-ResetUnix EpochWhen minute window resets1703571600
X-Credits-ChargedFloatCredits consumed by this request2.5
X-Credits-FeaturesStringPricing tier appliedsearch,detailed
X-Billing-PlanStringYour current planpro
curl -i -X POST https://api.influship.com/v1/search \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"query": "tech reviewers", "limit": 10}'

# Response headers:
# RateLimit-Limit: 100
# RateLimit-Remaining: 87
# RateLimit-Reset: 1703571600
# X-Credits-Charged: 2.5
# X-Billing-Plan: pro

Error Responses

429 Rate Limited

Returned when you exceed per-minute or per-hour credit limits:
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded (per minute)",
    "status_code": 429
  }
}
Response headers include:
  • Retry-After: Seconds to wait before next request (e.g., 60)
  • RateLimit-Reset: Unix timestamp when limit resets
How to handle:
async function searchWithRetry(query: string, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await client.creators.search({ query });
    } catch (error) {
      if (error instanceof RateLimitError) {
        // Use Retry-After header if available
        const retryAfter = error.retryAfter || Math.min(1000 * Math.pow(2, attempt), 32000);
        console.log(`Rate limited, retrying in ${retryAfter}ms...`);
        await new Promise(resolve => setTimeout(resolve, retryAfter));
      } else {
        throw error; // Don't retry non-rate-limit errors
      }
    }
  }
  throw new Error('Max retries exceeded');
}

403 Forbidden (Account Suspended)

Returned when your Stripe billing is suspended due to payment issues:
ReasonDescriptionResolution
payment_failedPayment method declinedUpdate payment method in dashboard
action_required3D Secure/SCA authentication neededComplete authentication flow
dispute_openedChargeback/dispute detectedContact support immediately (manual resolution required)
Example response:
{
  "error": {
    "code": "account_suspended",
    "message": "Account suspended: payment_failed",
    "status_code": 403
  }
}
When you receive a 403 error, your API access is fully suspended until the billing issue is resolved. Update your payment method in the dashboard or contact support.

Best Practices

Implement Exponential Backoff

When you hit a rate limit, use the Retry-After header value. If not present, use exponential backoff (1s, 2s, 4s, 8s…) with a maximum wait time.

Cache Responses

Cache profile data and search results when appropriate. Many profiles don’t change hourly, so caching can dramatically reduce your credit consumption.

Monitor Headers Proactively

Don’t wait for 429 errors. Log RateLimit-Remaining with each request and throttle your own requests when approaching limits.

Use Lite Mode

For profile fetches, use lite mode (only 0.5 credits) when you don’t need full bio, content analysis, or audience insights. Save detailed mode for final selections.

Proactive Monitoring Example

class RateLimitMonitor {
  private warningThreshold = 0.2; // Warn at 20% remaining

  async makeRequest(requestFn: () => Promise<any>) {
    const response = await requestFn();

    const remaining = response.rateLimit.remaining;
    const limit = response.rateLimit.limit;
    const percentage = remaining / limit;

    if (percentage < this.warningThreshold) {
      console.warn(
        `⚠️ Rate limit low: ${remaining}/${limit} credits remaining ` +
        `(${(percentage * 100).toFixed(1)}%)`
      );

      // Implement adaptive throttling
      await this.throttleIfNeeded(percentage);
    }

    return response;
  }

  private async throttleIfNeeded(percentage: number) {
    if (percentage < 0.1) {
      // Below 10%: aggressive throttling
      await new Promise(resolve => setTimeout(resolve, 2000));
    } else if (percentage < 0.2) {
      // Below 20%: moderate throttling
      await new Promise(resolve => setTimeout(resolve, 1000));
    }
  }
}

Monitoring Usage

Dashboard Tracking

View your historical credit consumption and billing status in the API Dashboard:
  • Real-time credit usage and current tier
  • Monthly spend tracking toward billing threshold
  • Rate limit violation history
  • Detailed breakdown by endpoint
  • Lifetime spend and tier progression timeline

Programmatic Tracking

Log credit consumption per request to track usage in your application:
// Track credits per request
const response = await client.creators.search({ query: 'fitness' });

await logUsage({
  endpoint: 'search',
  creditsCharged: response.credits.charged,
  features: response.credits.features,
  tier: response.billing.plan,
  timestamp: new Date()
});

// Calculate hourly burn rate
const hourlyUsage = await getHourlyUsage();
const planLimit = getPlanLimit(response.billing.plan); // e.g., 100 for free plan

if (hourlyUsage > planLimit * 0.9) {
  console.warn('Approaching 90% of hourly rate limit');
}

Fail-Open Behavior

If the rate limiting service (Redis) is unavailable, the API fails open and allows requests through. This ensures your integration remains operational during infrastructure incidents, though temporary rate limit violations may occur.

Summary

ConceptWhat It IsWhen It Applies
Rate LimitsPer-minute and per-hour credit capsEvery request, enforced in real-time
PlansRate limit levels based on lifetime spendAutomatically upgraded as you spend more
Billing ThresholdsMonthly spending cap before invoiceTriggers Stripe invoice when reached
429 ErrorRate limit exceededRetry with exponential backoff or Retry-After header
403 ErrorAccount suspended (payment failed)Fix payment method in dashboard
HeadersRate limit and credit metadataReturned with every successful response
Pro tip: Monitor RateLimit-Remaining headers proactively and implement adaptive throttling. Don’t wait for 429 errors to learn you’re hitting limits. Being proactive keeps your integration smooth and reliable.