Skip to main content

Walkthrough: Your First Integration

If you're integrating Wize Snap for the first time — or you've been forwarded this link by someone who is — start here. This page walks through the entire flow end to end: getting a key, making your first two calls, and reading exactly what comes back. Everything else in these docs (Product Guide, API Reference) is there for when you need more detail on a specific piece.

tip

Already comfortable with REST APIs and just want the reference? Skip to Step 1 below, or jump straight to the API Reference.

What Wize Snap Does

Wize Snap is a two-step flow:

  1. Tell it about a person — a name, a role, a few notes. It returns a decision profile: a prediction of how that person prefers to receive information and make decisions.
  2. Give it a message draft and the profile you received in Step 1 — it analyses the draft against that profile and hands back concrete suggestions (and a rewrite) for making that specific message land better with that specific person.

That's the whole surface. Two API calls, connected by one ID.

Before You Start

You need two things.

An API key, generated from your dashboard:

Every request must include it in an x-api-key header. Keep it server-side — never in browser code, mobile apps, or public repos.

API credits. Every account starts with 100 free credits the moment you generate your first key — no card required. Predict Profile costs 1 credit per call, Analyse Comms costs 2. When you need more:

Step 1: Predict A Profile

API base URLhttps://backend.snap.wizer.business
POST https://backend.snap.wizer.business/api/v1/snap

Headers

x-api-key: wz_live_your_api_key
Content-Type: application/json

Request body — send whatever context you already have on the person:

{
"name": "Alex Morgan",
"ageRange": "35-44",
"jobType": "Sales Director",
"notes": "Leads enterprise renewals and prefers concise commercial context."
}

name and notes are required; ageRange and jobType are optional but improve accuracy when you have them.

Curl

curl -X POST "https://backend.snap.wizer.business/api/v1/snap" \
-H "Content-Type: application/json" \
-H "x-api-key: wz_live_your_api_key" \
-d '{
"name": "Alex Morgan",
"ageRange": "35-44",
"jobType": "Sales Director",
"notes": "Leads enterprise renewals and prefers concise commercial context."
}'

JavaScript

const response = await fetch("https://backend.snap.wizer.business/api/v1/snap", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
},
body: JSON.stringify({
"name": "Alex Morgan",
"ageRange": "35-44",
"jobType": "Sales Director",
"notes": "Leads enterprise renewals and prefers concise commercial context."
}
),
});

const result = await response.json();

if (!response.ok) {
throw new Error(result.message || "Wize Snap API request failed");
}

console.log(result);

Python

import requests

url = "https://backend.snap.wizer.business/api/v1/snap"
headers = {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
}
payload = {
"name": "Alex Morgan",
"ageRange": "35-44",
"jobType": "Sales Director",
"notes": "Leads enterprise renewals and prefers concise commercial context."
}

response = requests.post(url, headers=headers, json=payload, timeout=30)
result = response.json()

if not response.ok:
raise Exception(result.get("message", "Wize Snap API request failed"))

print(result)

Go

package main

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)

func main() {
payload := []byte(`{
"name": "Alex Morgan",
"ageRange": "35-44",
"jobType": "Sales Director",
"notes": "Leads enterprise renewals and prefers concise commercial context."
}`)

req, err := http.NewRequest("POST", "https://backend.snap.wizer.business/api/v1/snap", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", "wz_live_your_api_key")

client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()

body, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}

var result map[string]any
if err := json.Unmarshal(body, &result); err != nil {
panic(err)
}

if res.StatusCode < 200 || res.StatusCode >= 300 {
panic(result["message"])
}

fmt.Println(result)
}

What comes back:

{
"success": true,
"message": "Snap generated successfully",
"data": {
"snapId": 123,
"snapResponse": {
"name": "Alex Morgan",
"profile": "Analyzer",
"primary_code": "DP-01",
"secondary_profile": "Collaborator",
"secondary_code": "DP-02",
"confidence": "High",
"reasoning": "The provided context shows a preference for evidence, risk clarity, and concise commercial detail.",
"summary": "Alex is likely to respond best to structured recommendations backed by clear evidence.",
"secondary_profile_summary": "Alex is likely to respond best to recommendations that emphasize collaboration, stakeholder input, and team alignment."
}
},
"statusCode": 201,
"timestamp": "2026-06-23T13:30:00.000Z",
"error": null
}

The fields that matter most:

  • data.snapId — save this. It's what connects this profile to the message analysis in Step 2.
  • profile / primary_code — the predicted decision profile and its short code (DP-01DP-07). You can also feed primary_code back into Step 2 directly without storing snapId — see below.
  • summary — a plain-English description of how this person prefers to be communicated with. Safe to show directly in your own UI.

Step 2: Analyse A Message

Now send a draft message, together with the profile from Step 1, to get feedback tailored to that person.

POST https://backend.snap.wizer.business/api/v1/snap/comms

Request body — use the snapId you saved from Step 1:

{
"snapId": 123,
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}

messageType must be one of outreach, text, email, internal_comms, difficult_conversation, meeting_prep — pick whichever best describes the message.

