Claude-skill-registry fever-sync-specialist
Sync and integrate Fever Partners API for plans, reviews, attendees, and venues. Use when implementing Fever data sync, debugging API issues, or building review/analytics features.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/fever-sync-specialist" ~/.claude/skills/majiayu000-claude-skill-registry-fever-sync-specialist && rm -rf "$T"
manifest:
skills/data/fever-sync-specialist/SKILL.mdsource content
Fever Sync Specialist
Sync and manage data from Fever Partners API including plans, reviews, attendees, and venues.
When to Use
- Implementing Fever data sync features
- Debugging Fever API integration issues
- Building reviews or analytics features from Fever data
- Working with Fever venues, plans, or sessions
Fever API Architecture
Base URLs
| Service | URL | Purpose |
|---|---|---|
| B2C API | | Consumer-facing API |
| B2B API | | Legacy B2B API |
| B2B Partners | | Partners API (main) |
| B2B IAM | | Identity/Auth |
| B2C Site | | Site config |
Authentication
All B2B APIs require authentication:
Authorization: B2bToken {token} X-Client-Version: w.12.0.1 Accept: application/json
Token is obtained after login to partners.feverup.com and stored in browser.
Available Endpoints
1. Reviews API (Reverse Engineered)
Endpoint:
GET /b2b-partners/1.0/partners/{partner_id}/reviews
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
| int | Reviews per page (default: 10) |
| int | Page number (1-indexed) |
| string | Filter by city ID |
| int | Filter by venue ID |
| string | Review type: |
| string | Sort field: |
| string | or |
Response:
{ "data": { "questions_rating": [ { "average": "4.6", "id": "uuid", "number_of_ratings": 2044, "title": "How would you rate the experience overall?", "type": "general-review" } ], "reviews": [ { "answers": [ { "flagged": false, "hidden": false, "id": "uuid", "question_id": "uuid", "question_title": "How would you rate the experience overall?", "question_type": "general-review", "rating": 5, "reasoning": "Optional text review" } ], "city_id": "1004611", "city_name": "Dortmund", "city_timezone": "Europe/Berlin", "place_address": "Schützenstraße 35, Dortmund", "place_id": 23810, "plan_id": 416711, "plan_name": "Candlelight: Tribut an Coldplay", "session_name": "Zone D", "session_starts_at": "2025-11-28T19:30:00Z", "ticket_id": 100585215, "user_first_name": "Alexandra", "user_id": 82692035, "user_image_url": "https://...", "user_last_name": "Dröge" } ] } }
2. Plans API
Endpoint:
GET /b2b-partners/2.0/partners/{partner_id}/plans
Response:
{ "data": { "plans": [ { "id": 501864, "name": "Ballet of Lights: Cinderella", "status": "on_sale", "kind": "standard", "partner_id": 8486, "timezone": "Europe/Berlin", "image_url": "https://...", "is_published": true, "is_sold_out": false, "is_hidden_feed": false, "is_asset_based": false, "has_multiple_places": false, "first_session_date": "2026-02-28T14:30:00Z", "last_session_date": "2026-04-09T18:30:00Z", "next_session_date": "2026-02-28T14:30:00Z", "next_session_date_with_attendees": "2026-02-28T14:30:00Z", "last_expired_session_date": null, "last_expired_session_date_with_attendees": null, "first_place_address": "Bautzner Landstraße 7, Dresden", "first_place_city_name": "Dresden", "created_at": "2025-11-11T17:27:57.705000Z", "places": [ { "id": 25788, "name": "Parkhotel Dresden", "address": "Bautzner Landstraße 7, Dresden", "zip_code": "01324", "city": { "id": 1004916, "name": "Dresden", "currency": "EUR", "timezone": "Europe/Berlin" } } ] } ] } }
3. Survey Replies API
Endpoint:
GET /b2b-partners/1.0/partners/{partner_id}/survey-replies
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
| bool | Return only latest reply |
Response:
{ "data": [ { "id": "uuid", "external_id": "0896d458bc004d12", "partner_id": 8486, "user_id": 42001, "reply_at": "2024-12-30T19:03:15.319869Z", "next_scheduled_reply_at": "2025-03-30T19:03:15.319869Z" } ] }
4. User Info API
Endpoint:
GET /b2b-iam/1.0/users/me
Response:
{ "data": { "id": 52740, "email": "user@example.com", "name": "User Name", "username": "user@example.com", "language": "de_DE", "status": "active", "type": "regular", "interface": "staff", "source": "feverzone", "business": null, "kiosk": null } }
5. User Permissions API
Endpoint:
GET /b2b-iam/1.0/users/{user_id}/organizations/{org_id}/permissions
Response:
{ "data": { "permissions": [ "can_search_cities", "can_search_plans", "can_view_attendees", "can_view_partner_detail", "can_view_reviews", "can_view_survey_replies", "can_view_validation" ] } }
6. Other Known Endpoints (from bundle analysis)
| Endpoint | Description |
|---|---|
| List cities |
| List venues |
| Plans with analytics data |
| Booking agents |
| Resellers |
| Partner users |
| Kiosks |
| On-site setups |
| Cash registers |
| Coupon templates |
Public B2C API (No Auth Required)
Plan Details with Rating
GET https://feverup.com/api/4.4/plans/{plan_id}/
Response includes:
{ "id": 266311, "name": "The Jury Experience", "rating": { "is_hidden": false, "num_ratings": 254, "average": 4.35 }, "should_display_featured_review_answers": true }
Note: Individual reviews are NOT available via public API. They are server-side rendered into the HTML at
feverup.com/m/{plan_id} for SEO purposes.
Test Scripts
Located in
.claude/skills/fever-sync-specialist/scripts/:
Test Reviews API (B2B - Auth Required)
./.claude/skills/fever-sync-specialist/scripts/test-fever-reviews.sh [city_id] [place_id] [page] [items_per_page] # Requires: export FEVER_PARTNER_ID="8486" export FEVER_B2B_TOKEN="your-token" # Get token from browser DevTools after logging into partners.feverup.com
Test Public Rating API (B2C - No Auth)
./.claude/skills/fever-sync-specialist/scripts/test-fever-b2c-reviews.sh
Token Retrieval
- Log into https://partners.feverup.com
- Open DevTools → Network tab
- Find any request to
services.feverup.com - Copy the
header value (without "B2bToken " prefix)Authorization
Data Mapping for Ballee
Reviews → Ballee Events
| Fever Field | Ballee Field | Notes |
|---|---|---|
| | Link to event |
| | Link to venue |
| | 1-5 scale |
| | Optional text |
| | Session datetime |
| | Partial name |
Plans → Ballee Events
| Fever Field | Ballee Field |
|---|---|
| |
| |
| |
| |
| |
| |
| |
Ballee Sync Implementation
Key Files
| File | Purpose |
|---|---|
| API client with auth, pagination |
| Main sync service |
| Venue mapping management |
| Server actions |
| Hourly cron endpoint |
Database Tables
| Table | Purpose |
|---|---|
| API credentials, partner IDs, last sync status |
| Individual reviews with ticket_id dedup |
| Fever place_id → Ballee venue_id mapping |
| Link events to Fever plans |
| Cached aggregate rating |
Sync Modes
// Full sync - fetches all reviews await syncFeverReviewsAction({ incremental: false }); // Incremental sync - only new reviews since last_sync_at await syncFeverReviewsAction({ incremental: true });
Cron Configuration
vercel.json:
{ "crons": [{ "path": "/api/cron/fever-sync", "schedule": "0 * * * *" }] }
- Default: Incremental sync (hourly)
- Force full:
query parameter?full=true
Matching Algorithm
Reviews are linked to events via exact matching (no fuzzy matching):
UPDATE fever_reviews fr SET event_id = e.id FROM events e WHERE e.fever_plan_id = fr.fever_plan_id AND DATE(e.event_date) = DATE(fr.session_starts_at AT TIME ZONE e.timezone);
Troubleshooting
401 Unauthorized
- Token expired - get new token from browser DevTools
- Wrong partner ID
Empty Reviews
- Check
permissioncan_view_reviews - Try without city/place filters first
- Verify partner has reviews
Rate Limiting
- Fever may rate limit aggressive polling
- Implement exponential backoff
- Cache responses appropriately