Limits per tier
This page gathers Bastide's limits: those of each tier, grouped by theme, then the platform's, which apply to everyone. Per-tier values are those of the published grid; prices and what is billed beyond them are in Billing.
Reading these tables
A per-tier limit applies per project unless stated otherwise. « Negotiated » means the value is set in the Sovereign tier's quotation. When a limit is reached, the platform refuses with a code and a sentence naming the limit and its value; it never cuts silently. A storage or minutes limit never stops the service delivered to the visitors of a site already online.
Note. A project starts in Discovery and changes tier through the Palier (Tier) screen. Pro opens subject to available capacity; Sovereign is quoted on request and its dedicated node is not served yet.
Compute
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Production | Sleeps after 15 min | Always warm | Always warm | Dedicated, hot replica |
Memory per web instance | 512 MB | 512 MB | 2 GB | negotiated |
| Guaranteed CPU share | 0.05 vCPU | 0.16 vCPU | 1 vCPU | negotiated |
| Processes (PID cap) | 256 | 512 | 1,024 | negotiated |
Ephemeral disk /tmp | 512 MB | 1 GB | 4 GB | negotiated |
| Services per project | 1 | 10 | 25 | negotiated |
| Instances per service | 1 | 3 | 10 | negotiated |
| Scheduled tasks per project | 5 | 20 | 100 | 500 |
| Custom environments | 0 | 2 | 10 | 10 |
A workload that exceeds its memory is killed by the kernel (memoire_depassee); the report gives the observed value and the limit. A glowsoft.json declaring more services or scheduled tasks than the tier allows is refused before any build (declaration_refusee), naming the cap.
Database
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Isolation | Shared cluster | Shared cluster | Dedicated PostgreSQL instance | Dedicated instance and node |
| Included database | 1 GB | 8 GB | 50 GB | 250 GB |
| Database branches | 1 | 3 | 25 | 50 |
| PostgreSQL extensions | 20, allow-list | 50, allow-list | Any | Any |
| Connections, client / server | 30 / 3 | 60 / 5 | 200 / 15 | negotiated |
| Statement / idle transaction timeout | 30 s / 60 s | 30 s / 60 s | 300 s / 300 s | 300 s / 300 s |
| Backup | Daily | Hourly over 48 h, then daily | Point-in-time recovery (PITR) to the second | PITR and synchronous replica |
| Backup retention | 7 days | 30 days | 35 days | 90 days |
| Contractual RPO / RTO | 24 h / 4 h | 1 h / 2 h | 5 min / 30 min | 5 min / 30 min |
Realtime
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Messages per second | 100 | 500 | 2,500 | negotiated |
| Concurrent connections | 200 | 2,000 | 10,000 | negotiated |
Storage and emails
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Included object storage | 5 GB | 50 GB | 250 GB | 1 TB |
| Maximum file size | 50 MB | 5 GB | 50 GB | project quota |
| Included image transformations per month | 5,000 | 50,000 | 250,000 | 1,000,000 |
| Transactional emails per month | 1,000 | 10,000 | 50,000 | 200,000 |
An upload is refused if it exceeds the type or size allowed by the bucket, the tier's maximum file size or the project's quota; the refusal names which of the three applies. Beyond the included transformations, the image is served as is.
Network
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Outbound traffic, fair use | 500 GB/month | 2 TB/month | 10 TB/month | 50 TB/month |
| Sustained outbound throughput per project | 20 Mb/s | 50 Mb/s | 200 Mb/s | 500 Mb/s |
| Concurrent outbound connections per container | 256 | 512 | 2,048 | 4,096, negotiated |
| Request budget per project, 10 s burst | 100 req/s | 250 req/s | 1,000 req/s | 2,500 req/s |
| Custom domains per project | 1 | 10 | 100 | 500 |
Outbound throughput is never refused nor truncated: a ten-second burst goes at full speed, then the edge paces sending down to the cap. At 80 % of the burst, the platform emits the project.egress.threshold event to the project's endpoints (see Webhooks).
Build and deployment
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Build minutes per month | 100 | 500 | 2,000 | 10,000 |
| Concurrent builds | 1 | 2 | 5 | negotiated |
| Concurrent previews | 1 | 3 | 25 | 50 |
The minutes allowance is a hard cap: once reached, it refuses further builds until the first of the month (UTC), billing no overage. A build cancelled by a newer push does not count; a failed build does.
Observability
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Runtime log retention | 7 days | 30 days | 90 days | 365 days |
| Project audit log | 30 days | 12 months | 24 months | 36 months |
Team, security and support
| Discovery | Standard | Pro | Sovereign | |
|---|---|---|---|---|
| Seats | Unlimited | Unlimited | Unlimited | Unlimited |
| Single sign-on and SCIM | — | Included | Included | Included |
| Preview protection, 4 modes | Included | Included | Included | Included |
| Committed availability | 99.5 % | 99.9 % | 99.9 % | 99.95 % |
| Support | Documentation, forum | Ticket, email, 9 am – 6 pm working days | Ticket, email, phone, 8 am – 7 pm working days | Ticket, phone, named contact, 8 am – 8 pm working days |
Note. During the beta, Bastide runs in a single region, in France, and the numeric availability commitment is not in force yet.
The free project
Each verified person's free project has its own limits, tighter than Discovery:
| Limit | Value |
|---|---|
| Sleep | after 15 min without a request |
| Dormancy | after 30 days with neither a visit nor a deployment |
| Database | 500 MB |
| Object storage | 1 GB |
| Build minutes | 100 per month |
| Emails | 100 per month |
| Custom domains | 1 |
| Outbound network | closed by default, opened host by host; no outbound SMTP |
| Sustained CPU | 0.25 core |
Platform limits
These limits apply to every tier.
API rate
Each token (or the console session standing in for it) has two limits, over a sliding window:
| Limit | Value | Applies to |
|---|---|---|
| General | 600 calls per 60 s | Every operation |
| Sensitive | 60 calls per 60 s | Writes, and reads that return a secret, on top of the general one |
Every response carries RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset (in seconds) and RateLimit-Policy; a refusal returns 429 rate_limited with Retry-After. Each operation's reference page publishes its limits. Other caps protect specific actions:
| Action | Cap |
|---|---|
| Project creations by an agent | 5 per rolling day per tenant (plafond_de_creations_de_projet) |
| Sign-in failures | 5 within 15 minutes for an account from one address, then a doubling wait (trop_de_tentatives) |
| Personal tokens per account | 50 |
| Active second factors per account | 5 |
| Deployment hooks per project | 20 |
| Projects connected to the same repository within an organisation | 50 |
Environment variables
An environment holds at most 1,000 variables and 262,144 bytes in total; beyond that, the write is refused (quota_exceeded).
Requests served by the edge
| Parameter | Value | Adjustable | Beyond |
|---|---|---|---|
| URL length | 16 KB | no | 414 |
| Request headers | 100, 32 KB in total | no | 431 |
| Request body | 100 MB | up to 5 GB (requests.maxBodyMegabytes) | 413 |
| Connection to the application | 10 s | no | 502 |
| Application response headers | 15 s | not yet | 504 |
| Full response (guard timeout) | 300 s | 30 to 3,600 s (requests.timeoutSeconds) | 504 |
| Long-lived connection (WebSocket, event stream) | 60 min | not yet | connection ends |
| Concurrent connections per source address | 200 | no | connection refused |
Both settings are declared in the repository's glowsoft.json (see Routing).
Build
A repository's Dockerfile is read within bounds: 256 KiB, 4,000 lines, 32 KiB per logical line (dockerfile_trop_grand). The image produced targets linux/amd64, the fleet's only runtime architecture. A build that runs too long, logs too much or uses too much stops with a code that says so (build_limite_duree, build_limite_journal, build_limite_memoire, build_limite_disque); see Builds.
Coming from Supabase
The known gaps between Bastide and Supabase (1,000 rows per REST response, the pooler's transaction mode, realtime without postgres_changes…) are listed and reproduced by a test on the public page https://bastide.app/limites-supabase, and repeated in Migrate from Supabase.
See also: Billing, Builds, Database, Storage, Troubleshooting.