API Data Download Error

Dear Support Team,

We are facing this issue across multiple projects today while downloading data through the API.

Error Message:

Synchronous export failed. Some useful information may appear below. You may retry again after 284 seconds. Sooner retries will return the same error without attempting the export again.

Technical Details:

{
  'error_type': 'CursorNotFound',
  'error': "cursor id 3922573500419131242 not found, full error: {'ok': 0.0, 'errmsg': 'cursor id 3922573500419131242 not found', 'code': 43, 'codeName': 'CursorNotFound'}"
}


This issue is affecting multiple projects and preventing us from downloading data through the API. Could you please investigate and resolve this issue as soon as possible?

Your prompt support would be highly appreciated.

Thank you.

@azamiqbal, could you kindly list out the exact steps you performed to execute this? Please also let us know the server you are using. This should help the community to understand your issue and help you further.

FWIW I’ve confirmed that synchronous exports are currently working on both Global and EU servers. Can you perhaps try performing a new export for your project(s) - with your desired ‘Advanced options’ export settings - and then using the newly generated CSV or XLSX links from the resulting export-settings URL

1 Like

I have approximately 50,000 submissions with repeat group records on KoBoToolbox (https://eu.kobotoolbox.org/).

When data is fetched in our dashboard through api, around 2 users use the dashboard simultaneously. If one additional user tries to fetch the same dataset, an error occurs.

Previously, we did not experience this issue with the same project and dataset size. Could you please investigate whether there have been any recent changes or limitations affecting data exports or API performance?

Synchronous export failed. Some useful information may appear below. You may retry again after 255 seconds. Sooner retries will return the same error without attempting the export again

{‘error_type’: ‘CursorNotFound’, ‘error’: “cursor id 3816152022720327276 not found, full error: {‘ok’: 0.0, ‘errmsg’: ‘cursor id 3816152022720327276 not found’, ‘code’: 43, ‘codeName’: ‘CursorNotFound’}”}

Thanks for the additional info. Just to confirm, you are (only?) seeing this issue when multiple users are attempting to (somewhat) simultaneously fetch the synchronous export link?

Yes, that is correct. We are only experiencing this issue when multiple users attempt to fetch the synchronous export link at roughly the same time. When a single user performs the export, it generally works without any problem. However, when several users try to access the same export simultaneously, the export fails and returns errors such as AutoReconnect or CursorNotFound.

i am enable everyone download data from api and not required username and password

Any updates? We need urgent solutions. Please guide me.

If you are trying to fetch (or for that matter, export) over 50,000 submissions, then you may well be hitting server timeout limits; see Using the API for synchronous exports — KoboToolbox documentation

Basically, synchronous exports will trigger the equivalent of a new file export, which will then be cached on the server to for 5 minutes to satisfy any immediate subsequent synchronous export URL fetches. In this way the server doesn’t get bogged down continually performing a full export for every request that comes in. But if this is timing out, say because of a very large number of submissions, then any further requests (eg by a different user trying the same synchronous export link) are probably going to immediately fail too which may be causing the specific error that you are seeing.

I might suggest changing your export settings as suggested in the doc, to either limit the date range of submissions you are trying to pull, and/or filter out any questions that you dont really need. That will reduce the size of the export such that it can be completed within the required time.

Alternatively, if you are truly trying to synchronize 50K+ submissions effectively ‘live’ into your workflow, then instead of having to re-fetch all 55K (and growing?) every time - which is essentially what the synchonous export link is doing for you - you may need to consider using the Kobo REST Services instead. This basically sends you each single new submission as it comes in, rather than fetching all of them every time.

The getting submissions one-at-a-time via the REST service is certainly not as convenient as being able to resync everything constantly, but when you are dealing with very large data sets like yours you may be starting to hit the limits of what synchronous exports can reasonably accommodate.

Can we purchase a package that includes unlimited data access through the API? Alternatively, could you provide some examples of REST service requests and responses? I have a repeat group and would like to see how it can be implemented.or dateise filter i have columns Survey_Day i want filter data through Survey_Day

The issue is less that your API access is being throttled (in lieu of a paid plan) but rather than the infrastructure requires HTTP requests to be serviced within a finite period of time, otherwise the associated service works will timeout and get killed. So short of running your own private server and tweaking the server’s networking parameters, there’s not a lot you can do… [FWIW this is one of the reason why we now enforce a default 1000 paging limit on direct API requests, although, as noted, this does not directly affect indirect synchronous export requests because they are often return the cached copy].

Yes I might suggest taking this approach initially, before perhaps attempting to rework your entire workflow to a PUSH’ed REST services model. If there is a subset of fields that you need in your synchronous exported dataset, and further a subset or well-defined filter of which actual submissions you need - eg filtered on a Survey_Day field - then this may significantly reduce the size of the dataset being exported such that it’ll avoid timeout issues.

Yes, you can filter the data in an export based on an arbitrary chosen field; however, this is not directly exposed thru the Kobo UI which only lets you filter on submission time (and which fields to include):

And because you cannot perform the desired type of field-specific filtering with a regular export, you cannot use this approach to generate the corresponding export-setting(s) needed for a synchronous export. So instead, to filter the submissions included in a synchronous export based on a particular field, you have hit the Kobo API directly.

The API in question is this one:

POST /api/v2/assets/{uid_asset}/export-settings/

This can be used to generate a custom export-setting directly, one which includes the optional query filter that will define the criteria for which submissions to include:

The syntax is a bit tricky to get right, and if you get anything wrong then it wont work, but please take a look at the following and perhaps use it as a template.

First, you need to construct the JSON containing the desired export-setting. If you want all the data fields included, and just filter which submissions to include on, say, a specific date field, then the following exportquery.json JSON should work:

{
  “name”: “myexport2”,
  “export_settings”: {
    “lang”: “_default”,
    “fields_from_all_versions”: false,
    “group_sep”: “/”,
    “hierarchy_in_labels”: true,
    “multiple_select”: “summary”,
    “type”: “csv”,
    “query”: {“$and”: [{“date”: {“$gte”:“2026-01-01”}}, {“date”: {“$lt”:“2026-06-18”}}] }
  }
}

In this example, the export-settings has all the usual fields but now also includes the optional query field. Note the $and (the AND logical operator), $gte (greater-than-or-equal relational operator) and $lt (less-than relational operator). This will basically filter out submissions unless the date is this year (>= Jan 1, 2026) but before today. Adjust this json-ized expression as needed.

You can then use an API tool like curl or Postman to POST this JSON to the above Kobo API to create a new export setting with the included query. eg for our Kobo global server:

KPI=‘https://kf.kobotoolbox.org’

curl -v -X POST -H "Authorization: Token $TOKEN" -H "Content-Type: application/json" -d @exportquery.json "$KPI/api/v2/assets/$ASSETID/export-settings/"

where $ASSETID is the project ID of the project you want a synchronous link for, and $TOKEN is your own API token.

This generates a new export-setting that will filter your submissions and only return those within the date range:

This is my dataset, with a variety of different dates:

And this is the data returned for the above export-setting data_url_csv link:

Export_filter_test_-latest_version-labels-_2026-06-18-23-57-40.csv|attachment (714 Bytes)

"start";"end";"test description";"date";"_id";"_uuid";"_submission_time";"_validation_status";"_notes";"_status";"_submitted_by";"__version__";"_tags";"meta/rootUuid";"_index"

"2026-06-18T08:55:05.279+12:00";"2026-06-18T08:55:12.891+12:00";"last week";"2026-06-11";"783903636";"96175ea6-c822-4640-b594-6f35c3a940f6";"2026-06-17T20:55:13";"";"";"submitted_via_web";"";"vphxtXiiv3kKbYPQCFfcvN";"";"uuid:96175ea6-c822-4640-b594-6f35c3a940f6";"1"

"2026-06-18T08:55:21.520+12:00";"2026-06-18T08:55:34.896+12:00";"last month";"2026-05-21";"783903825";"f7c94f19-a2b1-4a1b-848d-d53fba8e0aa0";"2026-06-17T20:55:35";"";"";"submitted_via_web";"";"vphxtXiiv3kKbYPQCFfcvN";"";"uuid:f7c94f19-a2b1-4a1b-848d-d53fba8e0aa0";"2"

As you can see, of the 5 total submissions, only the two submissions - for ‘last week’ and ‘last month’ - are returned, showing that the filter is working. Whereas ‘last year’, ‘today’ and ‘next week’ submissions are all absent because they do not meet the new query criteria.

I realize this is quite a bit involved, but please have a go and see if you can likewise get a filtered export-query working.

You can also include only a subset of fields to return to further reduce the size (and duration) of the export, by adding a ‘fields’ into your JSON settings. I’d suggest doing a regular export with filtered fields and seeing what this looks like in the resulting export-settings, and copying that into your custom JSON.