
Quickstart Docs
Framework guides
Next.js
- Remix
- Nuxt
- Express
- RedwoodJS
- Hono
- Bun
- Astro
# Resend Node.js SDK
Node.js library for the Resend API.
## Install
```bash
npm install resend
# or
yarn add resend
```
## Examples
Send email with:
- [Node.js](https://github.com/resend/resend-node-example)
- [Next.js (App Router)](https://github.com/resend/resend-nextjs-app-router-example)
- [Next.js (Pages Router)](https://github.com/resend/resend-nextjs-pages-router-example)
- [Express](https://github.com/resend/resend-express-example)
## Setup
First, you need to get an API key, which is available in the [Resend Dashboard](https://resend.com/api-keys).
```js
import { Resend } from 'resend';
const resend = new Resend('re_xxxx...xxxxxx');
```
## Usage
Send your first email:
```js
const { data } = await resend.emails.send({
from: 'you@example.com',
to: 'user@gmail.com',
replyTo: 'you@example.com',
subject: 'hello world',
text: 'it works!',
});
console.log(`Email ${data.id} has been sent`);
```
> [!NOTE]
> In order to send from your own domain, you will first need to verify your domain in the [Resend Dashboard](https://resend.com/domains).
## Send email using HTML
Send an email custom HTML content:
```js
const { data } = await resend.emails.send({
from: 'you@example.com',
to: 'user@gmail.com',
replyTo: 'you@example.com',
subject: 'hello world',
html: 'it works!',
});
console.log(`Email ${data.id} with custom HTML content has been sent.`);
```
## Send email using React
Start by creating your email template as a React component.
```jsx
import React from 'react';
export default function EmailTemplate({ firstName, product }) {
return (
Welcome, {firstName}!
Thanks for trying {product}. We’re thrilled to have you on board.
);
}
```
Then import the template component and pass it to the `react` property.
```jsx
import EmailTemplate from '../components/EmailTemplate';
const { data } = await resend.emails.send({
from: 'you@example.com',
to: 'user@gmail.com',
replyTo: 'you@example.com',
subject: 'hello world',
react: ,
});
console.log(`Email ${data.id} with a React template has been sent`);
```
> [!NOTE]
> If you're sending emails from a file that doesn't have JSX transpilation set up (e.g., in a `.js`/`.ts` file instead of JSX/TSX), use React's `jsx` runtime function instead of passing the component as JSX:
>
>```js
>import { jsx } from 'react/jsx-runtime'
>import EmailTemplate from '../components/EmailTemplate';
>
>await resend.emails.send({
> from: 'you@example.com',
> to: 'user@gmail.com',
> replyTo: 'you@example.com',
> subject: 'hello world',
> react: jsx(EmailTemplate, { firstName:"John", product:"MyApp" }),
>});
>```
## Request options
Every method takes request options as its last argument. Use `signal` to cancel a request or set a timeout, and `headers` to add request headers:
```ts
const controller = new AbortController();
await resend.emails.send({ ... }, { signal: controller.signal });
// With a timeout (Node.js 18+) and a custom header
await resend.emails.list(
{ limit: 50 },
{ signal: AbortSignal.timeout(5000), headers: { 'X-Trace-Id': traceId } },
);
```
An aborted request returns a network-failure error with a `null` status code. To tell a cancel apart from a real failure, check the status code and `signal.aborted`, and do not match on the error message:
```ts
const signal = AbortSignal.timeout(5000);
const { error } = await resend.emails.list({}, { signal });
if (error?.statusCode === null && signal.aborted) {
// The request was cancelled or timed out.
}
```
When a method has an optional argument before the request options, pass `undefined` in its place:
```ts
await resend.broadcasts.send(broadcastId, undefined, { signal });
```
A chained `publish()` sends a separate request, so it takes its own options:
```ts
await resend.templates
.create({ name: 'welcome', html: 'Hi
' }, { signal })
.publish({ signal });
```
## License
MIT License