RoxyAPI

Menu

Tarot Spread API Comparison: Which Endpoints to Use for Your App

15 min read
By Marcus Chen
TarotAPI IntegrationSpreadsMobile Development

Technical breakdown of tarot spread endpoints - from simple 3-card draws to complex Celtic Cross layouts. Learn which API to use for your app's needs with performance comparisons and real code examples.

Tarot Spread API Comparison: Which Endpoints to Use for Your App

When building a tarot reading app or integrating tarot card readings into your mobile application, choosing the right tarot API endpoint is crucial for user experience and app performance. Do you need quick single-card tarot draws for daily inspiration? Complex 10-position Celtic Cross spreads for deep divination? Custom tarot layouts for specialized readings? This comprehensive guide breaks down every tarot spread endpoint available in the RoxyAPI Tarot API, helping you pick the perfect tarot card API match for your wellness app, dating platform, or spiritual guidance application.

Quick Decision Guide for Tarot API Integration

Choose your tarot card API endpoint based on use case:

Use Case Endpoint Cards Best For
Daily tarot card inspiration POST https://roxyapi.com/api/v2/tarot/daily 1 Morning routines, push notifications, wellness apps
Quick yes/no tarot answers POST https://roxyapi.com/api/v2/tarot/yes-no 1 Decision tools, chat features, oracle readings
Flexible tarot card draws POST https://roxyapi.com/api/v2/tarot/draw 1-78 Custom tarot games, learning apps, practice tools
Quick three-card tarot insights POST https://roxyapi.com/api/v2/tarot/spreads/three-card 3 Beginner-friendly tarot readings, mobile apps
Relationship tarot guidance POST https://roxyapi.com/api/v2/tarot/spreads/love 5 Dating apps, relationship tools, compatibility
Career tarot planning POST https://roxyapi.com/api/v2/tarot/spreads/career 7 Professional development apps, job guidance
Deep Celtic Cross analysis POST https://roxyapi.com/api/v2/tarot/spreads/celtic-cross 10 Advanced tarot platforms, detailed readings
Custom tarot spread builder POST https://roxyapi.com/api/v2/tarot/spreads/custom Any Research, unique spreads, specialized layouts

1. Daily Card Endpoint

Endpoint: POST /daily

What It Does

Returns a single card with date-specific seeding. Same user + same date = same card every time. Perfect for "card of the day" features.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/daily
{
  "seed": "user-123"  // Optional - makes results consistent per user
}

// Response
{
  "card": {
    "id": "major-12",
    "name": "The Hanged Man",
    "arcana": "major",
    "reversed": false,
    "keywords": ["Pause", "Surrender", "New perspective"],
    "meaning": "A period of suspension and letting go...",
    "imageUrl": "https://roxyapi.com/img/tarot/major-12.jpg"
  },
  "message": "Today's energy calls for patience and surrender..."
}

When to Use

  • Daily card of the day features
  • Push notification content ("Your card for today is...")
  • Wellness app morning routines
  • Consistency required across app sessions

Implementation Example

async function getDailyCard(userId: string) {
  const today = new Date().toISOString().split('T')[0]; // "2026-01-09"
  const seed = `${userId}-${today}`;
  
  const response = await fetch('https://roxyapi.com/api/v2/tarot/daily', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.ROXYAPI_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ seed }),
  });
  
  return await response.json();
}

// User opens app multiple times today → same card
// User opens app tomorrow → different card

Performance

  • Response time: ~50ms
  • Payload size: ~800 bytes
  • Best for: High-frequency calls (every app open)

2. Yes/No Oracle Endpoint

Endpoint: POST /yes-no

What It Does

Draws a single card and interprets it as yes/no answer. Upright = Yes, Reversed = No. Major arcana = strong confidence, minor arcana = qualified answer.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/yes-no
{
  "question": "Should I accept the job offer?",
  "seed": "optional-seed"  // For reproducible answers
}

