Skip to content
Compare

Phonekit vs Mailosaur for SMS testing

Both give your tests a phone number that receives texts and pulls out the code. Choose Mailosaur when you want email and SMS testing in one tool, or numbers in the UK or Canada. Choose Phonekit when you need a real SIM line, or when coding agents and teammates share the same numbers.

Phonekit team Updated

Compare the two

Mailosaur details come from its public site, docs and pricing page as of November 2026.

PhonekitMailosaur
What it testsTexts onlyEmail and SMS in one product
Number typesMobile: real SIM line on a mobile network. Standard: US local VoIPNumbers dedicated to your account; its docs don't state the line type
CountriesStandard numbers are US localStandard numbers in the UK, US and Canada; premium numbers elsewhere through support
How a test reads a codeSDK: mark the number, trigger the text, then waitForOtp()API: messages.get() waits for a message sent to the number; codes are in text.codes
Client librariesJS/TS SDK, CLI and HTTP APISDKs for Node.js, Java, Ruby, Python, .NET, PHP, Go and browser JavaScript
AccessEach number shared with chosen people, test keys and agentsPermissions set per project
SendingClosed-loop texts to your own numbers, teammates and recent senders, with limitsReply to a received SMS from its API
PlansStarter $29, Team $99 or Scale $199 a month; SMS included on every planPersonal from $20 and Core from $50 a month, billed annually; Enterprise custom
SMS priceStarter includes 3 Standard numbers, 1 Mobile line and a monthly SMS pool; extra Standard $5, Mobile $15 a monthListed on Core as "SMS and authentication from $37.50 per month"; no per-number price stated

Choose Mailosaur when

  • You test email and SMS and want both in one tool and one API.
  • You need test numbers in the UK or Canada, or premium numbers in other countries.
  • Your tests are written in Java, Ruby, Python, .NET, PHP or Go and you want a native client.
  • You want email previews or deliverability checks alongside your SMS tests.

Choose Phonekit when

  • A service your product depends on only texts mobile numbers. Phonekit Mobile numbers are real SIM lines on a mobile network.
  • Coding agents need to read codes while they work on your own app. They can use the agent skill, MCP server, CLI, SDK or API.
  • Your team shares numbers. Each number has its own list of people, test keys and agents, and everyone sees messages in one shared inbox.
  • You run tests in parallel. Give each worker its own number and mark it before the text is sent, so a test only reads the code it asked for.
  • You test a product that texts people. Phonekit can text your own numbers, your teammates' verified phones, anyone who texted you in the last 30 days and up to five numbers you add, at 10 texts a minute and 100 a day per number.

No number is accepted by every service. Some services only text mobile numbers, and that is what Mobile lines are for. Phonekit is for testing and running your own product, not for verifying accounts on other services.

The same Playwright test in each tool

Both tests sign in to the same app: fill in the phone number, ask for a code, read it and submit it. The Mailosaur calls are the ones its Playwright SMS docs show: messages.get() with sentTo, and the code from message.text.codes.

tests/sign-in.mailosaur.spec.tsTypeScript
import { test, expect } from "@playwright/test"
import MailosaurClient from "mailosaur"
 
const mailosaur = new MailosaurClient(process.env["MAILOSAUR_API_KEY"]!)
 
test("signs in with the SMS code", async ({ page }) => {
  const phoneNumber = process.env["TEST_PHONE_NUMBER"]!
  await page.goto("/signin")
  await page.getByLabel("Phone number").fill(phoneNumber)
  const receivedAfter = new Date()
  await page.getByRole("button", { name: "Send code" }).click()
  const message = await mailosaur.messages.get(
    process.env["MAILOSAUR_SERVER_ID"]!,
    { sentTo: phoneNumber },
    { receivedAfter, timeout: 120_000 }
  )
  const code = message.text?.codes?.[0]?.value ?? ""
  await page.getByLabel("Verification code").fill(code)
  await page.getByRole("button", { name: "Verify" }).click()
  await expect(page).toHaveURL(/\/account/)
})
tests/sign-in.phonekit.spec.tsTypeScript
import { test, expect } from "@playwright/test"
import { Phonekit } from "@phonekit/sdk"
 
const phonekit = new Phonekit({ apiKey: process.env["PHONEKIT_API_KEY"]! })
 
test("signs in with the SMS code", async ({ page }) => {
  const phoneNumber = process.env["TEST_PHONE_NUMBER"]!
  const number = phonekit.number(phoneNumber)
  await page.goto("/signin")
  await page.getByLabel("Phone number").fill(phoneNumber)
  const after = await number.mark()
  await page.getByRole("button", { name: "Send code" }).click()
  const code = await number.waitForOtp({ after, timeoutMs: 120_000 })
  await page.getByLabel("Verification code").fill(code)
  await page.getByRole("button", { name: "Verify" }).click()
  await expect(page).toHaveURL(/\/account/)
})

The two are close in length. The differences are in the details:

  • Waiting. Mailosaur's Node client waits 10 seconds by default and searches the last hour unless you pass receivedAfter. Pass both, as above, for a fresh code and a realistic wait. Phonekit's waitForOtp() needs a deadline every time.
  • Fresh messages. receivedAfter is a time from the test machine. Phonekit's mark() is a position recorded on Phonekit's side, so the wait doesn't depend on two clocks agreeing.
  • Types. Mailosaur's docs read message.text.codes[0].value. In its TypeScript types those fields are optional, so a strict project checks them as shown. Phonekit's waitForOtp() returns a string, or throws missing_otp when the text has no code.

The Playwright guide has the complete Phonekit test, and one number per parallel test covers resends and parallel workers.

Sources

As of November 2026:

Questions

Can I use Phonekit and Mailosaur together?

Yes. Many teams test email in one tool and SMS in another. Your app sends to whichever number or address the test gives it, so each test can use the service that fits.

Does Mailosaur test email as well as SMS?

Yes. Mailosaur's site describes email testing, email previews and SMS testing in one product, with the same API for both. Phonekit is for texts only: it receives them, and sends within its closed-loop limits.

Are Phonekit numbers real SIMs?

Mobile numbers are real SIM lines on a mobile network. Standard numbers are US local VoIP numbers. No number is accepted by every service, so test the exact step you depend on.

Which countries can I get numbers in?

Mailosaur's docs list standard numbers in the UK, US and Canada, with premium numbers for other countries through its support team. Phonekit Standard numbers are US local numbers. Check both before you plan tests that need a specific country.

How do these facts stay current?

The Mailosaur details on this page come from its public site and docs as of November 2026. Products change, so check Mailosaur's own pages before you decide.

Get a number.

Tell us what you're testing. We'll set up your workspace.

Get a number