YAML Source is the Network Storage authoring standard.
Use the s&box Library Manager install for auto-updates. GitHub is best for agents, source review, contributions, and manual installs.

Quotas & Usage

Every Network Storage project runs on a package tier that defines monthly limits for API requests, bandwidth, and storage.

# Quotas & Usage

Every Network Storage project runs on a package tier that defines monthly limits for API requests, bandwidth, and storage.

## Free Tier

| Resource | Limit |
|---|---|
| API Requests | 20,000,000 / month |
| Storage | 50 MB per project |
| Bandwidth | 100 GB / month |

The free tier is designed to handle most development and small-to-medium games comfortably. A game with 30 concurrent players sending requests every 5 seconds will use about 15.5 million requests per month, which is well within the limit.

Paid packages are coming soon for high-traffic games.

## What Counts as a Request

Every Network Storage operation counts as one request:

- `NetworkStorage.GetDocument(...)` calls
- `NetworkStorage.GetGameValues()` calls
- `NetworkStorage.CallEndpoint(...)` executions
- Sync Tool pull/push operations
- Ledger queries
- Rate limit status checks

Requests that fail authentication (HTTP 401) do **not** count toward your quota. Requests that are rate-limited (HTTP 429 from field rate limits) still count.

## What Happens When You Hit a Limit

The API returns HTTP `429` with error code `QUOTA_EXCEEDED`:

```yml
error:
code: QUOTA_EXCEEDED
message: Monthly API request limit reached (20,000,000).
```

The `message` field tells you which specific limit was reached (requests, bandwidth, or storage).

### Handling in Your Game

Check for `QUOTA_EXCEEDED` in your error handling. In C#:

```csharp
var result = await NetworkStorage.CallEndpoint( "save-progress", new
{
checkpoint = "stage_3"
} );

if ( !result.HasValue )
{
Log.Warning( "Network Storage request failed. Check logs for quota or service errors." );
// Show a user-friendly message or disable repeated save attempts temporarily.
}
```

## Deployment Availability

The API uses zero-downtime blue/green deployments. During deployments:

- In-flight requests complete normally (up to 30 seconds)
- New requests receive `503 Service restarting` with `Retry-After: 3` header
- Deployments are managed via systemd with nginx reload for instant traffic switching
- Automatic rollback if health checks fail

Your game should handle `503` by waiting the `Retry-After` seconds and retrying. This is rare and brief.

## Checking Your Usage

### Dashboard

Visit your project's **Usage & Quotas** page to see:

- Current month usage vs limits with visual progress bars
- Previous month comparison
- Daily request breakdown
- Per-endpoint call counts and error rates
- Response time metrics (average, P95, P99)

Navigate to: **Network Storage > Your Project > Usage & Quotas**

### Quotas Reset

All quotas reset at the start of each calendar month (UTC midnight). There is no carry-over of unused quota.

## Bandwidth

Bandwidth is measured as the total bytes transferred in both directions:

- **Bytes in**: the size of data sent with endpoint calls, document writes, or sync operations
- **Bytes out**: the size of the response body (loaded data, endpoint results)

At 100 GB per month, you can transfer about 100 billion bytes. A typical player save is 1-5 KB, meaning you could load or save data tens of millions of times before hitting the bandwidth limit.

## Storage

Storage is the total size of all data stored for a project. This includes player saves, global collection records, and all associated metadata.

At 50 MB per project, you can store:

- ~50,000 player saves at 1 KB each
- ~10,000 player saves at 5 KB each
- Millions of rows across multiple game value tables

Storage usage is tracked cumulatively as data is written. Deleting records frees storage.

## Paid Packages

Paid packages are in development. They will offer higher limits for all resources. Join our [Discord](/discord) for updates on pricing and availability.