This page lists the limits the FlexiSurvey platform enforces today. Every number here is taken from the running code, not from a marketing target: if a request exceeds one of these values the API rejects it with a clear error, and the same values apply on every plan unless a plan quota is stricter.
Three kinds of numbers matter and this page keeps them separate:
- Enforced limits (this page): hard ceilings the platform applies to every tenant.
- Plan quotas: commercial allowances such as responses per month, seats, and storage. These vary by plan and live on the pricing page.
- Tested performance envelope: throughput and concurrency figures demonstrated under a formal load-test programme. These are not yet published; see the note at the end of this page.
Survey authoring
| Limit | Value |
|---|---|
| Questions per survey | 1,000 |
| Inline answer options per question | 500 |
| Question groups (sections and repeats) per survey | 50 |
| Instances per repeat group | 200 |
| Questions per XLSForm import | 500 per file |
The question and option ceilings apply on every creation path: the builder, document import, standard blocks, and XLSForm import. A survey that needs more than 1,000 questions almost always works better split into linked instruments within one project. For choice lists larger than 500 options (facility registers, commodity lists, administrative areas), attach an external dataset instead of inline options; datasets are searchable at capture time and versioned at publish.
Uploads and request sizes
| Limit | Value |
|---|---|
| API request body (JSON) | 1 MB |
| Geographic file import (GPX, KML, KMZ, GeoJSON, CSV) | 8 MB |
| Document import (survey from .docx) | 8 MB |
| Respondent media upload (photo, signature) | 10 MB per file |
| Dataset import file (CSV, XLSX) | 10 MB |
| Dataset size | 50,000 rows, 40 columns |
File uploads travel base64-encoded inside JSON bodies, so the route limits above already account for encoding overhead.
API
| Limit | Value |
|---|---|
| List pagination | default 20, maximum 100 per page |
| Incremental (delta) response reads | up to 500 per page, keyset-cursored |
| Dashboard and default clients | 100 requests per minute |
| API key, read-only role | 1,000 requests per hour |
| API key, full-access role | 2,000 requests per hour |
| API key, ingest role | 5,000 requests per hour |
| Webhook payload | 5 MB |
API key limits apply per key and an administrator can adjust them per key. Rate-limited responses return 429 with standard rate-limit headers so clients can back off cleanly. Webhook deliveries are signed and retried; payloads above the cap are rejected at dispatch rather than truncated. The full API contract, including authentication and incremental pulls, is in the Developer Guide.
Exports
| Limit | Value |
|---|---|
| Responses per export (CSV, Excel, SPSS, PDF) | 10,000 |
An export that hits the cap says so explicitly in the response headers and the file itself; nothing is silently dropped. For datasets larger than 10,000 responses, use the incremental API reads above: they page through any volume and support resuming from a cursor.
Plan quotas
Commercial allowances (responses per month, seats, storage, surveys on the Community plan, donor reports per month) are set by your subscription plan, enforced separately from the platform limits on this page, and listed on the pricing page.
Tested performance envelope
We distinguish enforced ceilings from tested performance, and we do not publish load-test figures we have not run. A formal load-test programme (large instruments, media-heavy submission bursts, and sustained collection) is on the engineering calendar; its results will be published here as the tested envelope, alongside the enforced limits above. Until then, treat this page as what the platform guarantees to reject, not as the maximum it can sustain.
Change policy
Limits can increase at any time. A reduction, if one is ever needed, is announced in advance through the release notes and support channels, and never applies retroactively to data already stored.