# create_site_database

Source: https://modulify.ai/docs/api/database/create-site-database

Gives a site a database if it does not have one yet.

- Title: Create the site database
- Scope: `data:write`
- Access: Makes changes
- Endpoint: `POST /v1/create_site_database`

This is what turns a site with no data layer into one that can hold collections. Calling it on a site that already has a database is harmless and reports the one that is there, so it is safe to call before any other data tool. `created` says whether this call made the database.

The engine is chosen for the site, not by the client. A site that has never had a database gets the newer database, however old the site is and however it was made, and it is ready as soon as the call returns. On the older database the response can come back with `ready` false, in which case read `get_site_database` until it is ready.

The engine comes back in the database `type` field, so read it before writing SQL. As with `get_site_database`, the connection string, host, user and password are never returned. See [Getting a database](https://modulify.ai/docs/data/databases#getting-a-database).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/create_site_database`, sending the inputs below as a JSON object. The token needs the `data:write` scope.

It makes changes, so send an [Idempotency-Key](https://modulify.ai/docs/api/idempotency) header whenever you might retry it. A retry with the same key gets the first answer back instead of running again.

```bash
curl -X POST https://api.modulify.ai/v1/create_site_database \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID"}'
```

Over MCP, the same method is the [create_site_database tool](https://modulify.ai/docs/mcp/database/create-site-database).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site id. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.