User Subscriptions API

Get the current user's subscriptions and membership information.

GET /api/sdk/user/subscriptions

Returns the authenticated user's subscriptions from their Firebase token.

Headers

| Header | Required | Description | |--------|----------|-------------| | X-Fig1-API-Key | Yes | Your API key | | Authorization | No | Bearer token (Firebase ID token) |

Example Request

curl -X GET https://app.fig1.ai/api/sdk/user/subscriptions \
  -H "X-Fig1-API-Key: fig1_sdk_abc123" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."

Response (Authenticated)

When a valid Firebase token is provided:

{
  "success": true,
  "isAuthenticated": true,
  "user": {
    "uid": "firebase-user-id",
    "email": "user@example.com",
    "displayName": "John Doe"
  },
  "subscriptions": ["boxing_fundamentals", "premium_content"],
  "membershipTier": "premium",
  "membershipExpiry": "2025-12-31T00:00:00Z",
  "availableSubscriptions": [
    {
      "slug": "boxing_fundamentals",
      "name": "Boxing Fundamentals"
    },
    {
      "slug": "premium_content",
      "name": "Premium Content"
    },
    {
      "slug": "all_access",
      "name": "All Access Pass"
    }
  ]
}

Response (Not Authenticated)

When no Firebase token or invalid token:

{
  "success": true,
  "isAuthenticated": false,
  "subscriptions": [],
  "membershipExpiry": null,
  "availableSubscriptions": [
    {
      "slug": "boxing_fundamentals",
      "name": "Boxing Fundamentals"
    }
  ],
  "message": "User not authenticated. Include Authorization: Bearer <firebase_token> header."
}

Response Fields

| Field | Type | Description | |-------|------|-------------| | success | boolean | Whether the request succeeded | | isAuthenticated | boolean | Whether user is authenticated | | user | object | User info (only if authenticated) | | user.uid | string | Firebase user ID | | user.email | string | User's email | | user.displayName | string | User's display name | | subscriptions | string[] | User's active subscriptions | | membershipTier | string | User's membership tier | | membershipExpiry | string | ISO date when membership expires | | availableSubscriptions | array | All subscriptions available on this site |

TypeScript Example

interface UserSubscriptionsResponse {
  success: boolean;
  isAuthenticated: boolean;
  user?: {
    uid: string;
    email?: string;
    displayName?: string;
  };
  subscriptions: string[];
  membershipTier?: string;
  membershipExpiry?: string;
  availableSubscriptions: Array<{
    slug: string;
    name: string;
    description?: string;
  }>;
}

async function getUserSubscriptions(firebaseToken: string): Promise<UserSubscriptionsResponse> {
  const response = await fetch('https://app.fig1.ai/api/sdk/user/subscriptions', {
    headers: {
      'X-Fig1-API-Key': process.env.FIG1_API_KEY!,
      'Authorization': `Bearer ${firebaseToken}`
    }
  });

  return response.json();
}

React Hook Example

import { useState, useEffect } from 'react';
import { getAuth } from 'firebase/auth';

function useUserSubscriptions() {
  const [subscriptions, setSubscriptions] = useState<string[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    async function fetchSubscriptions() {
      const auth = getAuth();
      const user = auth.currentUser;

      if (!user) {
        setSubscriptions([]);
        setLoading(false);
        return;
      }

      try {
        const token = await user.getIdToken();
        const response = await fetch('/api/user-subscriptions', {
          headers: { 'Authorization': `Bearer ${token}` }
        });

        const data = await response.json();
        setSubscriptions(data.subscriptions);
      } catch (err) {
        setError('Failed to load subscriptions');
      } finally {
        setLoading(false);
      }
    }

    fetchSubscriptions();
  }, []);

  return { subscriptions, loading, error };
}

Checking Access to Content

async function canAccessContent(
  firebaseToken: string,
  requiredSubscriptions: string[]
): Promise<boolean> {
  const { subscriptions } = await getUserSubscriptions(firebaseToken);

  // User needs at least ONE of the required subscriptions
  return requiredSubscriptions.some(required =>
    subscriptions.includes(required)
  );
}

Displaying Subscription Status

function SubscriptionBadge({ subscriptions }: { subscriptions: string[] }) {
  if (subscriptions.length === 0) {
    return <span className="badge badge-gray">Free</span>;
  }

  if (subscriptions.includes('all_access')) {
    return <span className="badge badge-gold">All Access</span>;
  }

  return (
    <div className="flex gap-1">
      {subscriptions.map(sub => (
        <span key={sub} className="badge badge-blue">{sub}</span>
      ))}
    </div>
  );
}

Error Responses

Invalid API Key (401)

{
  "success": false,
  "error": "Invalid API key"
}

Server Error (500)

{
  "success": false,
  "error": "Failed to get user subscriptions"
}

Related Endpoints