// Response
{
  "question": "Should I accept the job offer?",
  "answer": "Yes",
  "strength": "Strong",
  "card": {
    "id": "major-01",
    "name": "The Magician",
    "arcana": "major",
    "reversed": false,
    "keywords": ["Manifestation", "Power", "Action"],
    "meaning": "You have all the tools you need...",
    "imageUrl": "https://roxyapi.com/img/tarot/major-01.jpg"
  },
  "interpretation": "The Magician upright brings a strong yes. This is an excellent time to manifest your goals..."
}

When to Use

  • Decision-making tools ("Should I...?")
  • Chatbot integrations (quick binary answers)
  • Life coaching apps (guidance features)
  • Interactive stories (branching narratives)

Implementation Example

// Chat feature integration
async function askTarotOracle(question: string) {
  const response = await fetch('https://roxyapi.com/api/v2/tarot/yes-no', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.ROXYAPI_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ question }),
  });
  
  const data = await response.json();
  
  // Display answer with confidence indicator
  return {
    answer: data.answer,
    confidence: data.strength,  // "Strong" or "Qualified"
    cardName: data.card.name,
    explanation: data.interpretation,
  };
}

Performance

  • Response time: ~60ms
  • Payload size: ~1.2KB
  • Best for: Interactive features with immediate feedback

3. Flexible Draw Endpoint

Endpoint: POST /draw

What It Does

Raw card drawing with full control. Draw 1-78 cards, enable/disable reversals, use seeds for reproducibility. No pre-defined positions or interpretations.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/draw
{
  "count": 5,                    // Required: 1-78
  "allowReversals": true,        // Optional: default false
  "seed": "optional-seed"        // Optional: for reproducible draws
}

// Response
{
  "cards": [
    {
      "position": 1,
      "id": "cups-03",
      "name": "Three of Cups",
      "arcana": "minor",
      "suit": "cups",
      "reversed": false,
      "keywords": ["Celebration", "Friendship", "Community"],
      "meaning": "Joy and celebration with loved ones...",
      "imageUrl": "https://roxyapi.com/img/tarot/cups-03.jpg"
    },
    // ... 4 more cards
  ],
  "seed": "optional-seed"  // Echoed back if provided
}

When to Use

  • Custom spread builders (user-defined positions)
  • Learning apps (practice identifying cards)
  • Card games (tarot-based gameplay)
  • Research tools (statistical analysis)

Implementation Example

// Custom 5-card spread with your own position names
async function customFiveCardSpread(question: string) {
  const response = await fetch('https://roxyapi.com/api/v2/tarot/draw', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.ROXYAPI_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ 
      count: 5,
      allowReversals: true,
    }),
  });
  
  const { cards } = await response.json();
  
  // Map cards to your custom positions
  return {
    question,
    positions: [
      { name: 'Root Cause', card: cards[0] },
      { name: 'Hidden Influence', card: cards[1] },
      { name: 'Conscious Thoughts', card: cards[2] },
      { name: 'Possible Action', card: cards[3] },
      { name: 'Likely Outcome', card: cards[4] },
    ],
  };
}

Performance

  • Response time: ~70ms (scales linearly with card count)
  • Payload size: ~200 bytes per card
  • Best for: High-flexibility requirements, custom UI

4. Three-Card Spread

Endpoint: POST /spreads/three-card

What It Does

Classic Past-Present-Future spread. Each position includes card + position-specific interpretation + overall summary connecting all three.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/spreads/three-card
{
  "question": "What do I need to know about my career?",
  "seed": "optional-seed"
}

// Response
{
  "spread": "Three-Card Spread",
  "question": "What do I need to know about my career?",
  "positions": [
    {
      "position": 1,
      "name": "Past",
      "interpretation": "The foundation you built through disciplined work...",
      "card": { /* full card data */ }
    },
    {
      "position": 2,
      "name": "Present",
      "interpretation": "Current energy shows transition and change...",
      "card": { /* full card data */ }
    },
    {
      "position": 3,
      "name": "Future",
      "interpretation": "Success awaits if you maintain balance...",
      "card": { /* full card data */ }
    }
  ],
  "summary": "Your career journey shows strong foundations from past efforts..."
}

