Get started

Sandbox in 10 minutes

Create an app, invite yourself as a tester, and send yourself a message. You need to be an owner or admin of a QuiC organization.

1. Create an app#

Open the developer console (in the QuiC web app: Developers) and choose Create app. Pick a name and a handle, and accept the Acceptable Use Policy. New apps start in sandbox.

2. Create a sandbox key#

On the app's Credentials tab, choose Create sandbox key. The key (qk_sb_…) is shown once — copy it into your secrets manager or an environment variable. Check it works:

Check your key
export QUIC_API_KEY="qk_sb_..."   # your sandbox key

curl https://api.quic.chat/platform/v1/ping \
  -H "Authorization: Bearer $QUIC_API_KEY"

3. Invite yourself as a tester#

On the Testers tab, invite your own QuiC email. In QuiC, an invite appears at the top of your chat list — choose Accept. Accepting is your opt-in: until then the app can't message you.

4. Find your appUserId#

Your app addresses people by appUserId, never by phone or email (sandbox and public apps). List who opted in:

List opted-in users
curl "https://api.quic.chat/platform/v1/consents?status=opted_in" \
  -H "Authorization: Bearer $QUIC_API_KEY"

5. Send a message#

Every send needs an Idempotency-Key: if the network drops, retry with the same key and you'll never send twice.

curl
curl https://api.quic.chat/platform/v1/messages \
  -H "Authorization: Bearer $QUIC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "to": { "appUserId": "u_4f9XkQ2bT7mN1pR8sV0wYz" },
    "type": "text",
    "text": "Hello from my first QuiC app 👋",
    "clientReference": "order-1042"
  }'
Node.js 18+ (fetch)
import { randomUUID } from 'node:crypto';

const API = 'https://api.quic.chat/platform/v1';
const headers = {
  Authorization: `Bearer ${process.env.QUIC_API_KEY}`,
  'Content-Type': 'application/json',
};

// Who has opted in? (sandbox: your accepted testers)
const consents = await fetch(`${API}/consents?status=opted_in`, { headers }).then((r) => r.json());
const appUserId = consents.data[0].appUserId;

const res = await fetch(`${API}/messages`, {
  method: 'POST',
  headers: { ...headers, 'Idempotency-Key': randomUUID() },
  body: JSON.stringify({ to: { appUserId }, type: 'text', text: 'Hello from my first QuiC app 👋' }),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message} (request ${body.error.requestId})`);
console.log('queued', body.id); // 202 Accepted

A successful send is queued and answered with 202:

Response
HTTP/1.1 202 Accepted
QuiC-Request-Id: req_...
QuiC-Version: 2026-10-01

{
  "id": "cmg4r2x0p0001ab12cd34ef56",
  "status": "accepted",
  "appUserId": "u_4f9XkQ2bT7mN1pR8sV0wYz",
  "type": "text",
  "createdAt": "2026-10-01T09:30:00.000Z",
  "clientReference": "order-1042"
}

Open QuiC — the message is in a chat with your app, marked with a Business badge and a note that the chat isn't end-to-end encrypted.

6. Hear back#

Reply from QuiC, then add a webhook to receive message.received, delivery and read receipts, and consent changes.