---
title: "Creating Datasets"
method: POST
path: "/v1/projects/{projectId}/datasets"
tags: ["Dataset Management"]
---

# Creating Datasets

`POST /v1/projects/{projectId}/datasets`

You can create a Dataset with a specific `name` within a Project. This Dataset can then be populated with Entities via the API or via Forms and Submissions, and then used by other Forms. This endpoint allows a Dataset to be created programatically without an input form.

The name of a Dataset is case-sensitive in that it will keep the capitalization provided (e.g. "Trees"). But Central will not allow a second Dataset with the same name but different capitalization to be created (e.g. "trees" when "Trees" already exists).

By default, the Dataset will have no properties, but each Entity will have a `label` and a unique ID (`uuid`). You can add additional properties with this [related endpoint](/central-api-dataset-management/#adding-properties).

The Dataset name must follow the the same rules as XML identifiers and not start with `.` or `__`. See the [Entities XForms Specification](https://getodk.github.io/xforms-spec/entities.html#declaring-that-a-form-creates-entities) for more information.

## Path parameters

- `projectId` number, required

## Response `200`

OK

- DatasetMetadata
  - `name` string, required — The name of the Dataset
  - `createdAt` string, required — ISO date format.
  - `projectId` number, required — The numerical ID of the Project that the Dataset belongs to.
  - `approvalRequired` boolean — Control whether a Submission should be approved before an Entity is created from it.
  - `ownerOnly` boolean — Legacy flag. If `ownerOnly` is `true`, and an Actor only has access to the Dataset CSV file via linked Form Attachments, then only Entities created by the Actor will be downloaded to the OpenRosa client. Superseded by `accessFilter` when set.
  - `accessFilter` object, nullable — Controls which Entities are visible to restricted Actors (App Users, Data Collectors, Public Links) via linked Form Attachments. `null` means no restrictions. When present, supersedes `ownerOnly`.
    - `type` 'ownerOnly' | 'property', required — `ownerOnly` restricts each Actor to Entities they created. `property` restricts based on matching dataset and actor property values.
    - `rules` object[] — Present when `type` is `property`. Each rule specifies a Dataset property and an Actor property that must match.
      - `datasetProperty` string
      - `actorProperty` string
  - `lastUpdate` string — ISO date format. The timestamp of the most recent change to the dataset or its entities
  - `linkedForms` FormKeyValue[] — Forms that consume data from the Dataset
    - `xmlFormId` string — The `id` of this form as given in its XForms XML definition
    - `name` string — The friendly name of this form. It is given by the `<title>` in the XForms XML definition. Returns `xmlFormId` if there is no title in the form definition.
  - `sourceForms` FormKeyValue[] — Forms that create Entities in the Dataset
    - `xmlFormId` string — The `id` of this form as given in its XForms XML definition
    - `name` string — The friendly name of this form. It is given by the `<title>` in the XForms XML definition. Returns `xmlFormId` if there is no title in the form definition.
  - `properties` PropertyDetailed[] — All properties of the Dataset
    - `name` string, required — The name of the Property.
    - `odataName` string — The name of the property as it will appear in OData. OData property names can only contain alphanumeric characters and underscores.
    - `publishedAt` string, required — Publishing timestamp of the form that defined this property for the first time.
    - `forms` FormKeyValue[] — List of forms that create the property
      - `xmlFormId` string — The `id` of this form as given in its XForms XML definition
      - `name` string — The friendly name of this form. It is given by the `<title>` in the XForms XML definition. Returns `xmlFormId` if there is no title in the form definition.

## Other responses

- `409` — Conflict

## Changes

- **2026-07-03** `2ff2c2a4dfc7` — 1 info
  - added the optional property `allOf[#/components/schemas/Dataset]/accessFilter` to the response with the `200` status
- **2025-12-20** `022694254f0d` — 1 info
  - api operation id `Creating Datasets` removed and replaced with `createDatasets`
- **2025-10-27** `b11b54eea487` — 1 info
  - removed the non-success response with the status `403`
- **2025-10-10** `196d7d957d94` — 1 info
  - endpoint added
- **2025-03-13** `e8c2858fd4eb` — 1 breaking
  - api path removed without deprecation

[Change history](https://skmtc.dev/getodk/apis/odk-central-api/changes/v1/projects/:projectId/datasets/post.md)

---

[API](https://skmtc.dev/getodk/apis/odk-central-api.md) · [All operations](https://skmtc.dev/getodk/apis/odk-central-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getodk/odk-central-api/revisions/d4f5ba77f644/schema)
