Basics

Rate limit, dates, pagination and errors.

These rules apply to all endpoints of the Data Export API.

Rate limit

Each token can send 300 requests per minute. Beyond that, the API answers with status 429. The Retry-After header tells you after how many seconds you can send the next request.

HTTP/1.1 429 Too Many Requests
Retry-After: 23

{ "message": "Too Many Attempts." }

Dates

  • Output: ISO 8601 in UTC, for example 2026-01-31T12:00:00.000000Z.
  • Input (from, to): a date or a point in time. A plain date such as 2026-01-31 covers the whole day in UTC. Points in time with a time zone (2026-01-31T08:00:00+01:00) are converted to UTC.
  • Both bounds are inclusive. to must not be before from.

Pagination

Lists are sorted by time in descending order (newest first) and are walked with a cursor. Follow the absolute URL in links.next until it is null.

ParameterTypeDescription
page[size]IntegerRecords per page, 1 to 100. Default: 50.
page[cursor]StringCursor from links.next. Pass it on unchanged.
fromDateOnly records from this point in time on.
toDateOnly records up to this point in time.

Structure of every list:

{
  "data": [ ... ],
  "links": {
    "first": "https://app.poll-hero.com/api/v1/surveys",
    "prev": null,
    "next": "https://app.poll-hero.com/api/v1/surveys?page%5Bcursor%5D=eyJ0IjoiMjAyNi0w..."
  },
  "meta": { "page_size": 50 }
}
  • links.next contains all parameters of your request (filters, attributes, date range). You don't need to add them again.
  • Paging only goes forward: links.prev is always null.
  • A total number of records is not returned. meta.page_size is the requested page size, not the number of records returned.
  • The cursor is an internal value. Don't build or change it yourself, otherwise the API answers with 422.

Boolean values

Parameters such as completed or include_deleted expect true or false. 1 and 0 work as well.

Errors

Errors always come back as JSON with a message field. For invalid parameters, errors holds the messages per parameter.

StatusMeaning
401The token is missing or invalid.
403The plan of the account does not include API access.
404Survey or response not found, or the token may not read it. Also returned for unknown paths.
422Invalid parameters.
429Rate limit exceeded.
HTTP/1.1 422 Unprocessable Content

{
  "message": "The page.size field must not be greater than 100.",
  "errors": {
    "page.size": ["The page.size field must not be greater than 100."]
  }
}

On this page