When to Use

  • Beginner-friendly apps (most popular spread)
  • Quick insights (3 positions, easy to digest)
  • General purpose readings (works for any question)
  • Mobile apps (fits well on small screens)

Implementation Example

async function getThreeCardReading(question: string, userId: string) {
  const readingId = `${userId}-${Date.now()}`;
  
  const response = await fetch('https://roxyapi.com/api/v2/tarot/spreads/three-card', {
    method: 'POST',
    headers: {
      'X-API-Key': process.env.ROXYAPI_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ 
      question,
      seed: readingId,  // Makes reading reproducible for history
    }),
  });
  
  const reading = await response.json();
  
  // Save to database for reading history
  await saveReading({
    id: readingId,
    userId,
    type: 'three-card',
    question,
    cards: reading.positions.map(p => p.card.id),
    summary: reading.summary,
    createdAt: new Date(),
  });
  
  return reading;
}

Performance

  • Response time: ~90ms
  • Payload size: ~3.5KB
  • Best for: Balanced between simplicity and depth

5. Love Spread

Endpoint: POST /spreads/love

What It Does

5-card spread focused on relationships. Positions: You, Partner, Connection, Challenge, Outcome. Each card includes relationship-specific interpretation.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/spreads/love
{
  "question": "Where is my relationship headed?",
  "seed": "optional-seed"
}

// Response
{
  "spread": "Love Spread",
  "question": "Where is my relationship headed?",
  "positions": [
    {
      "position": 1,
      "name": "You",
      "interpretation": "You bring emotional maturity and open communication...",
      "card": { /* full card data */ }
    },
    {
      "position": 2,
      "name": "Partner",
      "interpretation": "Your partner is in a period of self-reflection...",
      "card": { /* full card data */ }
    },
    // ... 3 more positions
  ],
  "summary": "This relationship shows strong potential if both parties..."
}

When to Use

  • Dating apps (icebreaker features)
  • Relationship coaching platforms
  • Compatibility tools (analyze connections)
  • Social apps (conversation starters)

Performance

  • Response time: ~110ms
  • Payload size: ~4.8KB
  • Best for: Relationship-focused apps

6. Career Spread

Endpoint: POST /spreads/career

What It Does

7-card spread for professional guidance. Positions: Current Role, Skills, Challenges, Opportunities, Short-term, Long-term, Advice.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/spreads/career
{
  "question": "Should I change careers?",
  "seed": "optional-seed"
}

// Response (7 positions with career-specific interpretations)

When to Use

  • Professional development apps
  • Career coaching platforms
  • Job hunting tools (guidance features)
  • Business decision tools

Performance

  • Response time: ~130ms
  • Payload size: ~6.2KB
  • Best for: Career-focused products

7. Celtic Cross Spread

Endpoint: POST /spreads/celtic-cross

What It Does

The most comprehensive spread - 10 positions covering past, present, future, subconscious, conscious, advice, external influences, hopes/fears, and final outcome.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/spreads/celtic-cross
{
  "question": "What do I need to know about my life right now?",
  "seed": "optional-seed"
}

// Response
{
  "spread": "Celtic Cross",
  "question": "What do I need to know about my life right now?",
  "positions": [
    {
      "position": 1,
      "name": "Present Situation",
      "interpretation": "You are at a crossroads, standing between...",
      "card": { /* full card data */ }
    },
    // ... 9 more positions with detailed interpretations
  ],
  "summary": "This comprehensive reading reveals a transformative period..."
}

When to Use

  • Advanced tarot platforms (experienced users)
  • Deep insight tools (comprehensive analysis)
  • Premium features (justifies higher pricing)
  • Desktop apps (complex UI fits larger screens)

Performance

  • Response time: ~150ms
  • Payload size: ~9.5KB
  • Best for: In-depth readings, desktop/tablet experiences

8. Custom Spread Builder

Endpoint: POST /spreads/custom

What It Does

Ultimate flexibility - define your own positions with custom names and interpretations. Perfect for unique spreads or research.

Technical Details

