Astro
npm install @spacepost/nodeSPACEPOST_API_KEY=sp_live_YOUR_API_KEYAstro exposes server-only variables through import.meta.env:
import type { APIRoute } from "astro";import { SpacePost } from "@spacepost/node";
export const prerender = false; // needs an adapter (output: "server" or "hybrid")
const spacepost = new SpacePost(import.meta.env.SPACEPOST_API_KEY);
export const POST: APIRoute = async ({ request }) => { const { email, message } = await request.json();
const { data, error } = await spacepost.emails.send({ from: "Acme <hello@acme.com>", to: ["support@acme.com"], replyTo: email, subject: "New contact message", text: message, });
if (error) return Response.json(error, { status: error.statusCode ?? 500 }); return Response.json(data);};Or as an Astro Action:
import { defineAction, ActionError } from "astro:actions";import { z } from "astro:schema";import { SpacePost } from "@spacepost/node";
const spacepost = new SpacePost(import.meta.env.SPACEPOST_API_KEY);
export const server = { contact: defineAction({ accept: "form", input: z.object({ email: z.string().email(), message: z.string().min(1) }), handler: async ({ email, message }) => { const { error } = await spacepost.emails.send({ from: "Acme <hello@acme.com>", to: "support@acme.com", replyTo: email, subject: "New contact message", text: message, }); if (error) throw new ActionError({ code: "INTERNAL_SERVER_ERROR", message: error.message }); return { ok: true }; }, }),};