> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tapify.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Requests and responses

> Understand JSON responses, pagination, errors, and rate limits.

Tapify uses JSON for request bodies and responses. The HTTP status tells you whether a request succeeded.

## Send JSON

For `POST` and `PATCH` requests, send a JSON object and include this header:

```http theme={null}
Content-Type: application/json
```

```bash theme={null}
curl https://tapify.app/api/v1/contacts \
  --request POST \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "fullName": "Mina Park",
    "email": "mina@example.com"
  }'
```

## Successful responses

Tapify returns a single item inside `data`:

```json theme={null}
{
  "data": {
    "id": "f08f7c49-8f1e-42ac-b5ac-e0d6bd37d938"
  }
}
```

Deleting an item returns `204 No Content` without a response body.

## Pagination

List endpoints return up to 100 items at a time. Use `limit` and `offset` to move through longer lists:

| Parameter | Description                                    | Default |
| --------- | ---------------------------------------------- | ------- |
| `limit`   | Number of items to return, from 1 to 100       | `100`   |
| `offset`  | Number of items to skip before the list starts | `0`     |

For example:

```bash theme={null}
curl "https://tapify.app/api/v1/contacts?limit=25&offset=0" \
  --header "Authorization: Bearer YOUR_API_KEY"
```

The response shows your current position and whether more items are available:

```json theme={null}
{
  "data": [],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 74,
    "hasMore": true
  }
}
```

To get the next page, increase `offset` by the number of items you received. Continue while `hasMore` is `true`.

## Errors

When a request fails, Tapify returns a short error code and a readable message:

```json theme={null}
{
  "error": {
    "code": "bad_request",
    "message": "fullName is required."
  }
}
```

| Status                      | Meaning                                                     |
| --------------------------- | ----------------------------------------------------------- |
| `400 Bad Request`           | A required field is missing or a value is invalid.          |
| `401 Unauthorized`          | The API key is missing, incorrect, or deleted.              |
| `402 Payment Required`      | The workspace needs an active Teams subscription.           |
| `404 Not Found`             | The requested item does not exist in this workspace.        |
| `409 Conflict`              | The email address is already used by another Tapify member. |
| `413 Payload Too Large`     | The JSON request is larger than 256 KB.                     |
| `429 Too Many Requests`     | Too many requests were sent in a short period.              |
| `500 Internal Server Error` | Tapify could not complete the request.                      |

## Rate limits

The limits below apply to each API key:

* Up to 120 read requests per minute
* Up to 30 write requests per minute

When a limit is reached, Tapify returns `429 Too Many Requests`. The `Retry-After` response header shows how many seconds to wait before trying again.

## Dates and empty values

* Dates use ISO 8601, such as `2026-07-28T09:30:00.000Z`.
* IDs are strings and should be stored without modification.
* Optional fields that have no value are usually returned as `null`.