// Request
POST https://roxyapi.com/api/v2/tarot/spreads/custom
{
  "positions": [
    {
      "name": "Core Issue",
      "interpretation": "What is at the heart of this situation?"
    },
    {
      "name": "Hidden Opportunity",
      "interpretation": "What am I not seeing?"
    },
    {
      "name": "Next Step",
      "interpretation": "What action should I take?"
    }
  ],
  "question": "Optional question",
  "seed": "optional-seed"
}

// Response
{
  "spread": "Custom Spread",
  "positions": [
    {
      "position": 1,
      "name": "Core Issue",
      "interpretation": "What is at the heart of this situation?",
      "card": { /* full card data */ }
    },
    // ... your custom positions
  ],
  "summary": "This custom reading reveals..."
}

When to Use

  • Unique spread designs (Moon spread, Zodiac wheel, etc.)
  • Research projects (academic studies)
  • Niche apps (specific spiritual traditions)
  • Content creators (unique reading formats)

Performance

  • Response time: ~80ms + 15ms per position
  • Payload size: Varies (2-20KB typical)
  • Best for: Maximum creativity, specialized needs

Performance Comparison

Response Times (Average)

Endpoint Cards Response Time Payload Size
/daily 1 ~50ms ~800 bytes
/yes-no 1 ~60ms ~1.2KB
/draw Variable ~70ms + 10ms/card ~200 bytes/card
/spreads/three-card 3 ~90ms ~3.5KB
/spreads/love 5 ~110ms ~4.8KB
/spreads/career 7 ~130ms ~6.2KB
/spreads/celtic-cross 10 ~150ms ~9.5KB
/spreads/custom Variable ~80ms base Variable

Optimization Tips

1. Cache responses for seeded readings

// Same seed = same result, cache it
const cacheKey = `tarot:${endpoint}:${seed}`;
const cached = await redis.get(cacheKey);
if (cached) return JSON.parse(cached);

const result = await fetchTarotAPI(endpoint, seed);
await redis.setex(cacheKey, 86400, JSON.stringify(result));  // 24hr cache

2. Preload tarot card images for faster loading

// All tarot card images use consistent JPG URLs
const imageUrl = `https://roxyapi.com/img/tarot/${card.id}.jpg`;

// Preload common Major Arcana tarot cards for better UX
const majorArcana = Array.from({ length: 22 }, (_, i) => 
  `https://roxyapi.com/img/tarot/major-${i.toString().padStart(2, '0')}.jpg`
);

await Promise.all(majorArcana.map(url => Image.prefetch(url)));

3. Batch requests for history views

// DON'T: Fetch readings one by one
for (const readingId of readingIds) {
  await fetchReading(readingId);  // Slow!
}

// DO: Recreate from stored seeds in parallel
const readings = await Promise.all(
  readingIds.map(id => {
    const { seed, endpoint } = getStoredReading(id);
    return fetchTarotAPI(endpoint, seed);
  })
);

Choosing the Right Endpoint: Decision Matrix

Mobile Apps (Primary Use Case)

Wellness/Daily Inspiration:

  • ✅ Use: /daily
  • Why: Lightweight, consistent, perfect for notifications

Decision Tools:

  • ✅ Use: /yes-no
  • Why: Fast responses, easy UI, immediate value

General Tarot Reading:

  • ✅ Use: /spreads/three-card
  • Why: Beginner-friendly, fits mobile screens, balanced depth

Advanced Features:

  • ✅ Use: /spreads/celtic-cross
  • Why: Premium differentiator, justifies paid tier

Dating/Social Apps

Icebreakers:

  • ✅ Use: /spreads/love with shared seed
  • Why: Couple can see same reading, relationship-focused

Conversation Starters:

  • ✅ Use: /yes-no
  • Why: Fun, quick, shareable

Learning/Reference Apps

Card Database:

  • ✅ Use: GET /cards (not covered here)
  • Why: Browse all 78 cards with filters

Practice Draws:

  • ✅ Use: /draw
  • Why: Flexible count, no pre-defined meanings

Research/Academic

Custom Spreads:

  • ✅ Use: /spreads/custom
  • Why: Full control over positions

