---
name: turalula
version: 1.0.0
description: Creative studio API for interactive lessons, quizzes, and visual stories. Built on TuraPress. Part of Tura Cloud.
homepage: https://www.turalula.com
metadata: {"category":"creative-learning","api_base":"https://www.turalula.com/api/v1"}
---

# TuraLula

**Creative studio for interactive lessons, quizzes, and visual stories.**

TuraLula makes content feel like a game. Build tap-through lessons, instant-feedback quizzes, and visual stories through a REST API. Learners swipe through cards instead of scrolling. Creators publish without touching a CMS. Built on TuraPress for blog/newsletter/video support, with added interactivity for education and entertainment.

## Skill files

| File | URL |
|------|-----|
| **SKILL.md** (this file) | `https://www.turalula.com/SKILL.md` |
| **AGENTS.md** | `https://www.turalula.com/AGENTS.md` |
| **API.md** | `https://www.turalula.com/API.md` |
| **QUICKSTART.md** | `https://www.turalula.com/QUICKSTART.md` |
| **skill.json** (metadata) | `https://www.turalula.com/skill.json` |

**Install locally:**
```bash
mkdir -p ~/.turalula
curl -s https://www.turalula.com/SKILL.md > ~/.turalula/SKILL.md
curl -s https://www.turalula.com/AGENTS.md > ~/.turalula/AGENTS.md
curl -s https://www.turalula.com/API.md > ~/.turalula/API.md
curl -s https://www.turalula.com/QUICKSTART.md > ~/.turalula/QUICKSTART.md
```

**Base URL:** `https://www.turalula.com/api/v1`

**Authentication:** All endpoints require `Authorization: Bearer <API_KEY>`. API keys from [turalogin.com/dashboard/keys](https://www.turalogin.com/dashboard/keys).

---

## Overview

TuraLula is a creative content API with three core content types:

- **Lessons** -- Ordered sequences of cards (text, image, quiz, embed). Learners tap through them one step at a time.
- **Quizzes** -- Standalone or embedded question sets with multiple-choice, fill-in-the-blank, and image-pick formats. Instant scoring.
- **Stories** -- Short-form visual content combining images, short text blocks, and emoji. Designed for sharing.

On top of these, TuraLula includes:

- **Reactions** -- Emoji reactions on any content item
- **Learning paths** -- Ordered collections of lessons and quizzes
- **Tags and categories** -- Inherited from TuraPress
- **Content gating** -- Free vs member-only (integrate with TuraLogin + TuraSubscribe)

TuraLula shares the TuraPress infrastructure for blog posts, newsletters, video metadata, and RSS feeds. Use the TuraPress endpoints at `/press/*` for those features alongside TuraLula's `/lula/*` endpoints.

---

## Quick start

### 1. Create a lesson

```bash
curl -X POST https://www.turalula.com/api/v1/lula/lessons \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "What Makes a Great Logo",
    "description": "Five principles in five cards",
    "steps": [
      { "type": "text", "content": "A great logo is simple, memorable, and works at any size." },
      { "type": "image", "url": "https://example.com/logo-examples.png", "caption": "Which one catches your eye first?" },
      { "type": "quiz", "question": "How many colors should a logo use at most?", "options": ["1-2", "3-4", "5+"], "answer": "1-2" },
      { "type": "text", "content": "Constraint breeds creativity. Fewer colors, stronger identity." },
      { "type": "text", "content": "Now go sketch three logo ideas. Timer: 10 minutes. Go." }
    ]
  }'
```

### 2. Create a quiz

```bash
curl -X POST https://www.turalula.com/api/v1/lula/quizzes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Color Theory Basics",
    "questions": [
      { "type": "multiple-choice", "question": "Which is a primary color?", "options": ["Orange", "Red", "Green"], "answer": "Red" },
      { "type": "fill-in", "question": "Blue and yellow make ___", "answer": "green" }
    ]
  }'
```

### 3. Create a story

```bash
curl -X POST https://www.turalula.com/api/v1/lula/stories \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "5 Fonts That Changed Design",
    "cards": [
      { "image": "https://example.com/helvetica.png", "text": "Helvetica (1957)", "emoji": "🇨🇭" },
      { "image": "https://example.com/futura.png", "text": "Futura (1927)", "emoji": "🚀" }
    ]
  }'
```

---

## API reference

### Lessons

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/lula/lessons` | Create a lesson |
| GET | `/lula/lessons` | List lessons (filter by status, tags) |
| GET | `/lula/lessons/:id` | Get a lesson with all steps |
| PUT | `/lula/lessons/:id` | Update a lesson |
| DELETE | `/lula/lessons/:id` | Delete a lesson |

**Lesson fields:** `title` (required), `description`, `coverImage`, `steps` (array of step objects), `tags` (string array), `status` (draft/published/archived), `gated` (boolean), `metadata` (JSON).

**Step types:** `text` (content string), `image` (url + caption), `quiz` (question, options, answer), `embed` (embedUrl + provider).

### Quizzes

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/lula/quizzes` | Create a quiz |
| GET | `/lula/quizzes` | List quizzes |
| GET | `/lula/quizzes/:id` | Get a quiz with questions |
| PUT | `/lula/quizzes/:id` | Update a quiz |
| DELETE | `/lula/quizzes/:id` | Delete a quiz |
| POST | `/lula/quizzes/:id/submit` | Submit answers and get score |

**Quiz fields:** `title` (required), `description`, `questions` (array), `passingScore` (0-100, default 70), `tags`, `status`, `gated`, `metadata`.

**Question types:** `multiple-choice` (question, options, answer), `fill-in` (question, answer), `image-pick` (question, images array, correctIndex).

### Stories

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/lula/stories` | Create a story |
| GET | `/lula/stories` | List stories |
| GET | `/lula/stories/:id` | Get a story |
| PUT | `/lula/stories/:id` | Update a story |
| DELETE | `/lula/stories/:id` | Delete a story |

**Story fields:** `title` (required), `cards` (array of card objects), `tags`, `status`, `gated`, `metadata`.

**Card fields:** `image` (URL), `text` (short string), `emoji`, `backgroundColor`.

### Reactions

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/lula/reactions` | React to content |
| GET | `/lula/reactions/:contentType/:contentId` | Get reactions for content |
| DELETE | `/lula/reactions/:id` | Remove a reaction |

**Reaction fields:** `contentType` (lesson/quiz/story), `contentId`, `emoji` (required).

### Learning paths

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/lula/paths` | Create a learning path |
| GET | `/lula/paths` | List paths |
| GET | `/lula/paths/:id` | Get a path with items |
| PUT | `/lula/paths/:id` | Update a path |
| DELETE | `/lula/paths/:id` | Delete a path |

**Path fields:** `title` (required), `description`, `items` (array of `{ contentType, contentId, position }`), `tags`, `status`, `metadata`.

### Stats

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/lula/stats` | Aggregate content stats |

Returns counts for lessons, quizzes, stories, paths, and reactions.

---

## Response format

**Success:**
```json
{ "data": { ... } }
```

**List:**
```json
{ "data": [...], "page": 1, "limit": 20 }
```

**Error:**
```json
{ "error": "Error message" }
```

---

## Rate limits

60 requests per minute per API key.

---

## Related services

- **TuraPress** -- Blog posts, newsletters, video metadata (TuraLula extends this)
- **TuraLogin** -- Authentication (API keys and user auth)
- **TuraSubscribe** -- Subscription billing (for gated content)
- **TuraTrack** -- Event analytics (lesson completions, quiz scores)
- **TuraTunes** -- Audio hosting (for audio lessons)
- **TuraStore** -- File storage (for images and media)
