Misar IO Docs

JavaScript / TypeScript

Official JavaScript & TypeScript SDK for MisarMail — works in Node.js, Next.js, Bun, and any JS runtime

JavaScript / TypeScript SDK

The misarmail npm package is the official JavaScript SDK for MisarMail. It ships with full TypeScript types, works in Node.js ≥18, Bun, Deno, and any runtime with native fetch.

Installation

npm install misarmail
# or
pnpm add misarmail
# or
yarn add misarmail

Quick Start

import MisarMail from "misarmail";

const client = new MisarMail({ apiKey: "msk_your_key_here" });

const result = await client.send({
  from: { email: "[email protected]", name: "Your App" },
  to: [{ email: "[email protected]" }],
  subject: "Welcome!",
  html: "<p>Welcome aboard!</p>",
});

console.log(result.message_id);

Configuration

const client = new MisarMail({
  apiKey: process.env.MISARMAIL_API_KEY!,
  baseUrl: "https://mail.misar.io",
  headers: { "X-App-Version": "2.0" },
  timeout: 15_000,
});

Add the key to .env.local:

MISARMAIL_API_KEY=msk_your_key_here

Available Methods

| Method | Description | |--------|-------------| | client.email.send(request) | Send a transactional email | | client.contacts.list({params}) | List contacts with filters | | client.contacts.create(request) | Create a contact | | client.contacts.get(id) | Get a single contact | | client.contacts.update(id, request) | Update contact fields | | client.contacts.delete(id) | Delete a contact | | client.contacts.import(request) | Bulk import/upsert contacts | | client.campaigns.list({params}) | List campaigns | | client.campaigns.create(request) | Create a draft campaign | | client.campaigns.get(id) | Get a campaign | | client.campaigns.update(id, request) | Update a campaign | | client.campaigns.send(id) | Send/schedule a campaign | | client.campaigns.delete(id) | Delete a campaign | | client.templates.list({params}) | List email templates | | client.templates.create(request) | Create a template | | client.templates.get(id) | Get a template | | client.templates.update(id, request) | Update a template | | client.templates.delete(id) | Delete a template | | client.templates.render(id, request) | Render a template with merge data | | client.automations.list({params}) | List automation workflows | | client.automations.create(request) | Create an automation | | client.automations.get(id) | Get an automation | | client.automations.update(id, request) | Update an automation | | client.automations.delete(id) | Delete an automation | | client.automations.activate(id) | Activate/deactivate an automation | | client.domains.list() | List sending domains | | client.domains.create(request) | Add a sending domain | | client.domains.get(id) | Get a domain | | client.domains.verify(id) | Trigger domain DNS verification | | client.domains.delete(id) | Delete a domain | | client.aliases.list({params}) | List email aliases | | client.aliases.create(request) | Create an alias | | client.aliases.get(id) | Get an alias | | client.aliases.update(id, request) | Update an alias | | client.aliases.delete(id) | Delete an alias | | client.dedicatedIps.list() | List dedicated IPs | | client.dedicatedIps.create(request) | Purchase a dedicated IP | | client.dedicatedIps.update(id, request) | Update IP pool assignment | | client.dedicatedIps.delete(id) | Release a dedicated IP | | client.channels.sendWhatsapp(request) | Send a WhatsApp message | | client.channels.sendPush(request) | Send a push notification | | client.abTests.list({params}) | List A/B tests | | client.abTests.create(request) | Create an A/B test | | client.abTests.get(id) | Get an A/B test | | client.abTests.setWinner(id, variant) | Manually set the winning variant | | client.sandbox.send(request) | Send in sandbox mode (no real delivery) | | client.sandbox.list({params}) | List sandbox sent messages | | client.sandbox.delete(id) | Delete a sandbox message | | client.inbound.list({params}) | List inbound routing rules | | client.inbound.create(request) | Create an inbound route | | client.inbound.get(id) | Get an inbound route | | client.inbound.delete(id) | Delete an inbound route | | client.analytics.overview({params}) | Get send/open/click/bounce analytics | | client.track.event(request) | Track a custom event | | client.track.purchase(request) | Track a purchase event | | client.keys.list() | List API keys | | client.keys.create(request) | Create an API key | | client.keys.get(id) | Get an API key | | client.keys.revoke(id) | Revoke an API key | | client.validate.email(address) | Validate an email address | | client.leads.search(request) | Start an async lead search job | | client.leads.getJob(jobId) | Get lead search job status | | client.leads.listJobs({params}) | List all lead search jobs | | client.leads.results(jobId, {params}) | Fetch results for a completed job | | client.leads.importLeads(request) | Import leads directly to contacts | | client.leads.credits() | Get lead finder credits balance | | client.autopilot.start(request) | Start an AI Autopilot campaign run | | client.autopilot.get(id) | Get Autopilot run status | | client.autopilot.list({params}) | List Autopilot runs | | client.autopilot.dailyPlan({params}) | Get today's AI-suggested outreach plan | | client.salesAgent.getConfig() | Get Sales Agent AI configuration | | client.salesAgent.updateConfig(request) | Update Sales Agent configuration | | client.salesAgent.getActions({params}) | List Sales Agent actions taken | | client.crm.listConversations({params}) | List CRM conversations | | client.crm.getConversation(id) | Get a CRM conversation | | client.crm.updateConversation(id, request) | Update conversation status/notes | | client.crm.listMessages(conversationId, {params}) | List messages in a conversation | | client.crm.listDeals({params}) | List deals in pipeline | | client.crm.createDeal(request) | Create a new deal | | client.crm.getDeal(id) | Get a deal | | client.crm.updateDeal(id, request) | Update a deal | | client.crm.deleteDeal(id) | Delete a deal | | client.crm.listClients({params}) | List CRM clients/accounts | | client.crm.createClient(request) | Create a CRM client | | client.webhooks.list({params}) | List webhooks | | client.webhooks.create(request) | Create a webhook endpoint | | client.webhooks.get(id) | Get a webhook | | client.webhooks.update(id, request) | Update a webhook | | client.webhooks.delete(id) | Delete a webhook | | client.webhooks.test(id) | Send a test event to a webhook | | client.usage.get({params}) | Get API usage stats | | client.billing.subscription() | Get current subscription details | | client.billing.checkout(request) | Create a billing checkout session | | client.workspaces.list() | List workspaces | | client.workspaces.create(request) | Create a workspace | | client.workspaces.get(id) | Get a workspace | | client.workspaces.update(id, request) | Update a workspace | | client.workspaces.delete(id) | Delete a workspace | | client.workspaces.listMembers(id) | List workspace members | | client.workspaces.inviteMember(id, request) | Invite a member to workspace | | client.workspaces.updateMember(id, userId, request) | Update member role | | client.workspaces.removeMember(id, userId) | Remove a member from workspace |


