Reqnora

Connect & API docs

Single source of truth for landing and dashboard — auth, send, poll, respond, webhooks, and plan catalog with full highlighted examples.

1. Connect in 5 minutes

  1. Create an account in the dashboard and open your first project.
  2. Copy the API key shown once (ak_live_…).
  3. Install the Reqnora mobile app and sign in with the same account.
  4. Send a test request (examples below) and approve it on your phone.
  5. Add a webhook URL so your automation continues after the answer.

2. Authentication

Use a project API key for send / poll. Mobile respond uses the signed-in user session token.

HTTP header
Authorization: Bearer ak_live_xxxxxxxxx

3. Send from your stack

Drop-in clients that call POST /api/v1/requests with your live key.

1// connect-reqnora.mjs
2const API = process.env.REQNORA_API_URL || "https://app.reqnora.com";
3const KEY = process.env.REQNORA_API_KEY; // ak_live_...
4
5async function sendRequest() {
6  const res = await fetch(`${API}/api/v1/requests`, {
7    method: "POST",
8    headers: {
9      Authorization: `Bearer ${KEY}`,
10      "Content-Type": "application/json",
11      "Idempotency-Key": `deploy-${Date.now()}`,
12    },
13    body: JSON.stringify({
14      title: "Deploy production?",
15      message: "Version 2.8 passed all tests.",
16      severity: "warning",
17      allow_reply: true,
18      actions: [
19        { id: "approve", label: "Approve", style: "primary" },
20        { id: "reject", label: "Reject", style: "danger" },
21      ],
22      expires_in: 900,
23    }),
24  });
25
26  if (!res.ok) throw new Error(await res.text());
27  const data = await res.json();
28  console.log("created", data.id, data.expires_at);
29  return data;
30}
31
32await sendRequest();

4. Send notification

Informational only — no Approve / Reject. Opens in the mobile inbox and can be marked read.

cURL
1curl -X POST https://app.reqnora.com/api/v1/notifications \
2  -H "Authorization: Bearer ak_live_xxx" \
3  -H "Content-Type: application/json" \
4  -d '{
5    "title": "Backup completed",
6    "message": "Production database backup finished.",
7    "severity": "success"
8  }'

5. Interactive request + reply

Human must choose an action. Set allow_reply: true so the app can attach a free-text note with the decision.

cURL
1curl -X POST https://app.reqnora.com/api/v1/requests \
2  -H "Authorization: Bearer ak_live_xxx" \
3  -H "Content-Type: application/json" \
4  -H "Idempotency-Key: deploy-production-v281" \
5  -d '{
6    "title": "Deploy production?",
7    "message": "Version 2.8 passed all tests.",
8    "severity": "warning",
9    "allow_reply": true,
10    "actions": [
11      {"id": "approve", "label": "Approve", "style": "primary"},
12      {"id": "reject", "label": "Reject", "style": "danger"}
13    ],
14    "expires_in": 900
15  }'

6. Reply-only request

Use action reply when you only need text back.

cURL
1curl -X POST https://app.reqnora.com/api/v1/requests \
2  -H "Authorization: Bearer ak_live_xxx" \
3  -H "Content-Type: application/json" \
4  -d '{
5    "title": "What should we do next?",
6    "message": "Need a short note from you.",
7    "allow_reply": true,
8    "actions": [
9      {"id": "reply", "label": "Send reply", "style": "primary"}
10    ]
11  }'

7. Poll result

cURL
curl https://app.reqnora.com/api/v1/requests/req_xxx \
  -H "Authorization: Bearer ak_live_xxx"

8. Respond (mobile / session)

reply is optional unless the action id is reply. Included in the webhook payload when present.

HTTP
1POST https://app.reqnora.com/api/v1/requests/{id}/respond
2Content-Type: application/json
3Authorization: Bearer <user_session_token>
4
5{
6  "action": "approve",
7  "reply": "Looks good — ship it."
8}

9. Webhook you receive

Fired as POST when someone answers. Always verify X-Reqnora-Signature (HMAC). Optional Bearer if configured on the webhook.

JSON body
1{
2  "event": "request.answered",
3  "request_id": "req_01hxyzexample",
4  "action": "approve",
5  "reply": "Looks good — ship it.",
6  "answered_at": "2026-08-29T13:00:00.000Z"
7}
Headers
1POST /your-endpoint HTTP/1.1
2Host: myapp.example.com
3Content-Type: application/json
4User-Agent: Reqnora-Webhook/1.0
5Authorization: Bearer <optional_token>
6X-Reqnora-Timestamp: 1756472400
7X-Reqnora-Signature: sha256=<hex_hmac>

Verify HMAC (Node)

javascript
1import crypto from "node:crypto";
2
3export function verifyReqnora(rawBody, headers, signingSecret) {
4  const timestamp = headers["x-reqnora-timestamp"];
5  const signature = headers["x-reqnora-signature"];
6  if (!timestamp || !signature?.startsWith("sha256=")) return false;
7
8  const age = Math.abs(Date.now() / 1000 - Number(timestamp));
9  if (!Number.isFinite(age) || age > 300) return false;
10
11  const expected =
12    "sha256=" +
13    crypto.createHmac("sha256", signingSecret)
14      .update(`${timestamp}.${rawBody}`)
15      .digest("hex");
16
17  const a = Buffer.from(signature);
18  const b = Buffer.from(expected);
19  return a.length === b.length && crypto.timingSafeEqual(a, b);
20}

10. Pro & Team extras

  • Export logs — History → Export CSV, or GET /api/v1/exports/requests (session auth).
  • Daily email report — toggle in Settings; cron hits POST /api/cron/daily-report with Authorization: Bearer $CRON_SECRET.
  • Shared inbox (Team) — invite teammates by email on Projects (max 20 people per project, including owner); they see and answer the same pending requests.