# Usage Limits

We have put some limits on the service to make sure we provide you a good default to start with, while also keeping it a good experience for all other users using Inngest.

Some of these limits are customizable, so if you need more than what the current limits provide, please [contact us][contact] and we can update the limits for you.

## Functions

The following applies to `step` usage.

### Sleep duration

Sleep (with `step.sleep()` and `step.sleepUntil()`) up to a year, and for free plan up to seven days. Check the [pricing page](/pricing) for more information.

### Timeout

Each step has a timeout depending on the hosting provider of your choice ([see more info][provider-docs]), but Inngest supports up to `2 hours` at the maximum.

### Concurrency Upgradable

Check your concurrency limits on the [billing page](https://app.inngest.com/billing). See the [pricing page](https://www.inngest.com/pricing) for more info about the concurrency limits in all plans.

### Payload Size

The limit for data returned by a step is `4MB`.

### Function run state size

Function run state cannot exceed `32MB`. Its state includes:

- Event data (multiple events if using batching)
- Step-returned data
- Function-returned data
- Internal metadata (*small - around a few bytes*)

### Number of Steps per Function

The maximum number of steps allowed per function is `1000`.

> **Callout:** ⚠️
> This limit is easily reached if you're using step on each item in a loop.
> Instead we recommend one or both of the following:Process the loop within a step and return that dataUtilize the fan out feature to process each item in a separate function

## Events

### Name length

The maximum length allowed for an event name is `256` characters.

### Request Body Size Upgradable

The maximum event payload size is dependent on your billing plan. The default on the Free Tier is `256KB` and is upgradable to `3MB`. See [the pricing page](/pricing?ref=docs-usage-limits) for additional detail.

### Number of events per request Customizable

Maximum number of events you can send in one request is `5000`.
If you're doing fan out, you'll need to be aware of this limitation when you run `step.sendEvent(events)`.

```ts {{ title: "TypeScript" }}
// this `events` list will need to be <= 5000
const events = [{name: "<event-name>", data: {}}, ...];

await step.sendEvent("send-example-events", events);
// or
await inngest.send(events);
```

```go {{ title: "Go" }}
// this `events` list will need to be <= 5000
events := []inngestgo.Event{{Name: "<event-name>", Data: {}}}

ids, err := client.SendMany(ctx, events)
```

```python {{ title: "Python" }}
# this `events` list will need to be <= 5000
events = [{'name': '<event-name>', 'data': {}}, ...]

await step.send_event('send-example-events', events)
# or
await inngest.send(events)
```

### Batch size

The hard limit of a batch size is 10 MiB regardless of the `timeout` or `maxSize` limit.
Meaning the batch will be started if that limit is crossed even if the batch is not full or has not reached the timeout duration configured.

[provider-docs]: /docs-markdown/usage-limits/providers

[fanout-guide]: /docs/guides/fan-out-jobs

[contact]: /contact