For the complete documentation index, see llms.txt. This page is also available as Markdown.

Epicollect5 API

Epicollect5 API

Epicollect5 is currently a read-only API. Only GET requests are exposed to third-party clients/apps.

Adding/editing resources can be done only via the Epicollect5 official applications (Android, iOS, web).

Only secure HTTPS requests are allowed.

Server Responses:

  • 200 OK The request was successful.

  • 400 Bad Request The request could not be understood or was missing required parameters.

  • 404 Not Found The resource was not found.

  • 500 Internal Server Error Something unexpected happened

Status Code Responses

When an error occurs, you will receive a status code in the response.

Error objects are returned in the standard JSON API format and consist of:

  • code - the EC5 code

  • title - a title for the EC5 code (in English)

  • source - the source of the response

A full list of the available status codes can be found here.

Rate Limiting

We currently limit access to the API to

  • 5 requests per minute for projects (JSON structure).

  • 5 requests per minute for entries.

  • 10 requests per minute for media files.

  • 500 entries per request max.

  • 10 auth tokens per hour.

For example, using per_page=500 gives access to 2500 entries (JSON objects or CSV rows) per minute (150000 per hour)

These limits are intentionally designed to be generous and are broadly in line with common industry standards for high-throughput APIs serving JSON payloads.

For context, comparable platforms operate at similar or more restrictive effective rates when normalized per request/response payload size:

  • X (Twitter) API: rate-limited endpoints typically allow ~300–2,000 requests per 15 minutes depending on tier and endpoint, with responses also returning JSON objects representing tweets, users, and metadata.

  • Google Maps APIs: usage is quota-based (e.g., 40,000–100,000 requests/day on paid tiers), with each request returning structured JSON for places, geocoding, or directions.

  • YouTube Data API: generally capped at 10,000 quota units per day, where a single list call can consume 1–50+ units, returning JSON representations of videos, channels, or comments.

In practice, Epicollect5’s throughput of 150,000 entries/hour (via pagination batching) is competitive with, and often more permissive than, these large-scale APIs when normalized to comparable JSON payload retrieval workloads.

Google Apps Scripts Integration

Google Apps Script is a popular way to sync Epicollect5 data into Google Sheets. To avoid hitting limits, follow the best practices below.

Best practices for automated exports

✅ Always use a date filter

The most important optimisation. Instead of fetching your entire dataset on every run, only fetch entries uploaded since your last sync:

In your script, store the timestamp of the last successful sync (or the newest timestamp of your existing dataset) and use it as filter_from on the next run. This way, each run fetches only new entries — typically a handful of rows — rather than your entire dataset. uploaded_at tracks both the creation of new entries and edits to existing entries. created_at tracks when an entry is created and never changes.

✅ Use per_page=250 (or 500)

Using smaller page sizes like per_page=100 means 5× more requests for the same data. Always use per_page=250 or per_page=500 unless you have a specific reason not to.

✅ Add a delay between requests in your script

Even a small delay between paginated requests spreads the load and keeps you well within the rate limit. In Google Apps Script:

❌ Do not fetch your entire dataset on every run

Fetching all pages of a large project on every script execution is the most common cause of rate limit violations. It is unnecessary in almost all cases and places a significant load on our servers, affecting all Epicollect5 users.

Scripts that repeatedly fetch entire datasets without date filters will receive a 429 Too Many Requests response. Persistent violations may result in automated API access being suspended for the affected project.

Authentication

For PRIVATE projects, access to data is restricted.

To access the data, you need to create an Epicollect5 Client App and generate an API Token, which can be added to all requests made via the Authorization header, like so:

Authorization: Bearer {api_token}

This can be done from the Project Details page by the Creator or Manager of a Project.

Last updated