Data Collection:

  • ✅ Use: /draw with seeds
  • Why: Reproducible, no interpretation overhead

Real-World Implementation Example

Here's how a complete tarot app might use multiple endpoints together:

// app/services/tarot.ts
const API_BASE = 'https://roxyapi.com/api/v2/tarot';
const API_KEY = process.env.ROXYAPI_KEY;

class TarotService {
  // Daily card for home screen
  async getDailyCard(userId: string) {
    const today = new Date().toISOString().split('T')[0];
    return this.request('/daily', { seed: `${userId}-${today}` });
  }
  
  // Quick yes/no for chat feature
  async askQuestion(question: string) {
    return this.request('/yes-no', { question });
  }
  
  // Main reading feature (tiered)
  async getReading(type: string, question: string, userId: string) {
    const readingId = `${userId}-${Date.now()}`;
    
    const endpoints = {
      quick: '/spreads/three-card',
      love: '/spreads/love',
      career: '/spreads/career',
      deep: '/spreads/celtic-cross',
    };
    
    return this.request(endpoints[type], {
      question,
      seed: readingId,
    });
  }
  
  // Practice mode for learning tab
  async drawPracticeCards(count: number) {
    return this.request('/draw', { count, allowReversals: true });
  }
  
  private async request(endpoint: string, body: any) {
    const response = await fetch(`${API_BASE}${endpoint}`, {
      method: 'POST',
      headers: {
        'X-API-Key': API_KEY,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(body),
    });
    
    if (!response.ok) {
      throw new Error(`Tarot API error: ${response.status}`);
    }
    
    return response.json();
  }
}

export const tarotService = new TarotService();

API Usage Strategy

Free Tier Strategy

// Optimize for free tier limits (check current limits at /pricing)
const strategy = {
  daily: '/daily',              // Once per day per user
  quickQuestion: '/yes-no',     // 3-5 times per user per day
  mainReading: '/three-card',   // Once per day (free users)
};

Paid Tier Strategy

// Premium features for paid users
const premiumStrategy = {
  unlimited: '/spreads/celtic-cross',  // No daily limits
  custom: '/spreads/custom',           // Unique spreads
  history: 'Recreate from seeds',      // Replay past readings
};

Common Pitfalls to Avoid

❌ Wrong: Using Celtic Cross for Everything

// Overkill for simple use cases
async function getQuickGuidance() {
  return await fetch('/spreads/celtic-cross', { /* 10 cards! */ });
}

✅ Right: Match Complexity to Need

// Use three-card for quick insights
async function getQuickGuidance() {
  return await fetch('/spreads/three-card', { /* 3 cards */ });
}

❌ Wrong: Creating Spreads with /draw

// Reinventing the wheel
const { cards } = await fetch('/draw', { count: 3 });
// Now you have to write position interpretations yourself

✅ Right: Use Built-in Spreads

// Get professional interpretations
const reading = await fetch('/spreads/three-card');
// Positions + interpretations + summary included

❌ Wrong: Not Using Seeds for History

// Can't recreate past readings
const reading = await fetch('/spreads/three-card', { question });
// Lost forever after response

✅ Right: Seed Everything You Want to Save

const readingId = generateId();
const reading = await fetch('/spreads/three-card', {
  question,
  seed: readingId,
});
await saveReading({ id: readingId, ...reading });
// Can recreate anytime with same seed

Next Steps

Ready to integrate?

  1. Get your API key: Visit RoxyAPI Pricing to start with free tier
  2. Test endpoints: Use RoxyAPI Docs for interactive testing
  3. Review full API: Check Tarot API product page for complete endpoint list
  4. See all APIs: Explore all RoxyAPI products for astrology, numerology, and more

Choose your endpoint based on:

  • User experience needs (speed vs depth)
  • App type (wellness vs social vs learning)
  • Pricing tier (free vs paid features)
  • Screen real estate (mobile vs desktop)

The right API endpoint makes all the difference. Start simple with /daily or /three-card, then expand to premium spreads as your app grows.

Questions? The RoxyAPI documentation has interactive examples for every endpoint. Test them in your browser before writing code.