Zindua

Instant communication platform for businesses, optimized for developers.

Product
  • WhatsApp
  • Campaigns
  • Bot builder
  • MailGuard
  • Verify
  • Pricing
Developers
  • Documentation
  • Node.js
  • Next.js
  • PHP
  • FastAPI
  • MCP / Cursor
Solutions
  • Public sector
  • Health & care
  • Banking & fintech
  • NGOs & associations
  • SaaS & product teams
  • All solutions
Company
  • About
  • Blog
  • Contact
  • Status
  • Terms
  • Privacy

Product

  • WhatsApp
  • Campaigns
  • Bot builder
  • MailGuard
  • Verify
  • Pricing

Developers

  • Documentation
  • Node.js
  • Next.js
  • PHP
  • FastAPI
  • MCP / Cursor

Solutions

  • Public sector
  • Health & care
  • Banking & fintech
  • NGOs & associations
  • SaaS & product teams
  • All solutions

Company

  • About
  • Blog
  • Contact
  • Status
  • Terms
  • Privacy

© 2026 Zindua, Inc. All rights reserved.

System status
Zindua
How it WorksPricingCompare
Sign in
Get started

PushMirror
mobile guide

Step-by-step for beginners, intermediate, and advanced. Keys, Firebase, device registration, SSE (not WebSocket), webhooks, and every challenge model with a live phone demo.

Try interactive demoGet API keyProduct overview

Keys

Three secrets. Three jobs.

Most confusion comes from mixing these. Memorize the table, then pick your level.

Three secrets. Three jobs. Never mix them.

Beginnerrequired

Project API key

ZINDUA_API_KEY = znd_live_…

Where: Dashboard → Project → API keys. Used for: Your backend creates challenges with Authorization: Bearer …. Never put this key inside the mobile APK / IPA or a public frontend.

Realtime

SSE for login. Webhooks for your server.

People often say WebSocket. PushMirror uses Server-Sent Events for the browser, and signed HTTP webhooks for backends.

SSE for the login page. Webhooks for your server. Not WebSocket.

Browser

SSE

The browser opens EventSource on GET /api/v1/challenges/:id/stream. When the phone responds, the login page unlocks in milliseconds. This is not a WebSocket — it is Server-Sent Events (one-way stream).

Live demo

PushMirror on your phone UI

Switch emoji, digit, or approve. Same production sheet.

Interactive schematic

Switch models. Watch the push.

Same sheet as production. Approve triggers the celebration burst.

app.yours.com/login

New machine sign-in

Check your phone

😄

Tap the same icon on your trusted device.

Trusted phone

Your app

PushMirror · now

Allow this sign-in?

Chrome · Kinshasa · just now

Powered by Zindua

Challenge models

Emoji, digit, or approve

Pick one type per login. The interactive demo above switches the same UI.

Pick one type per login. The interactive demo switches the same UI.

Challengeemoji

Emoji match

Login: Login shows one emoji (😄)

Phone: Phone shows 3–5 emojis — user taps the same one. Harder to phish by reading a code aloud

Choose your level

Follow only the track you need

Start beginner even if you ship mobile apps. Intermediate adds Firebase. Advanced hardens production.

Dashboard + playground, no mobile code yet

Dashboard + playground, no mobile code yet

Step 101

Create a Zindua project

Sign in → create a project → copy znd_live_… (or znd_test_…). Same key as email and WhatsApp.

Also see overview demo on /pushmirror

Code path

Copy in order

Server creates → browser listens (SSE) → phone registers device → phone responds → optional webhook.

create-challenge.ts

Create
TS
create-challenge.ts
import { Zindua } from "@zindua/sdk"; const zindua = new Zindua({ apiKey: process.env.ZINDUA_API_KEY! }); // Called when someone signs in from a NEW machineconst challenge = await zindua.pushMirror.create({  userId: "usr_123",  type: "emoji", // "emoji" | "approve" | "digit"  purpose: "login",  context: {    device: "Chrome on Windows",    city: "Kinshasa",  },  fallback: { channel: "whatsapp", to: "+243832499559" },}); // Login page shows challenge.display (😄 or 42)// Branding comes from Push settings (app name + logo or PushMirror default)return {  challengeId: challenge.id,  display: challenge.display,  branding: challenge.branding, // if your SDK surfaces it};

Also on Developers

Short Confirm section with key placement and a downloadable example. This mobile page is the deep guide.

Developers · ConfirmDownload example

Ready to wire your mobile app?

Create a project, paste your FCM key under Push → Config, register a device token, then create your first challenge.

Get API keyConfirm overview