TypeScript SDK
Reference for the samva TypeScript SDK - client config, email send methods, services, and error shapes.
The samva package is the official TypeScript/JavaScript SDK for the Samva email API. It is generated from the OpenAPI specification, so its surface mirrors the REST API exactly.
This page is a reference. For a step-by-step walkthrough of sending your first email, see Send an email.
Installation
npm install samvayarn add samvapnpm add samvabun add samvaEntrypoints
The samva package ships three entrypoints from a single install. They are all generated from the same OpenAPI surface, so they stay in sync with the REST API; pick the one that matches your runtime style.
| Import | Style | When to use |
|---|---|---|
samva | Promise (default) | Most apps. Re-exports the Promise client. |
samva/promises | Promise (explicit) | The same Promise client as the root; use the explicit path when you also import samva/effect. |
samva/effect | Native Effect v4 | Effect-native apps. Returns Effects rather than wrapping the Promise client. Requires effect as a peer dependency. |
The rest of this page documents the Promise client. For the Effect client, see Native Effect client below.
Client
createClient(config)
Creates a configured client instance. The organization context is derived from the API key; no organization slug or ID is required.
import { createClient } from "samva";
const samva = createClient({ apiKey: process.env.SAMVA_API_KEY! });Config options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
apiKey | string | One of apiKey / authToken | none | API key. Sent as the X-API-Key header. |
authToken | string | One of apiKey / authToken | none | OAuth bearer token (e.g. from samva login). Sent as Authorization: Bearer. |
baseUrl | string | No | https://api.samva.app | API base URL. Override for testing or self-hosting. |
Pass exactly one of apiKey or authToken. Use apiKey for servers (the organization is derived from the key); use authToken for first-party or OAuth tooling, where the session is user-scoped, and pass the active organization with headers: { "x-org-slug": "<slug>" }. See API keys and OAuth sessions.
Additional fields from the underlying generated HTTP client Config (such as headers and fetch) are also accepted.
Return shape
createClient returns a SamvaClient exposing the live services below plus client, the underlying HTTP client.
| Property | Description |
|---|---|
email | Email send helper plus domain, sender, and template methods |
messages | Unified message send and retrieval |
contacts | Contact records |
conversations | Threaded message grouping |
webhooks | Event delivery configuration |
apiKeys | Programmatic access management |
organizations | Organization settings |
scheduledMessages | Schedule, list, get, and cancel future sends |
campaigns | Audience campaigns with scheduled runs and recipients |
client | Underlying HTTP client |
Calling convention
Methods take flat request parameters as the first argument. Request options such as throwOnError, headers, and signal are passed as an optional second argument.
Every method resolves to a result object:
| Field | Description |
|---|---|
data | The response payload on success (for example, data.id) |
error | The error payload on failure; undefined on success |
const result = await samva.email.send({
to: "ada@example.com",
cc: "grace@example.com",
replyTo: "support@example.com",
subject: "Welcome to Samva",
html: "<h1>Welcome!</h1>",
});
if (result.error) {
console.error("Send failed:", result.error);
} else {
console.log("Sent:", result.data?.id);
}samva.email
The canonical surface for email.
email.send(input, options?)
The simplest way to send email. It is an SDK-only ergonomic wrapper over messages.send() - there is no email.send REST endpoint. Email fields are flattened directly into the input object (not nested under an email key).
const result = await samva.email.send({
to: "ada@example.com",
subject: "Welcome to Samva",
html: "<h1>Welcome!</h1>",
});Input fields
| Field | Type | Required | Description |
|---|---|---|---|
to | recipient or recipient array | Yes | Recipient(s). See Recipients. |
cc | recipient or recipient array | - | Carbon-copy recipient(s). |
bcc | recipient or recipient array | - | Blind-carbon-copy recipient(s). |
replyTo | string or string[] | - | Reply-To address(es) for the email. |
subject | string | - | Email subject line. |
html | string | - | HTML body. Provide html, text, or both. |
text | string | - | Plain-text body. |
attachments | array | - | File attachments. |
templateId | string | - | Template to render instead of inline html/text. |
templateData | object | - | Variables passed to the template. |
conversationId | string | - | Attach the message to an existing conversation. |
inReplyToMessageId | string | - | Thread the message as a reply to a prior message. |
unsubscribeGroupId | string | - | Unsubscribe group to associate with the message. |
metadata | object | - | Arbitrary key/value metadata to attach to the message. |
Recipients
to, cc, and bcc accept a single value or an array of any of:
| Form | Example |
|---|---|
| Email string | "ada@example.com" |
| Email object | { email: "ada@example.com" } |
| Contact reference | { contactId: "contact_123" } |
| Contact object | { id: "contact_123" } (an object with id is treated as a contact) |
Email helper methods
The email service also exposes domain, sender, and template management. All take the standard options object and return { data, error }.
| Method | Purpose |
|---|---|
listTemplates(options?) | List email templates. |
createTemplate(options) | Create a template with a variable schema. |
getStats(options?) | Email sending statistics. |
addDomain(options) | Add a sending domain; returns the DNS records to set. |
listDomains(options?) | List sending domains. |
verifyDomain(options) | Trigger verification for a domain. |
checkDomainVerification(options) | Check verification status. |
getDomainStatus(options) | Current domain status. |
getDomainById(options) | Fetch a domain by ID. |
removeDomain(options) | Remove a domain. |
addSender(options) | Add a verified sender address. |
listSenders(options?) | List sender addresses. |
checkSenderVerification(options) | Check sender verification status. |
removeSender(options) | Remove a sender. |
For domain verification steps, see Verify your domain.
samva.messages
The unified send and retrieval API. email.send() delegates to messages.send(); reach for messages.send() directly when you want the explicit nested shape, for example to address contacts by contactId, send to multiple recipients, or thread a reply.
messages.send(input, options?)
const result = await samva.messages.send({
to: [{ contactId: "contact_123" }],
cc: [{ email: "grace@example.com" }],
channel: "email",
email: {
subject: "Welcome to Samva",
html: "<h1>Welcome!</h1>",
replyTo: "support@example.com",
},
});Input fields
| Field | Type | Required | Description |
|---|---|---|---|
to | recipient array | Yes | Recipients. Always an array. See Recipients. |
cc | recipient array | - | Carbon-copy recipients. Always an array. |
bcc | recipient array | - | Blind-carbon-copy recipients. Always an array. |
channel | "email" | Yes | Send channel. Email-only at launch. |
email | object | Yes | Nested email content (see below). |
conversationId | string | - | Attach to an existing conversation. |
metadata | object | - | Arbitrary key/value metadata. |
The nested email object carries subject, html, text, replyTo, attachments, templateId, templateData, inReplyToMessageId, and unsubscribeGroupId - the same content fields that email.send() flattens into body.
Other message methods
| Method | Purpose |
|---|---|
list(options?) | List messages. |
get(options) | Get a message by ID. |
getStatus(options) | Get delivery status for a message. |
getEvents(options) | Get the event log for a message. |
remove(options) | Delete a message. |
const messages = await samva.messages.list({ channel: "email", limit: "20" });
const message = await samva.messages.get({ id: "msg_123" });
const events = await samva.messages.getEvents({ id: "msg_123" });Other services
All services follow the same calling convention and result shape.
samva.contacts
| Method | Purpose |
|---|---|
create, update, remove | Manage a contact record. |
get, find, list | Fetch and list contacts. |
findOrCreate | Look up a contact or create it if absent. |
bulkImport, bulkDelete | Bulk create or delete. |
bulkUpdateStatus, bulkUpdateTags | Bulk attribute updates. |
export | Export contacts. |
getActivityTimeline, getEngagement, getGroupMemberships | Contact activity and grouping. |
samva.conversations
| Method | Purpose |
|---|---|
create, update | Manage a conversation. |
getById, list | Fetch and list conversations. |
addContacts, removeContacts | Manage conversation participants. |
samva.webhooks
| Method | Purpose |
|---|---|
create, update, remove | Manage a webhook endpoint. |
get, list | Fetch and list endpoints. |
getStats, getLogs | Delivery statistics and logs. |
test, retryDelivery | Send a test event or retry a delivery. |
regenerateSecret | Rotate the signing secret. |
For receiving and verifying webhook events, see Receive webhooks.
samva.apiKeys
| Method | Purpose |
|---|---|
create, update, remove | Manage an API key. |
get, list | Fetch and list keys. |
revoke, rotate | Revoke or rotate a key. |
getStats, getActivity | Usage statistics and activity. |
samva.organizations
| Method | Purpose |
|---|---|
get, update | Read and update organization settings. |
getUsage | Usage figures for the organization. |
samva.scheduledMessages
Scheduling is its own resource; there is no scheduledAt field on messages.send.
| Method | Purpose |
|---|---|
create | Schedule a message for a future scheduledFor time. |
list, get | List scheduled messages or fetch one by id. |
cancel | Cancel a pending scheduled message. |
samva.campaigns
| Method | Purpose |
|---|---|
create, list, get, update | Manage campaign drafts. |
archive | Archive a campaign. |
scheduleRun, listRuns, getRun | Schedule and inspect campaign runs. |
pauseRun, resumeRun, cancelRun | Control an in-flight run. |
listRecipients | List a run's recipients with delivery status. |
Error handling
Methods do not throw on API errors by default. Inspect the result instead:
const result = await samva.email.send({
to: "ada@example.com",
subject: "Test",
text: "Hello",
});
if (result.error) {
// result.error holds the error payload
console.error(result.error);
} else {
console.log(result.data?.id);
}Environment variables
Store the API key in an environment variable rather than hard-coding it.
# .env
SAMVA_API_KEY=samva_sk_live_your_api_keyconst samva = createClient({ apiKey: process.env.SAMVA_API_KEY! });Key format
Production keys start with samva_sk_live_; keys minted outside production start with
samva_sk_test_. Pass either environment's key into the client as apiKey.
const samva = createClient({ apiKey: "samva_sk_live_..." });See API keys for key format and details.
Native Effect client
samva/effect is a first-class Effect v4 client. It returns Effects rather than wrapping the Promise client, so it composes directly into Effect programs. Install effect alongside samva:
npm install samva effectCreate a client inside an Effect and provide an HTTP layer:
import { Effect } from "effect";
import { FetchHttpClient } from "effect/unstable/http";
import { createClient } from "samva/effect";
const program = Effect.gen(function* () {
const samva = yield* createClient({ apiKey: process.env.SAMVA_API_KEY! });
return yield* samva.email.send({
to: "ada@example.com",
subject: "Welcome to Samva",
html: "<h1>Welcome!</h1>",
});
}).pipe(Effect.provide(FetchHttpClient.layer));For application-wide dependency injection, use the SamvaClient service and provide its layer:
import { Effect } from "effect";
import { SamvaClient } from "samva/effect";
const program = Effect.gen(function* () {
const samva = yield* SamvaClient;
return yield* samva.email.send({
to: "ada@example.com",
subject: "Welcome to Samva",
html: "<h1>Welcome!</h1>",
});
}).pipe(Effect.provide(SamvaClient.layerFetch({ apiKey: process.env.SAMVA_API_KEY! })));The Effect client exposes flat email and messages send helpers, the same email-first surface as the Promise client, plus a top-level raw property (e.g. samva.raw) for the full generated Effect operation surface. Errors surface through the Effect error channel rather than a { data, error } result, so handle them with the usual combinators (Effect.catchAll, Effect.match, and so on).
Support matrix
| SDK | Package | API version | Runtime |
|---|---|---|---|
| TypeScript | samva | v1 | Modern Node.js, Bun, and Deno (ESM) |
| REST API | - | v1 | Any HTTP client |
The SDK is generated from the Samva OpenAPI specification using @hey-api/openapi-ts, so it stays in sync with the REST API. For other languages, use the REST API with your language's HTTP client.