Curl

curl -X POST "https://backend.snap.wizer.business/api/v1/snap/comms" \
-H "Content-Type: application/json" \
-H "x-api-key: wz_live_your_api_key" \
-d '{
"snapId": 123,
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}'

JavaScript

const response = await fetch("https://backend.snap.wizer.business/api/v1/snap/comms", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
},
body: JSON.stringify({
"snapId": 123,
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}
),
});

const result = await response.json();

if (!response.ok) {
throw new Error(result.message || "Wize Snap API request failed");
}

console.log(result);

Python

import requests

url = "https://backend.snap.wizer.business/api/v1/snap/comms"
headers = {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
}
payload = {
"snapId": 123,
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}

response = requests.post(url, headers=headers, json=payload, timeout=30)
result = response.json()

if not response.ok:
raise Exception(result.get("message", "Wize Snap API request failed"))

print(result)

Go

package main

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)

func main() {
payload := []byte(`{
"snapId": 123,
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}`)

req, err := http.NewRequest("POST", "https://backend.snap.wizer.business/api/v1/snap/comms", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", "wz_live_your_api_key")

client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()

body, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}

var result map[string]any
if err := json.Unmarshal(body, &result); err != nil {
panic(err)
}

if res.StatusCode < 200 || res.StatusCode >= 300 {
panic(result["message"])
}

fmt.Println(result)
}

What comes back:

{
"success": true,
"message": "Comms generated successfully",
"data": {
"commsId": 456,
"commsResponse": {
"strengths": [
"The message is concise and clearly explains the reason for follow-up."
],
"risks": ["It may need more evidence for an Analyzer profile."],
"suggestions": ["Add one concrete data point and a clear next step."],
"rewrite": "Hi Alex, I wanted to follow up on the renewal proposal and share the two metrics most relevant to the decision..."
}
},
"statusCode": 201,
"timestamp": "2026-06-23T13:30:00.000Z",
"error": null
}

Typical ways teams use this:

  • Show strengths / risks / suggestions as inline feedback next to the draft.
  • Offer rewrite as a one-click "improve this message" replacement.
  • Log commsId if you want to look the analysis up again later — repeat calls for the same snapId update the same record.

Optional: Skip Storage With A Profile Code

Don't want to store a snap at all? Send primaryCode (the code from primary_code in Step 1's response, e.g. "DP-03") instead of snapId:

Curl

curl -X POST "https://backend.snap.wizer.business/api/v1/snap/comms" \
-H "Content-Type: application/json" \
-H "x-api-key: wz_live_your_api_key" \
-d '{
"primaryCode": "DP-03",
"secondaryCode": "DP-06",
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}'

JavaScript

const response = await fetch("https://backend.snap.wizer.business/api/v1/snap/comms", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
},
body: JSON.stringify({
"primaryCode": "DP-03",
"secondaryCode": "DP-06",
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}
),
});

const result = await response.json();

if (!response.ok) {
throw new Error(result.message || "Wize Snap API request failed");
}

console.log(result);

Python

import requests

url = "https://backend.snap.wizer.business/api/v1/snap/comms"
headers = {
"Content-Type": "application/json",
"x-api-key": "wz_live_your_api_key",
}
payload = {
"primaryCode": "DP-03",
"secondaryCode": "DP-06",
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}

response = requests.post(url, headers=headers, json=payload, timeout=30)
result = response.json()

if not response.ok:
raise Exception(result.get("message", "Wize Snap API request failed"))

print(result)

Go

package main

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)

func main() {
payload := []byte(`{
"primaryCode": "DP-03",
"secondaryCode": "DP-06",
"messageType": "email",
"messageText": "Hi Alex, I wanted to follow up on the renewal proposal..."
}`)

req, err := http.NewRequest("POST", "https://backend.snap.wizer.business/api/v1/snap/comms", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", "wz_live_your_api_key")

client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()

body, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}

var result map[string]any
if err := json.Unmarshal(body, &result); err != nil {
panic(err)
}

if res.StatusCode < 200 || res.StatusCode >= 300 {
panic(result["message"])
}

fmt.Println(result)
}

Nothing is persisted server-side for this path — the response comes back with commsId: null. See the full Decision Profile Codes table for all seven codes. Send exactly one of snapId or primaryCode, never both.

Common Questions

Want to try requests without writing any code? Try it in the Playground — send both calls from your browser using your live API key.

Getting a 401? Your x-api-key header is missing, wrong, or the key is inactive. Regenerate one if needed. Full details: Authentication.

Getting "Insufficient API credits"? Your balance hit zero. Add more credits — no card needs to be on file first.

snapId or primaryCode — which should I use? snapId if you want the analysis retrievable later by commsId. primaryCode for a one-off, stateless check where you don't need to persist anything.

Some profile fields came back null? That can happen if the upstream prediction doesn't have enough signal — it's expected, not an error. Handle it as "no strong prediction" in your UI.

Getting a 429? You've hit the shared rate limit (120 requests/minute per IP for API-key traffic). See Rate Limiting for the response headers and retry behavior.

Where To Go Next