Handzeichen

API for AI agents

Let ChatGPT, Claude & co. turn your slides, a PDF or an article into a Handzeichen deck. The agent gets back a presenter link, the join code and a QR code.

Create a deck

curl -X POST https://handzeichen.com/api/v1/decks \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "Photosynthesis – quick check",
  "settings": {
    "mode": "live",
    "showResults": true
  },
  "slides": [
    {
      "type": "choice",
      "question": "Where does the light reaction take place?",
      "options": [
        "Thylakoid",
        "Stroma",
        "Nucleus"
      ],
      "correct": 0
    },
    {
      "type": "scale",
      "question": "How confident do you feel about the topic?",
      "labels": {
        "lo": "unsure",
        "hi": "very sure"
      }
    },
    {
      "type": "cluster",
      "question": "Where do you stand?",
      "labels": {
        "lo": "theory",
        "hi": "practice",
        "top": "motivated",
        "bottom": "tired"
      }
    },
    {
      "type": "wordcloud",
      "question": "One word about plants?"
    }
  ]
}'

Response (201): code, host_url, participant_url, mitmach_url (only for mode "async"), qr_svg, host_token. Open host_url in the browser and present.

Read and edit a deck

curl https://handzeichen.com/api/v1/decks/CODE -H 'Authorization: Bearer HOST_TOKEN'
curl -X PATCH https://handzeichen.com/api/v1/decks/CODE \
  -H 'Authorization: Bearer HOST_TOKEN' -H 'Content-Type: application/json' \
  -d '{"title": "…", "slides": [{"id": "a1b2c3d4e5f6"}, {"type": "wordcloud", "question": "…"}]}'

GET returns all slides with an id. PATCH sends the complete new slide list in the desired order: slides with an id are updated (same type and options: answers are kept), just {"id"} keeps the slide unchanged, slides without id are new, omitted ones are deleted. Code and links stay the same.

Fetch results

curl https://handzeichen.com/api/v1/decks/CODE/results \
  -H 'Authorization: Bearer HOST_TOKEN'

Only aggregated results per slide (counts, averages, word cloud, ideas). No participant IDs, no names.

Slide types

choiceMultiple choice, 2–10 options; with correct (0-based index) it becomes a quiz
quizAlias for choice, correct is required
scaleScale 1–5, labels.lo/hi
emojiMood 😡–😍
sliderSlider, default 0–100 %; custom range with range {min, max, step, unit}, e.g. {"min": 0, "max": 12, "step": 0.5, "unit": "hours"}; labels.lo/hi
cluster (map, 2d)2D map for positioning, labels.lo/hi/top/bottom
scalesseveral statements (options 1–10), each 1–5
rankingRanking, options 2–10
wordcloudWord cloud
ideasopen ideas with upvotes
text (freetext, open)Open text answers: everyone writes a free answer, no upvotes, newest first
infoInfo slide without voting
media (video)Show a video and collect reactions: video (YouTube or Vimeo link), react "comment" (open text, default), "scale" (1–5, labels.lo/hi) or "none". Image galleries only in the editor (own uploads).

Question max. 200 characters, option max. 100, label max. 30, title max. 120. Optional per slide: image (https link), timer (15–300 s), hideResults.

Without and with an API key

MCP

Easiest: add https://handzeichen.com/mcp as a connector in your AI chat (Claude, ChatGPT, Le Chat, Cursor, VS Code …). Guide: https://handzeichen.com/mcp.

Alternatively local: for Claude Desktop, Cursor & co. there is a small dependency-free MCP server (one Node file) with the tools create_deck, get_deck, update_deck and get_results. Configuration: HANDZEICHEN_URL and optionally HANDZEICHEN_API_KEY.

Privacy

The server is located in Germany. What the agent sends is stored as slide text in Handzeichen. Please do not put personal data in questions.