---
title: "More Domains on the Free Tier"
slug: three-domains-on-the-free-tier
description: "The free tier now includes 3 verified domains, so you can build and send from more projects without upgrading."
created_at: "2026-08-25"
updated_at: "2026-08-25"
image: https://cdn.resend.com/posts/three-domains-on-the-free-tier.jpg
humans: ["jonni-lundy"]
---

Since our beginning, the free tier included a single verified domain, a limitation that works for one project, but limits you even as you try to follow our best practices.

Today, we're increasing the free tier to **three domains**. Every free team can now verify up to three domains, in any region, at no cost.

## What you can build with it

- **More side projects**: give each product its own domain without needing to upgrade.
- **Separate sending subdomains**: keep transactional email on one domain and marketing on another to [protect your deliverability](/docs/knowledge-base/is-it-better-to-send-emails-from-a-subdomain-or-the-root-domain).
- **A real staging environment**: verify a staging domain and test changes safely before they reach your users.

## Add your next domain

You can add a domain from the [Domains page](/domains) in the dashboard. 

<video
  src="https://cdn.resend.com/posts/three-domains-on-the-free-tier.mp4"
  autoPlay
  loop
  muted
  playsInline
  className="extraWidth"
/>

Of course you can also add domains via the CLI, MCP, or [API as well](/docs/api-reference/domains/create-domain).

<CodeTabs codeHeight={250}>

```nodejs
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

const { data, error } = await resend.domains.create({ name: 'example.com' });
```

```php
$resend = Resend::client('re_xxxxxxxxx');

$resend->domains->create([
  'name' => 'example.com'
]);
```

```python
import resend

resend.api_key = "re_xxxxxxxxx"

params: resend.Domains.CreateParams = {
  "name": "example.com",
}

resend.Domains.create(params)
```

```ruby
Resend.api_key = ENV["RESEND_API_KEY"]

params = {
  name: "example.com",
}
domain = Resend::Domains.create(params)
puts domain
```

```go
package main

import "github.com/resend/resend-go/v3"

func main() {
	client := resend.NewClient("re_xxxxxxxxx")

	params := &resend.CreateDomainRequest{
		Name: "example.com",
	}

	client.Domains.Create(params)
}
```

```rust
use resend_rs::{types::CreateDomainOptions, Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  let _domain = resend
    .domains
    .create(CreateDomainOptions::new("example.com"))
    .await?;

  Ok(())
}
```

```java
import com.resend.*;

public class Main {
    public static void main(String[] args) {
        Resend resend = new Resend("re_xxxxxxxxx");

        CreateDomainOptions params = CreateDomainOptions
                .builder()
                .name("example.com").build();

        CreateDomainResponse domain = resend.domains().create(params);
    }
}
```

```dotnet
using Resend;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" ); // Or from DI

var resp = await resend.DomainAddAsync( "example.com" );
Console.WriteLine( "Domain Id={0}", resp.Content.Id );
```

```curl
curl -X POST 'https://api.resend.com/domains' \
     -H 'Authorization: Bearer re_xxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d $'{
  "name": "example.com"
}'
```

```cli
resend domains create --name example.com
```
</CodeTabs>

## Conclusion

The new limit is live today for every free team. Your team's quotas are shared automatically across all domains.

[View our pricing page](/pricing) for full details.
