Skip to main content

API Endpoints

Complete reference for all TrickBook API endpoints.

Base URL: https://api.thetrickbook.com/api

Authentication

Login

POST /api/auth

Request:

{
"email": "user@example.com",
"password": "password123"
}

Response:

{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Google SSO

POST /api/auth/google-auth

Request:

{
"idToken": "google_id_token_here"
}

Response:

{
"token": "jwt_token",
"user": {
"_id": "user_id",
"email": "user@gmail.com",
"name": "User Name"
}
}

Apple Sign-In

POST /api/auth/apple-auth

Request:

{
"identityToken": "apple_identity_token",
"user": {
"email": "user@icloud.com",
"name": { "firstName": "John", "lastName": "Doe" }
}
}

Response:

{
"token": "jwt_token",
"user": { "_id": "user_id", "email": "user@icloud.com", "name": "John Doe" }
}

Users

Register User

POST /api/users

Request:

{
"name": "John Doe",
"email": "john@example.com",
"password": "securepass123"
}

Response: 201 Created

Get User by Email

GET /api/users?email=user@example.com

Get Current User

GET /api/user/me

Headers: x-auth-token: jwt_token

Get User by ID

GET /api/user/:id

Headers: x-auth-token: jwt_token

Get Public Profile

GET /api/user/:id/public

No authentication required.

Get User Stats

GET /api/user/:id/stats

Response:

{
"trickCount": 42,
"postCount": 15,
"spotCount": 8,
"loveCount": 120,
"respectCount": 85
}

Get User Activity

GET /api/user/:id/activity

Get User Count

GET /api/user/count

No authentication required.

Check Homie Status

GET /api/user/homie-status/:targetId

Headers: x-auth-token: jwt_token

Response:

{
"status": "friends" | "pending_sent" | "pending_received" | "none"
}

Update User

PUT /api/user/:id

Headers: x-auth-token: jwt_token

Delete User

DELETE /api/users/:id

Headers: x-auth-token: jwt_token (must be account owner or admin)

Get All Users (Admin)

GET /api/users/all

Trick Lists

Get User's Trick Lists

GET /api/listings

Headers: x-auth-token: jwt_token

Response:

[
{
"_id": "list_id",
"name": "Kickflips to learn",
"user": "user_id",
"completed": 2,
"isPublic": false,
"tricks": [...]
}
]

Create Trick List

POST /api/listings

Headers: x-auth-token: jwt_token

Request:

{
"name": "New Trick List"
}

Get Public Trick Lists

GET /api/listings/public

Toggle Visibility

PUT /api/listings/:id/visibility

Headers: x-auth-token: jwt_token

Count User's Lists

GET /api/listings/countTrickLists

Delete Trick List

DELETE /api/listings/:id

Individual Tricks

Get Tricks in List

GET /api/listing?list_id=xxx

Get All User's Tricks

GET /api/listing/allTricks?userId=xxx

Get Trick Completion Graph

GET /api/listing/graph

Add Trick to List

POST /api/listing

Request:

{
"list_id": "list_id",
"name": "Kickflip",
"checked": "Not Started"
}

Update Trick Status

PUT /api/listing/:id

Request:

{
"checked": "Landed"
}

Edit Trick Details

PUT /api/listing/edit

Delete Trick

DELETE /api/listing/:id

Trickipedia (Global Encyclopedia)

Get All Tricks

GET /api/trickipedia

Query Parameters:

  • category - Filter by category
  • difficulty - Filter by difficulty
  • search - Search by name

Get Trick by ID

GET /api/trickipedia/:id

Get Tricks by Category

GET /api/trickipedia/category/:category

Create Trick (Admin)

POST /api/trickipedia

Headers: x-auth-token: admin_jwt_token

Request:

{
"name": "Kickflip",
"category": "Flip Tricks",
"difficulty": "Intermediate",
"description": "A flip trick...",
"steps": ["Step 1", "Step 2"],
"videoUrl": "https://youtube.com/...",
"url": "kickflip"
}

Update Trick (Admin)

PUT /api/trickipedia/:id

Delete Trick (Admin)

DELETE /api/trickipedia/:id

Spots

Get All Spots

GET /api/spots

Headers: x-auth-token: jwt_token

Get Spot by ID

GET /api/spots/:id

Create Spot

POST /api/spots

Headers: x-auth-token: jwt_token

Request:

{
"name": "Venice Beach Skatepark",
"latitude": 33.9850,
"longitude": -118.4695,
"description": "Famous beachside park",
"rating": 5,
"tags": "park, transitions",
"city": "Los Angeles",
"state": "CA",
"sportTypes": ["skateboarding"],
"category": "park"
}

Update Spot

PUT /api/spots/:id

Delete Spot

DELETE /api/spots/:id

Get Sport Types

GET /api/spots/sport-types
GET /api/spots/places-search?query=skatepark

Headers: x-auth-token: jwt_token


Spot Lists

Get User's Spot Lists

GET /api/spotlists

Headers: x-auth-token: jwt_token

Create Spot List

POST /api/spotlists

Headers: x-auth-token: jwt_token

Request:

{
"name": "LA Spots",
"description": "Best spots in Los Angeles"
}
Subscription Limits

Free users limited to 3 spot lists, 5 spots per list, 15 total spots.

Get Spot List

GET /api/spotlists/:id

Update Spot List

PUT /api/spotlists/:id

Delete Spot List

DELETE /api/spotlists/:id

Add Spot to List

POST /api/spotlists/:id/spots

Request:

{
"spotId": "spot_object_id"
}

Remove Spot from List

DELETE /api/spotlists/:id/spots/:spotId

Get Spots in List

GET /api/spotlists/:id/spots

Get Subscription Usage

GET /api/spotlists/usage

Spot Reviews

Get Reviews for Spot

GET /api/spot-reviews?spotId=xxx

Create Review

POST /api/spot-reviews

Headers: x-auth-token: jwt_token

Request:

{
"spotId": "spot_id",
"rating": 4,
"content": "Great park with smooth concrete"
}

Update Review

PUT /api/spot-reviews/:id

Delete Review

DELETE /api/spot-reviews/:id

Social Feed

Get Feed

GET /api/feed

Headers: x-auth-token: jwt_token

Returns posts ranked by algorithm (engagement, recency, homie boost).

Get Post Details

GET /api/feed/:postId

Create Post

POST /api/feed/posts

Headers: x-auth-token: jwt_token

Request:

{
"caption": "First kickflip!",
"mediaType": "video",
"mediaUrl": "https://cdn.example.com/video.mp4",
"thumbnailUrl": "https://cdn.example.com/thumb.jpg",
"tricks": ["Kickflip"]
}

Update Post

PUT /api/feed/:postId

Delete Post

DELETE /api/feed/:postId

React to Post

POST /api/feed/:postId/reactions

Request:

{
"type": "love" | "respect"
}

Get Comments

GET /api/feed/:postId/comments

Add Comment

POST /api/feed/:postId/comments

Request:

{
"content": "Sick clip!"
}

Delete Comment

DELETE /api/feed/:postId/comments/:commentId

Feed Algorithm

Posts are ranked using a weighted scoring algorithm:

FactorWeightDescription
Engagement0.35Reactions, comments, shares, views
Recency0.2548-hour half-life decay
Completion0.25User engagement rate
Interaction0.15User-specific interaction history
Homie boost2.5xMultiplier for posts from friends

Direct Messages

Get Conversations

GET /api/dm/conversations

Headers: x-auth-token: jwt_token

Get Conversation

GET /api/dm/conversations/:conversationId

Send Message

POST /api/dm/messages

Request:

{
"conversationId": "conv_id",
"content": "Hey, want to skate today?"
}

Get Messages

GET /api/dm/messages/:conversationId

Mark as Read

PUT /api/dm/messages/:messageId/read

Payments (Stripe)

Create Checkout Session

POST /api/payments/create-checkout-session

Headers: x-auth-token: jwt_token

Response:

{
"sessionId": "cs_xxx",
"url": "https://checkout.stripe.com/..."
}

Get Subscription Status

GET /api/payments/subscription

Response:

{
"plan": "premium",
"status": "active",
"currentPeriodEnd": "2024-12-31T00:00:00Z"
}

Cancel Subscription

POST /api/payments/cancel-subscription

Reactivate Subscription

POST /api/payments/reactivate-subscription

Admin Toggle Subscription

POST /api/payments/admin/toggle-subscription

Headers: x-auth-token: admin_jwt_token

Stripe Webhook

POST /api/payments/webhook

Handles: checkout.session.completed, invoice.paid, customer.subscription.updated/deleted


The Couch

Get Videos

GET /api/couch

Returns curated action sports videos from Google Drive/Bunny.net CDN.


Media & Uploads

Upload Media

POST /api/media
Content-Type: multipart/form-data

Upload Profile Image

POST /api/image/upload
Content-Type: multipart/form-data

Form Fields:

  • file - Image file
  • email - User email

Upload Trick Image

POST /api/trickImage/upload?trickUrl=kickflip
Content-Type: multipart/form-data

Delete Trick Images

DELETE /api/trickImage/delete-folder/:slug

Upload Blog Image

POST /api/blogImage
Content-Type: multipart/form-data

Blog

Get All Posts

GET /api/blog

Create Post (Admin)

POST /api/blog

Update Post (Admin)

PATCH /api/blog/update/:id

Delete Post (Admin)

DELETE /api/blog/:id

Other Endpoints

Categories

GET /api/categories

Contact Form

POST /api/contact

Register Push Token

POST /api/expoPushTokens

Request:

{
"token": "ExponentPushToken[xxx]"
}

Get Messages (Legacy)

GET /api/messages

Real-Time (Socket.IO)

In addition to REST endpoints, the backend provides real-time features via Socket.IO.

Connection: wss://api.thetrickbook.com Auth: JWT token passed in socket.handshake.auth.token

Feed Namespace (/feed)

EventDirectionDescription
post:updateServer → ClientPost data changed
reaction:updateServer → ClientReaction counts changed
comment:newServer → ClientNew comment on post

Messages Namespace (/messages)

EventDirectionDescription
message:newServer → ClientNew message received
typingClient → ServerUser typing indicator
readClient → ServerMessage read receipt