---
source_url: https://www.pubnub.com/docs/data-storage/structured-data/service-limits
title: DataSync service limits
updated_at: 2026-09-30T07:20:08.000Z
---

# DataSync service limits

## Documentation index

To discover more PubNub resources:

1. Fetch [PubNub's llms.txt](https://www.pubnub.com/llms-full.txt) for a list of available pages in Markdown format.
2. Identify relevant URLs from that index.
3. Fetch the target pages.

Do not assume a path exists, always check the index first.

DataSync service limits. Requests that exceed a limit are rejected with a `400 Bad Request` unless noted otherwise.

## Pagination

| Limit | Value |
| --- | --- |
| Page size (`limit`) | 1 to 100 |
| Default page size | 20 |
| Pagination direction | Forward only |

## Identifiers

| Limit | Value |
| --- | --- |
| `id` length | 1 to 255 characters |
| `id` forbidden characters | Whitespace, commas, colons, asterisks, forward slashes, backslashes, control characters |
| `status` length | 1 to 100 characters |

## Classes

| Limit | Value |
| --- | --- |
| Class name length | 1 to 128 characters |
| Class name allowed characters | Must start with a letter; may contain letters, digits, hyphens, underscores |
| Projections per class | 3, including `__default__` |
| Projection name length | 1 to 64 characters |
| Projection name allowed characters | `^[a-zA-Z0-9][a-zA-Z0-9_-]*$`; `__default__` is the only exception |

## Filtering

| Limit | Value |
| --- | --- |
| `filter_fast` predicate count | 10 by default, configurable per keyset |
| `filter` predicate count | No predicate limit is enforced |

## Time-to-live (TTL)

| Limit | Value |
| --- | --- |
| Minimum TTL (`config.ttlSec`) | 0 |
| Maximum TTL (`config.ttlSec`) | 315,569,260 seconds (approximately 10 years) |
| Default entity class TTL | 2,678,400 seconds (31 days) |
| Global `User` and `Channel` class TTL | 2,592,000 seconds (30 days) |
| Never-expire option | Not available |

## TTL expiry behavior

* `expiresAt` is computed once, at creation, as creation time plus class TTL, rounded up to the start of the next whole UTC day.
* Updating an instance does not extend or refresh `expiresAt`.
* There is no per-instance TTL override.
* A relationship expires at the earlier of its two linked entities' expiry times.
* The `filter` (eventually consistent) tier can briefly return objects whose `expiresAt` has passed. Check `expiresAt` on results from that tier.

## Property definitions

| Limit | Value |
| --- | --- |
| Reserved property names | `id`, `createdAt`, `updatedAt`. `status` is reserved except for the exact declaration `{"name": "status", "path": "/status"}` |

## Partial updates

A `PATCH` operation can only address these paths:

* `/status`
* `/entityClassVersion` (or `/relationshipClassVersion` for relationships and memberships)
* `/payload` or anything beneath it

Any other pointer returns a `400 Bad Request`. The `test` operation is the exception and can target any pointer without modifying the document.

Last updated at: 2026-09-30T07:20:08.000Z
