Aller au contenu

Envoi par lot

POST https://api.spacepost.dev/emails/batch

Le corps est un tableau JSON de 100 objets au maximum, chacun avec les mêmes champs que Envoyer un e-mail. L’envoi par lot économise des allers-retours et ne compte que pour une seule requête dans votre limite de débit.

batch.ts
import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
const { data, error } = await spacepost.batch.send(
[
{ from: "Acme <hello@acme.com>", to: ["a@example.com"], subject: "Hi Ada", html: "<p>Hi Ada</p>" },
{ from: "Acme <hello@acme.com>", to: ["b@example.com"], subject: "Hi Bob", html: "<p>Hi Bob</p>" },
],
{ idempotencyKey: "weekly-digest-2026-w43" },
);
if (error) console.error(error);
else console.log(data.data.map((e) => e.id)); // ids in input order
Response (200)
{
"data": [
{ "id": "0192e1c4-7a3b-7c1e-9d2f-3b5a8e6f4c10" },
{ "id": "0192e1c4-7a3c-7a02-8e10-6c0f9d7a2b31" }
]
}

Les ids sont renvoyés dans le même ordre que le tableau envoyé.

  • Tout ou rien. Si un e-mail du tableau est invalide, toute la requête échoue avec une validation_error et rien n’est stocké. Le message indique de quel e-mail il s’agit ((email 1)).
  • Le quota est vérifié une seule fois pour le nombre total de destinataires. S’il dépasse votre limite, tout le lot est rejeté.
  • Tout est autorisé pour chaque e-mail : pièces jointes, tags, en-têtes personnalisés, scheduled_at et tenant_id. Un tenant en pause ou ayant dépassé son plafond fait échouer tout le lot.
  • Les clés d’idempotence s’appliquent à l’ensemble du lot. Réessayez en toute sécurité avec la même clé.
  • La taille maximale d’un lot est de 100 e-mails ; les tableaux plus grands renvoient 422. Découpez les listes plus longues.
chunks.ts
import { SpacePost, type SendEmailOptions } from "@spacepost/node";
const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);
export async function sendAll(emails: SendEmailOptions[], jobId: string) {
for (let i = 0; i < emails.length; i += 100) {
const chunk = emails.slice(i, i + 100);
const { error } = await spacepost.batch.send(chunk, { idempotencyKey: `${jobId}-chunk-${i / 100}` });
if (error) throw new Error(`${error.name}: ${error.message}`);
}
}