Examples

Send email

await client.email.send({
  from: { email: "[email protected]", name: "Your App" },
  to: [{ email: "[email protected]" }],
  subject: "Your receipt",
  html: "<p>Thanks for your order!</p>",
});

Lead finder

// Start an async search job
const job = await client.leads.search({
  query: "CTOs at B2B SaaS companies in India",
  limit: 100,
});

// Poll until complete, then fetch results
const status = await client.leads.getJob(job.id);
if (status.state === "completed") {
  const results = await client.leads.results(job.id, { limit: 50 });
  console.log(results.leads);
}

Autopilot

// Start an AI-driven outreach run
const run = await client.autopilot.start({
  goal: "Book 20 demo calls with fintech founders",
  audience: "Fintech startup founders, Series A–B",
  dailyLimit: 30,
});

// Check run progress
const status = await client.autopilot.get(run.id);
console.log(status.state, status.emailsSent, status.repliesReceived);

CRM conversations & deals

// List open conversations
const { conversations } = await client.crm.listConversations({ status: "open", limit: 20 });

// Create a deal linked to the first conversation
const deal = await client.crm.createDeal({
  title: "Enterprise contract",
  amount: 25000,
  currency: "USD",
  contactId: conversations[0].contactId,
});

Webhooks

// Register a webhook endpoint
const webhook = await client.webhooks.create({
  url: "https://yourapp.com/webhooks/mail",
  events: ["email.delivered", "email.opened", "email.bounced"],
});

// Send a test payload to verify
await client.webhooks.test(webhook.id);

Error Handling

try {
  await client.email.send({ /* ... */ });
} catch (err) {
  if (err instanceof MisarMailAPIError) {
    console.error(err.statusCode, err.message);
  }
}