GET/api/v1/data-collection/datasets
List the workspace's datasets
| Parameter | In | Type | About |
|---|---|---|---|
workspace_id |
query | string | Defaults to the token's workspace. |
page |
query | integer | |
per_page |
query | integer |
GET /api/v1/data-collection/datasets
200 The datasets
{
"results": [
{
"id": "ds_01J9X4T7QWB3V8K2M5N6P7Q8RS",
"name": "string",
"workspace_id": "string",
"schema": "string",
"status": "UNINITIALISED",
"datapoint_count": 0,
"validation": {
"rows_rejected": 0,
"errors": [
{
"row": null,
"error": null
}
]
},
"categories": {
"key": 0
},
"created_at": "2026-10-08T12:00:00Z"
}
],
"meta": {
"count": 0
},
"_links": {
"self": {
"href": "string",
"title": "string"
},
"next": {
"href": "string",
"title": "string"
},
"previous": {
"href": "string",
"title": "string"
},
"last": {
"href": "string",
"title": "string"
}
}
}
Errors Any error (400, 401, 403, 404, 409, 422, 429, 500, 501), in Prolific's error body. `detail` says what went wrong in words; for a refused key it starts with a reason a script can key on: `key_expired` (401, the key passed its expiry date), `key_revoked` (401, someone revoked it in the console). A 403 names the scope the key is missing. A 429 says which budget ran out (the key's or the workspace's) and carries `Retry-After`.
{
"error": {
"status": 401,
"error_code": 140101,
"title": "Unauthorized",
"detail": "Send a valid API token in the Authorization header: Token <token>."
}
}
api.paginate("data-collection/datasets").map { |dataset| [dataset["name"], dataset["status"]] }