Tarot Spread API Comparison: Which Endpoints to Use for Your App
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/lovewith 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:
/drawwith 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?
- Get your API key: Visit RoxyAPI Pricing to start with free tier
- Test endpoints: Use RoxyAPI Docs for interactive testing
- Review full API: Check Tarot API product page for complete endpoint list
- 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.