API Reference · v1

Nordisk AI Developer Docs

Embed live verification, submit applications, stream real-time events, and drop the Trust Badge onto any site — every code block is copy-runnable. Base URL: https://app.nordisk-ai.com/api

Introduction

The Nordisk AI API lets partners verify recruiters, submit pilot applications, and embed the Trust Badge on any surface where AI-generated recruitment communications appear. Every endpoint returns JSON, uses conventional HTTP status codes, and — where auth is required — reads from the same session cookie the workspace uses.

REST + SSE
Plain HTTP JSON APIs + a live event stream for admin dashboards.
RBAC-scoped
Every mutation is scoped to the caller's role — super-admin / owner / recruiter.
No SDK needed
Copy-paste curl into any language HTTP client. That's it.

Authentication

Public endpoints (marked Public below) require no authentication. Anything else — admin endpoints, workspace endpoints, the SSE stream — reads the nordisk_session cookie set after a magic-link consume.

To get a session cookie:

bash
# 1. Request a magic link (email arrives from Resend)
curl -X POST https://app.nordisk-ai.com/api/auth/request-link \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com"}'

# 2. Click the link in your inbox. The callback sets a HttpOnly cookie
#    named nordisk_session in your browser.

# 3. For programmatic use, extract the cookie value and pass it to curl:
curl https://app.nordisk-ai.com/api/auth/me \
  -H 'Cookie: nordisk_session=<value-from-your-browser>'
Note — sessions live for 30 days, are single-tenant, and every action is written to audit_events. There are no long-lived API keys during the pilot.
GET/api/health Public

Health check

Returns service status, model, and timestamp. Use it to monitor uptime.

Request
bash
curl https://app.nordisk-ai.com/api/health
Response
json
{
  "status": "ok",
  "service": "Nordisk AI",
  "model": "gpt-5.2",
  "timestamp": "2026-08-04T00:00:00.000Z"
}
GET/api/verify/{code} Public

Get a Trust Certificate

Fetch the public certificate data for a recruiter — the same JSON that powers the /verify/<code> page candidates open. Ideal for embedding a live "verified" widget on partner sites.

Request
bash
curl https://app.nordisk-ai.com/api/verify/AB12-CD34
Response
json
{
  "code": "AB12-CD34",
  "recruiter": {
    "name": "Elin Andersson",
    "photoUrl": "https://nordisk-ai.com/media/…",
    "linkedin": "https://linkedin.com/in/…"
  },
  "agency": {
    "name": "Nordic Recruitment AB",
    "slug": "nordic-recruitment",
    "logoUrl": "https://nordisk-ai.com/media/…"
  },
  "verifiedSince": "2026-06-14T08:15:00.000Z",
  "trustScore": 92,
  "status": "active"
}
POST/api/verify/{code}/report Public

Report impersonation

A candidate flag against a specific certificate. Rate-limited to prevent abuse. The report lands in the agency workspace and (for serious cases) the super-admin dashboard.

Request
bash
curl -X POST https://app.nordisk-ai.com/api/verify/AB12-CD34/report \
  -H 'Content-Type: application/json' \
  -d '{
    "candidateEmail": "candidate@example.com",
    "message":        "This email looked suspicious...",
    "channel":        "linkedin"
  }'
Response
json
{
  "ok": true,
  "reportId": "b1a5f8c3-…"
}
POST/api/apply Public

Submit an agency application

Kick off the pilot verification flow. The Nordisk AI team will review — approved agencies get a magic onboarding link within 24 hours.

Request
bash
curl -X POST https://app.nordisk-ai.com/api/apply \
  -H 'Content-Type: application/json' \
  -d '{
    "agencyName":  "Nordic Recruitment AB",
    "website":     "https://nordicrec.se",
    "email":       "owner@nordicrec.se",
    "contactName": "Elin Andersson",
    "country":     "Sweden",
    "specialties": ["Recruitment", "Staffing"],
    "volume":      "medium",
    "motivation":  "We want to protect our brand from AI impersonation."
  }'
Response
json
{
  "success": true,
  "id":      "080cde3b-27f2-4…",
  "message": "Application received. The team will get back to you within 2 business days."
}
POST/api/discovery-call Public

Book a discovery call

Marketing site "book a call" form. Rate-limited (3 per IP per hour).

Request
bash
curl -X POST https://app.nordisk-ai.com/api/discovery-call \
  -H 'Content-Type: application/json' \
  -d '{
    "name":    "Elin Andersson",
    "email":   "elin@nordicrec.se",
    "company": "Nordic Recruitment AB",
    "message": "Interested in the pilot."
  }'
Response
json
{
  "ok":   true,
  "id":   "cf1c…"
}
GET/api/events/stream Super-admin session

Live event stream (SSE)

Server-Sent Events stream of every platform event: applications, approvals, bookings, notes, and impersonation reports. Auto-reconnects with `Last-Event-ID` replay.

Request
bash
curl --no-buffer -N https://app.nordisk-ai.com/api/events/stream \
  -H 'Cookie: nordisk_session=<your-session-cookie>'
Response
json
retry: 5000

event: hello
data: {"ok":true,"subscribed":true,"ts":"2026-08-04T00:00:00Z"}

event: application.new
id: 1722816000000-abc123
data: {"type":"application.new","payload":{"agencyName":"…","email":"…"},"timestamp":"…"}
EMBED Public

Trust Badge embeds

Three snippets — pick the one that fits your surface. All three link to the recruiter's live certificate page and inherit the charcoal + gold aesthetic.

HTML — inline pill

Drop-in for email signatures, footers, and static sites. Zero JavaScript.

html
<a href="https://nordisk-ai.com/verify/AB12-CD34"
   target="_blank" rel="noopener"
   style="display:inline-flex;align-items:center;gap:6px;padding:5px 10px;
          border-radius:999px;background:#0e0e11;border:1px solid #D4AF37;
          color:#D4AF37;font-family:Inter,Arial,sans-serif;font-size:12px;
          font-weight:600;text-decoration:none">
  ✓ Verified by Nordisk AI
</a>
HTML — SVG badge

Same badge, rendered server-side as SVG. Great for LinkedIn banners and PDFs.

html
<a href="https://nordisk-ai.com/verify/AB12-CD34" target="_blank" rel="noopener">
  <img src="https://nordisk-ai.com/badge/AB12-CD34.svg"
       alt="Verified by Nordisk AI" width="180" height="36" />
</a>
JavaScript — live badge

Auto-updates as the recruiter's trust score changes; shows a subtle animation on hover.

html
<div id="nordisk-badge" data-code="AB12-CD34"></div>
<script async src="https://nordisk-ai.com/badge.js"></script>

Errors & rate limits

Errors follow standard HTTP codes and always include an error string in the JSON body.

json
// 400 — bad request body
{ "error": "Invalid status" }

// 401 — session expired / unauthenticated
{ "error": "Not authorized" }

// 404 — resource not found
{ "error": "Application not found" }

// 429 — rate limited
{ "error": "Digest already sent recently. Try again in a minute." }

// 500 — server error (report to founder@nordisk-ai.com)
{ "error": "Internal server error" }
Public endpoints
60 requests per IP per minute
/api/apply, /api/discovery-call
3 requests per IP per hour
Report submission
5 per IP per hour · deduplicated within 24 h

Need an endpoint that isn't here yet? Say the word.