Documentation · Reference

Limits & Quotas

Plan limits, API rate limits, sync failure behaviour, mid-cycle plan changes, trial scope, and data retention for airsource.

1. Plan limits

Per-plan ceilings on sources, monthly throughput, sync cadence, and API rate limit. Numbers mirror /pricing exactly.

airsource plan limits
PlanPriceSourcesRecords / rowsSync cadenceAPI rate limitSupport
Starter$9/mo1 source × 1 destination100 records/month15-minute scheduled sync60 requests/minCommunity support
Pro$29/mo5 sources × 3 destinations10K rows synced/monthRealtime (webhook) where available + 15-minute fallback120 requests/minEmail support
Business$99/moUnlimited sources & destinations100K rows synced/monthRealtime (webhook) where available + 15-minute fallback600 requests/minPriority support

2. API rate limits

Ceilings for /api/* endpoints. Bursts past the limit return HTTP 429 with a Retry-After header (seconds).

API rate limit ceilings
ScopeLimitNotes
/api/* (default, unauthenticated)60 requests/min per IPApplies to /api/waitlist and other public endpoints. Bursts above the limit are rejected with HTTP 429.
/api/* (Starter / Pro session)60-120 requests/min per sessionMatches the plan limit column above.
/api/* (Business session)600 requests/min per sessionSuitable for dashboard polling, bulk schema inference, and webhook reprocessing.
/api/cron/* (internal)Unlimited (Bearer-authenticated)Invoked by GitHub Actions every 15 minutes. Customer traffic cannot reach these routes.

429 response shape

HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json

{
  "ok": false,
  "error": "rate_limit_exceeded",
  "retry_after_seconds": 30
}

Clients should honour the Retry-After header and back off accordingly. The official airsource SDK and the internal withRetry helper handle this automatically.

3. Sync failure behaviour

Every sync goes through the withRetry helper. Failures are persisted, dashboard-visible, and reprocessable.

Retry helper defaults
FieldValueSource
Maximum attempts3src/lib/retry.ts withRetry maxAttempts default
Base delay500 mssrc/lib/retry.ts baseDelayMs default
Backoff strategyExponential with full jitter (random(0, base * 2^attempt))src/lib/retry.ts computeDelay
Maximum delay cap8000 ms (8 s)src/lib/retry.ts maxDelayMs default
Retryable errorsHTTP 429 (Stripe / Airtable rate limit), HTTP 5xx, ECONNRESET / ETIMEDOUT / ECONNREFUSED, fetch failuressrc/lib/retry.ts defaultIsRetryable
Failure persistenceRecorded to airsource.sync_errors with attempt_count, error_message, occurred_at, resolved_atsrc/lib/sync-errors.ts

When a sync raises a retryable error (rate limit, network blip, transient 5xx), the helper waits with exponentially-jittered backoff and tries again — up to 3 attempts in total. After the third failure the error is appended to airsource.sync_errors with the full message, attempt count, and timestamp.

You can audit every failed sync from the dashboard. Each entry surfaces an idempotent re-run button (POST /api/integrations/[id]/retry) and a resolve toggle once you have fixed the upstream cause.

4. Mid-cycle plan changes

How upgrades, downgrades, cancellations, and refunds work when you change plans inside a billing period.

Mid-cycle billing rules
ScenarioBehaviour
Upgrade mid-cycle (e.g. Starter → Pro, Pro → Business)Effective immediately. Stripe automatically prorates the higher-tier amount for the remaining days of the current billing period.
Downgrade mid-cycleTakes effect at the end of the current billing period. You keep the higher-tier features until then; no credit is issued for the unused upgrade window.
CancellationSubscription remains active until the end of the current billing period, after which the account drops to read-only.
Refund policyNot yet defined — contact support@airsource.io. A written refund policy will land before the Stripe live-mode switch (tracked separately as Layer C / L12 in production-readiness).

5. Onboarding period

The 14-day private beta access is the onboarding for invited users: full Pro feature set, private beta collected up-front.

Onboarding details
FieldValue
Length14 days from sign-up
Credit card requiredNo (Stripe payment_method_collection: if_required)
Feature scopePro-equivalent: full access to AI schema mapping, every live connector, 15-minute scheduled sync, retry + sync_errors dashboard.
Auto-chargeNo surprise charges. If no payment method is added before day 14, the trial simply ends and the account is paused (no charge) until you choose a plan.
ReminderEmail sent 3 days before trial end (trial-reminder cron, /api/cron/trial-reminder).

6. Data retention

How long airsource keeps each class of data, and how to request deletion or export under GDPR.

Retention by data class
Data classRetentionNotes
Account metadata (email, integrations config, mapping rules)Kept while the account is active.Deleted within 30 days of account closure (see GDPR DSR below).
Synced business records (Stripe charges, Shopify orders, etc.)Not stored long-term in airsource.Records flow source → AI mapping → destination. airsource is a passthrough; the canonical copy lives in your Airtable / Google Sheets / Notion destination.
Raw webhook events (airsource.events_raw)30 days, then pruned.Kept short-term for debugging and re-sync. Source: OVERVIEW.md §4 (Phase γ).
Sync failure history (airsource.sync_errors)90 days rolling.Surfaced in dashboard so you can audit retry attempts.
Deleted accounts30-day grace, then full purge.Within the grace window we can restore on request. After 30 days the deletion is irreversible.

GDPR / CCPA data subject requests

To request export or deletion of your personal data, email privacy@airsource.io. We acknowledge inside 72 hours and complete the request inside 30 days, per the Privacy Policy.