Skip to main content
PreEmpt Logo

PreEmpt.life API Documentation

Technical Specifications and Integration Guide

Version: 1.0
Effective Date: January 19, 2026


1. INTRODUCTION

The PreEmpt.Life API provides programmatic access to the platform's strategic foresight capabilities, enabling automated workflow integration, report generation, survey management, and custom application development.

API Base Implementation

  • Architecture: AWS Serverless (Lambda + API Gateway)
  • Runtime: Node.js 16.x
  • Database: MySQL/PostgreSQL
  • Cloud Provider: AWS (ap-southeast-2 region)

API Capabilities:

  • User authentication and management
  • Report generation and retrieval
  • Story/synthesis generation using AI (OpenAI)
  • Survey and question management
  • Challenge and coupon management
  • Document management
  • Team session management
  • Sharing and collaboration features
  • PDF generation
  • Payment processing via PayPal

2. AUTHENTICATION

The API uses JWT (JSON Web Token) authentication with HTTP-only cookies for secure session management.

Authentication Flow:

  1. User submits credentials to /user_login
  2. Server validates credentials and generates JWT
  3. JWT is set as an HTTP-only cookie
  4. Subsequent requests include the cookie automatically
Secure: true
SameSite: Strict
Path: /
Max-Age: 14 days (1,209,600 seconds)

Example Login Request:

curl -X POST https://api.preempt.life/user_login \
-H "Content-Type: application/json" \
-d '{
    "user": "user@example.com",
    "password": "your_password",
    "version": 1
}'

2.2 PROTECTED ENDPOINTS

Protected endpoints require Cookie-based authentication and are accessed via the PreemptAuthAPI gateway. The authorizer validates the JWT token from the Cookie header.

Authentication Header (for protected endpoints):

Cookie: preempt_auth_token=<JWT_TOKEN>

2.3 API GATEWAYS

The API has three distinct gateways:

GatewayPurposeAuthentication
ResultsPlusGatewayAPIPublic endpointsNone
PreemptAuthAPIProtected endpointsCookie-based JWT
PreemptGatewayBinaryAPIBinary data (images, PDFs)None

3. REQUEST FORMAT

3.1 REQUEST HEADERS

Required Headers:

Content-Type: application/json
Accept: application/json

Optional Headers (for protected endpoints):

Cookie: preempt_auth_token=<JWT_TOKEN>
Origin: https://your-domain.com

3.2 REQUEST BODY

All POST, PUT, and PATCH requests use JSON format:

{
  "userid": 123,
  "reportId": 456,
  "version": 1
}

3.3 API VERSIONING

The API supports versioning through the version parameter:

{
  "version": 1,
  "userid": 123
}
  • v0 (default): Legacy implementation
  • v1: Latest stable implementation
  • v2/v3: Extended functionality for specific endpoints

3.4 DATE/TIME FORMAT

All dates use ISO 8601 format:

{
  "created_at": "2026-01-17T14:30:00Z",
  "date": "January 17, 2026, 14:30"
}

4. RESPONSE FORMAT

4.1 STANDARD RESPONSE STRUCTURE

All API responses follow a consistent JSON structure:

{
  "status": "success",
  "messageid": "MSG_001",
  "message": "Operation completed successfully",
  "data": { }
}

Response Fields:

FieldTypeDescription
statusstringsuccess or error
messageidstringUnique message identifier
messagestringHuman-readable message
dataobject/arrayResponse payload (optional)

4.2 SUCCESS RESPONSES

{
  "status": "success",
  "messageid": "SUCCESSFULLY_LOGIN",
  "message": "User logged in successfully",
  "data": {
    "userInfo": {
      "userId": 123,
      "email": "user@example.com",
      "username": "johndoe",
      "name": "John Doe",
      "role": "user"
    }
  }
}

4.3 ERROR RESPONSES

{
  "status": "error",
  "messageid": "INVALID_PAYLOAD",
  "message": "Invalid request payload"
}

4.4 COMMON MESSAGE IDS

Message IDStatusDescription
SUCCESSFULLY_LOGINsuccessUser authenticated
FAILED_TO_LOGINerrorAuthentication failed
USER_NOT_FOUNDerrorUser does not exist
UNVERIFIED_LOGINerrorEmail not verified
INVALID_PAYLOADerrorMissing/invalid parameters
SUCCESSFULLY_LOAD_STORIESsuccessReports retrieved
FAILED_TO_LOAD_STORIESerrorReport retrieval failed

5. API ENDPOINTS

5.1 AUTHENTICATION ENDPOINTS


User Login

POST /user_login

Description: Authenticate user with email/username and password

Request Body:

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

Response:

{
  "status": "success",
  "messageid": "SUCCESSFULLY_LOGIN",
  "message": "User logged in successfully",
  "data": {
    "userInfo": {
      "userId": 123,
      "email": "user@example.com",
      "username": "johndoe",
      "name": "John Doe",
      "role": "user"
    }
  }
}

Email Login

POST /email_login

Description: Login using email and password only

Request Body:

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

Username Login

POST /username_login

Description: Login using username and password

Request Body:

{
  "username": "johndoe",
  "password": "password123"
}

User Registration

POST /user_register

Description: Register a new user account

Request Body:

{
  "email": "user@example.com",
  "username": "johndoe",
  "password": "password123",
  "name": "John Doe"
}

Email Registration

POST /email_register

Description: Register using email only


Username Registration

POST /username_register

Description: Register using username only


Email Verification

POST /email_verification

Description: Send OTP to email for verification

Request Body:

{
  "email": "user@example.com"
}

OTP Verification

POST /OTP_verification

Description: Verify the OTP sent to email

Request Body:

{
  "email": "user@example.com",
  "otp": "123456"
}

User Verify

POST /user_verify

Description: Verify user account


User Cancel

POST /user_cancel

Description: Cancel user verification


Forgot Password Verification

POST /forgotpassword_verification

Description: Send OTP for password reset

Request Body:

{
  "email": "user@example.com"
}

Change Password

POST /change_password

Description: Update user password

Request Body:

{
  "userid": 123,
  "old_password": "oldpass",
  "new_password": "newpass"
}

Resend Email Verification

POST /resend_email_verification

Description: Resend verification email


Update Profile

POST /update_profile

Description: Update user profile information

Request Body:

{
  "userid": 123,
  "name": "John Doe",
  "email": "new@example.com"
}

Get User Profile

POST /get_user_profile

Description: Retrieve user profile details

Request Body:

{
  "userid": 123
}

5.2 REPORT ENDPOINTS


Get Reports

POST /get_report

Description: Get all reports for a user

Request Body:

{
  "userid": 123,
  "version": 1
}

Response:

{
  "status": "success",
  "messageid": "SUCCESSFULLY_LOAD_STORIES",
  "message": "Reports loaded successfully",
  "data": [
    {
      "id": 456,
      "title": "Strategic Analysis 2026",
      "status": "done",
      "progress": 100,
      "date": "January 17, 2026, 14:30",
      "kg_progress": true
    }
  ]
}

Get Report Info

POST /get_report_info

Description: Get detailed information about a specific report

Request Body:

{
  "reportId": 456
}

Get Report Count

POST /get_report_count

Description: Get total number of reports for a user

Request Body:

{
  "userid": 123
}

Get Report Table Data

GET /get_report_table_data

Description: Get all reports for admin dashboard display


Get Report Order Info

POST /get_report_order_info

Description: Get order information about a report


Delete Report

POST /delete_report

Description: Delete a specific report

Request Body:

{
  "reportId": 456
}

Archive Report

POST /archive_report

Description: Archive a report

Request Body:

{
  "reportId": 456
}

Get Archive Report

POST /get_archive_report

Description: Get archived reports


Get Admin Report

POST /get_admin_report

Description: Get admin-level report data (Protected)


5.3 STORY/AI GENERATION ENDPOINTS


Queue Generate Story (Protected)

POST /queue_generatestory

Description: Queue a story generation request

Authentication: Cookie-based JWT required

Request Body:

{
  "reportId": 456,
  "userid": 123
}

Latest Generate Story (Protected)

POST /latest_generate_story

Description: Generate story using latest AI model (GPT 3.5+)

Authentication: Cookie-based JWT required


Get AI Story

POST /get_aistory

Description: Retrieve AI-generated story content

Request Body:

{
  "reportId": 456,
  "storyId": 789
}

Get Generation Status

GET /get_generationstatus

Description: Check the status of report generation

Query Parameters:

?reportId=456

Save Story

POST /save_story

Description: Save user's created story

Request Body:

{
  "userid": 123,
  "story": "Story content here..."
}

Get Save Story

POST /get_savestory

Description: Retrieve saved story data


Update User Story

POST /update_userstory

Description: Update existing user story


5.4 TEAM/SESSION ENDPOINTS


Queue Generate Team (Protected)

POST /queue_generateteam

Description: Queue team answer generation

Authentication: Cookie-based JWT required


Save Session

POST /save_session

Description: Save a team session

Request Body:

{
  "sessionName": "Q1 Strategy Session",
  "participants": ["user1@example.com", "user2@example.com"]
}

Continue Save Session

GET /continuesavesession

Description: Continue saved session workflow


Get Sessions

POST /get_sessions

Description: Get all sessions for a user

Request Body:

{
  "userid": 123
}

Get Session ID

POST /get_sessionID

Description: Get specific session by ID


5.5 PROMPT MANAGEMENT ENDPOINTS


Create Prompt

POST /create_prompt

Description: Create a new prompt template

Request Body:

{
  "name": "New Prompt",
  "content": "Prompt content...",
  "categoryId": 1
}

Edit Prompt

POST /edit_prompt

Description: Edit existing prompt template


Delete Prompt

POST /delete_prompt

Description: Delete a prompt template


Get Prompt

POST /get_prompt

Description: Retrieve prompt details


Get Prompt Types

POST /get_prompt_types

Description: Get all prompt types


Get Prompt Chapters

POST /get_prompt_chapters

Description: Get prompt chapters


Get Active Chapters

POST /get_active_chapters

Description: Get chapters with at least one active prompt


Get Archived Chapters

POST /get_archived_chapters

Description: Get archived chapters


Get Archived Prompts

POST /get_archived_prompts

Description: Get archived prompts


Archive Prompt

POST /archive_prompt

Description: Archive a prompt


Restore Prompt

POST /restore_prompt

Description: Restore archived prompt


Create Prompt Type

POST /create_prompt_type

Description: Create new prompt type/chapter


Edit Prompt Type

POST /edit_prompt_type

Description: Edit prompt type


Archive Prompt Type

POST /archive_prompt_type

Description: Archive a prompt type


Restore Prompt Type

POST /restore_prompt_type

Description: Restore archived prompt type


Update Prompt Order

POST /update_promptorder

Description: Update the order of prompts


Update Prompt Status

POST /update_promptstatus

Description: Update prompt active/inactive status


Update Chapter Order

POST /update_chapterorder

Description: Update the order of chapters


Update Prompt Category

POST /update_promptcategory

Description: Update prompt category


Delete Prompt Category

POST /delete_promptcategory

Description: Delete a prompt category


Restore Prompt Category

POST /restore_promptcategory

Description: Restore deleted category


Test Prompt

POST /test_prompt

Description: Test a prompt with AI


Queue Test Prompt (Protected)

POST /queue_testprompt

Description: Queue a test prompt execution

Authentication: Cookie-based JWT required


Get Test Status

GET /get_teststatus

Description: Get test prompt execution status


5.6 QUESTION MANAGEMENT ENDPOINTS


Create Question

POST /create_question

Description: Create new questions in a category

Request Body:

{
  "questions": ["Question 1?", "Question 2?"],
  "categoryid": 1
}

Edit Question

POST /edit_question

Description: Edit an existing question

Request Body:

{
  "questionid": 123,
  "question": "Updated question text?",
  "categoryid": 1
}

Delete Question

POST /delete_question

Description: Delete a question


Get Questions

POST /get_questions

Description: Get questions by category

Request Body:

{
  "categoryID": 1
}

Create Question Category

POST /create_question_category

Description: Create new question category

Request Body:

{
  "name": "Category Name",
  "description": "Category description",
  "type": "survey"
}

Edit Question Category

POST /edit_question_category

Description: Edit question category


Delete Question Category

POST /delete_question_category

Description: Delete category and its questions


Get Question Categories

GET /get_question_categories

Description: Get all question categories


Get Question Categories By Type

POST /get_question_categories_by_type

Description: Get categories filtered by type

Request Body:

{
  "Type": "survey"
}

Valid Types: mylife, myteam, survey, ct


Update Category Priority

POST /update_category_priority

Description: Update category ordering

Request Body:

[
  {"categoryid": 1, "priority": 1},
  {"categoryid": 2, "priority": 2}
]

Update Question Priority

POST /update_question_priority

Description: Update question ordering


5.7 REPORT ANSWER ENDPOINTS


Save Report Answer

POST /save_report_answer

Description: Save user answers to report questions

Request Body:

{
  "reportID": 456,
  "userID": 123,
  "questionAnswers": [
    {"questionid": 1, "answer": "User's answer"},
    {"questionid": 2, "answer": "Another answer"}
  ]
}

Get Report Answers By Category

POST /get_report_answers_by_category

Description: Get answers by category

Request Body:

{
  "reportID": 456,
  "userID": 123,
  "categoryID": 1
}

Get Report Answers From Story

POST /get_report_answers_from_story

Description: Get answers associated with a story


Get All Report Answers By Owner

POST /get_all_report_answers_by_owner

Description: Get all answers by report owner


Get All Answers By Report

POST /get_all_answers_by_report

Description: Get all answers for a specific report


5.8 SHARING ENDPOINTS


Share Report

POST /share_report

Description: Create shareable link for report

Request Body:

{
  "reportId": 456,
  "emails": ["recipient@example.com"]
}

Verify Share ID

POST /verify_shareid

Description: Verify a share link is valid

Request Body:

{
  "shareId": "abc123xyz"
}

Save Share Report Answer

POST /save_share_report_answer

Description: Save answers from shared report


Get Share Report Answer

POST /get_share_report_answer

Description: Get answers from shared report


Save Public Report Answer

POST /save_public_report_answer

Description: Save answers for public reports


Get Public Report Answer

POST /get_public_report_answer

Description: Get public report answers


Get All Shared Report Responses

POST /get_all_shared_report_responses

Description: Get all shared responses for a report


Get All Shared Report Responses By Question

POST /get_all_shared_report_responses_by_question

Description: Get shared responses filtered by question


Get All Shared Report Responses By Category

POST /get_all_shared_report_responses_by_category

Description: Get shared responses filtered by category


Get All Shared Report Responses By Share ID

POST /get_all_shared_report_responses_by_share_id

Description: Get responses for specific share ID


5.9 DOCUMENT MANAGEMENT ENDPOINTS


Create Document

POST /create_document

Description: Create a new document


Edit Document

POST /edit_document

Description: Edit existing document


Get All Documents

POST /get_all_documents

Description: Get all documents


Get Document By ID

POST /get_document_by_id

Description: Get specific document


Get Document Content

POST /get_document_content

Description: Get document contents


Get Shared Document Content

POST /get_shared_document_content

Description: Get shared document contents


Get Included Documents

GET /get_included_documents

Description: Get included documents


Update Document Order

POST /update_document_order

Description: Update document ordering


Upload Document Image

POST /upload_document_image

Description: Upload image for document


5.10 SURVEY ENDPOINTS


Save Survey

POST /save_survey

Description: Save survey data


Save Survey Answers

POST /save_survey_answers

Description: Store survey responses


Survey Response Queue

POST /survey_response

Description: Queue survey response generation


Get Survey Status

POST /get_survey_status

Description: Get survey generation status


Get Survey Answers

GET /get_survey_answers

Description: Get survey answers


Get All Survey Answers

GET /get_all_survey_answers

Description: Get all Have Your Say answers


Delete Have Your Say Answers

POST /delete_have_your_say_answers

Description: Delete survey responses


Get Survey Response Story

GET /get_survey_response_story

Description: Get generated survey response


5.11 COUPON ENDPOINTS


Create Coupon

POST /create_coupon

Description: Create a new coupon


Edit Coupon

POST /edit_coupon

Description: Edit existing coupon


Delete Coupon

POST /delete_coupon

Description: Delete a coupon


Get Coupon

POST /get_coupon

Description: Get coupon list/details


Generate Coupon

POST /generate_coupon

Description: Auto-generate coupon code


5.12 CHALLENGE ENDPOINTS


Create Challenge

POST /create_challenge

Description: Create new challenge


Update Challenge

POST /update_challenge

Description: Update challenge details


Update Challenge Blog

POST /update_challenge_blog

Description: Update challenge blog content


Delete Challenge

POST /delete_challenge

Description: Delete a challenge


Get Challenges

POST /get_challenges

Description: Get all challenges


Upload Image Challenge

POST /upload_image_challenge

Description: Upload challenge image


5.13 PDF GENERATION ENDPOINTS


Queue Generate PDF

POST /queue_generatepdf

Description: Queue PDF generation


Queue Public Generate PDF

POST /queue_public_generatepdf

Description: Queue public PDF generation


Queue Shared Generate PDF

POST /queue_shared_generatepdf

Description: Queue shared PDF generation


5.14 PAYMENT ENDPOINTS


Buy Report (Protected)

GET /buyreport

Description: Initiate PayPal transaction

Authentication: Cookie-based JWT required

Query Parameters:

?currency=USD&amount=99.00&version=3

Continue Buy Report

GET /continuebuyreport

Description: Continue payment after PayPal redirect


Create Receipt

POST /create_receipt

Description: Create payment receipt


Get Bill

POST /get_bill

Description: Get billing information


Get Receipt Count

POST /get_receipt_count

Description: Get number of receipts


Get Receipt By Report ID

POST /get_receipt_by_report_id

Description: Get receipt for specific report


5.15 SEARCH & ANALYSIS ENDPOINTS


POST /queue_basic_search

Description: Queue basic search operation

Authentication: Cookie-based JWT required


Get Basic Search Status

GET /get_basic_search_status

Description: Get basic search status


POST /queue_kg_search

Description: Queue Knowledge Graph search

Authentication: Cookie-based JWT required


Get KG Search Status

GET /get_kg_search_status

Description: Get KG search status


KG Request

POST /kg_request

Description: Send Knowledge Graph request


Queue Generate Analysis (Protected)

POST /queue_generate_analysis

Description: Queue analysis generation

Authentication: Cookie-based JWT required


Get Analysis Status

GET /get_analysis_status

Description: Get analysis generation status


5.16 FEEDBACK ENDPOINTS


Save Feedback

POST /save_feedback

Description: Save user feedback


POST /save_footer_feedback

Description: Save footer feedback


POST /get_footer_feedback

Description: Get footer feedback


POST /get_all_footer_feedback

Description: Get all footer feedback entries


POST /delete_footer_feedback

Description: Delete footer feedback


POST /update_footer_feedback

Description: Update footer feedback


Get Homepage Feedback

POST /get_homepage_feedback

Description: Get homepage reviews/feedback


Get Feedback Per User

GET /get_feedback_per_user

Description: Get feedback by user


5.17 ADMIN ENDPOINTS


Get Users And Total Reports

GET /get_users_and_total_reports

Description: Get all users with report counts


Check Password

POST /check_password

Description: Validate password


Check Report Privacy

POST /check_report_privacy

Description: Check report privacy settings


Update Public ID Report

POST /update_public_id_report

Description: Update report public ID


Restrict Email Spam

POST /restrict_email_spam

Description: Control email spam prevention


Add Subscription Client Monitoring

POST /add_subscription_client_monitoring

Description: Add client monitoring subscription


Get Subscriptions Client Monitoring

GET /get_subscriptions_client_monitoring

Description: Get all client monitoring subscriptions


5.18 UTILITY ENDPOINTS


POST /dropdown_content

Description: Get dropdown menu content


Get Email Address By User ID

POST /get_email_address_by_user_id

Description: Get email by user ID


GPT Response

POST /gpt_response

Description: Get GPT-generated questions


Global Response

POST /global_response

Description: Get global GPT response


Prompts API

POST /prompts

Description: Handle prompt operations for clients


Get Webtext Content

POST /get_webtext_content

Description: Get web text content


Get Personality

POST /get_personality

Description: Get user personality data



6. CODE EXAMPLES

6.1 JAVASCRIPT (NODE.JS) EXAMPLE

const axios = require('axios');

const BASE_URL = 'https://api.preempt.life';

// Create axios instance with cookie handling
const client = axios.create({
  baseURL: BASE_URL,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json'
  }
});

// Login
async function login(user, password) {
  try {
    const response = await client.post('/user_login', {
      user,
      password,
      version: 1
    });

    if (response.data.status === 'success') {
      console.log('Logged in:', response.data.data.userInfo);
      return response.data.data.userInfo;
    } else {
      throw new Error(response.data.message);
    }
  } catch (error) {
    console.error('Login failed:', error.message);
    throw error;
  }
}

// Get Reports
async function getReports(userid) {
  try {
    const response = await client.post('/get_report', {
      userid,
      version: 1
    });

    if (response.data.status === 'success') {
      return response.data.data;
    }
    throw new Error(response.data.message);
  } catch (error) {
    console.error('Failed to get reports:', error.message);
    throw error;
  }
}

// Usage
(async () => {
  try {
    const user = await login('user@example.com', 'password123');
    const reports = await getReports(user.userId);
    console.log('Reports:', reports);
  } catch (error) {
    console.error('Error:', error);
  }
})();

6.2 PYTHON EXAMPLE

import requests
import json

BASE_URL = 'https://api.preempt.life'

class PreemptClient:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'Content-Type': 'application/json'
        })

    def login(self, user: str, password: str) -> dict:
        """Login and store session cookie"""
        response = self.session.post(
            f'{BASE_URL}/user_login',
            json={
                'user': user,
                'password': password,
                'version': 1
            }
        )
        data = response.json()

        if data['status'] == 'success':
            return data['data']['userInfo']
        else:
            raise Exception(data['message'])

    def get_reports(self, userid: int) -> list:
        """Get all reports for a user"""
        response = self.session.post(
            f'{BASE_URL}/get_report',
            json={'userid': userid, 'version': 1}
        )
        data = response.json()

        if data['status'] == 'success':
            return data['data']
        else:
            raise Exception(data['message'])

    def create_question_category(self, name: str, description: str,
                                  category_type: str) -> dict:
        """Create a new question category"""
        response = self.session.post(
            f'{BASE_URL}/create_question_category',
            json={
                'name': name,
                'description': description,
                'type': category_type
            }
        )
        return response.json()

# Usage
if __name__ == '__main__':
    client = PreemptClient()

    try:
        user = client.login('user@example.com', 'password123')
        print(f"Logged in as: {user['name']}")

        reports = client.get_reports(user['userId'])
        print(f"Found {len(reports)} reports")

        for report in reports:
            print(f"  - {report['title']}: {report['status']}")
    except Exception as e:
        print(f"Error: {e}")

6.3 CURL EXAMPLES

Login:

curl -X POST https://api.preempt.life/user_login \
-H "Content-Type: application/json" \
-c cookies.txt \
-d '{
    "user": "user@example.com",
    "password": "password123",
    "version": 1
}'

Get Reports:

curl -X POST https://api.preempt.life/get_report \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
  "userid": 123,
  "version": 1
}'

Create Question:

curl -X POST https://api.preempt.life/create_question \
-H "Content-Type: application/json" \
-d '{
    "questions": ["What are your goals?", "What challenges do you face?"],
    "categoryid": 1
}'

Get Question Categories:

curl https://api.preempt.life/get_question_categories

7. ERROR HANDLING

7.1 ERROR RESPONSE FORMAT

All errors follow the standard response format:

{
  "status": "error",
  "messageid": "ERROR_CODE",
  "message": "Human readable error message"
}

7.2 COMMON ERROR CODES

Error CodeDescriptionResolution
INVALID_PAYLOADMissing or invalid request parametersCheck required fields
USER_NOT_FOUNDUser does not existVerify user credentials
FAILED_TO_LOGINAuthentication failedCheck password
UNVERIFIED_LOGINEmail not verifiedComplete verification
UNAUTHORIZEDJWT token invalid/expiredRe-authenticate
FORBIDDENInsufficient permissionsCheck user role
RESOURCE_NOT_FOUNDRequested resource doesn't existVerify resource ID
INTERNAL_ERRORServer-side errorRetry or contact support

7.3 HTTP STATUS CODES

Status CodeMeaningUse Case
200OKSuccessful requests
301RedirectPayPal payment redirects
400Bad RequestInvalid payload
401UnauthorizedMissing/invalid auth
403ForbiddenInsufficient permissions
404Not FoundResource not found
500Internal Server ErrorServer error

7.4 ERROR HANDLING BEST PRACTICES

async function makeApiCall(endpoint, data) {
  try {
    const response = await client.post(endpoint, data);

    if (response.data.status === 'error') {
      // Handle API-level errors
      switch (response.data.messageid) {
        case 'INVALID_PAYLOAD':
          throw new ValidationError(response.data.message);
        case 'UNAUTHORIZED':
          // Re-authenticate
          await refreshAuth();
          return makeApiCall(endpoint, data);
        default:
          throw new ApiError(response.data.message);
      }
    }

    return response.data;
  } catch (error) {
    if (error.response) {
      // HTTP error
      console.error('HTTP Error:', error.response.status);
    }
    throw error;
  }
}

8. RATE LIMITING

8.1 API THROTTLING LIMITS

The PreEmpt.Life API uses AWS API Gateway throttling to ensure fair usage and system stability.

Default Rate Limits:

Limit TypeValueScope
Steady-State Rate10,000 requests/secondPer API
Burst Limit5,000 requestsPer API
Per-Client Rate100 requests/secondPer IP/Client
Timeout29 secondsPer request

Lambda Function Limits:

Limit TypeValueNotes
Standard Timeout300 seconds (5 min)Most endpoints
Long-Running Timeout900 seconds (15 min)AI generation, PDF creation
Concurrent Executions1,000Per account/region

8.2 ENDPOINT-SPECIFIC LIMITS

Some endpoints have specific rate limits due to resource intensity:

Endpoint CategoryRate LimitReason
/queue_generatestory10 req/minOpenAI API quota
/queue_generate_analysis10 req/minAI processing
/queue_generatepdf20 req/minPDF generation load
/buyreport30 req/minPayment processing
/email_verification5 req/minEmail spam prevention
/restrict_email_spam5 req/minAnti-spam measures

8.3 RATE LIMIT HEADERS

Responses include rate limit headers when approaching limits:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1705673400
Retry-After: 60
HeaderDescription
X-RateLimit-LimitMaximum requests allowed per window
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when limit resets
Retry-AfterSeconds to wait before retrying (on 429)

8.4 RATE LIMIT EXCEEDED RESPONSE

When rate limits are exceeded, the API returns:

{
  "statusCode": 429,
  "message": "Too Many Requests",
  "retryAfter": 60
}

8.5 HANDLING RATE LIMITS

JavaScript Example:

async function makeRequestWithRetry(endpoint, data, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await client.post(endpoint, data);
      return response.data;
    } catch (error) {
      if (error.response?.status === 429) {
        const retryAfter = error.response.headers['retry-after'] || 60;
        console.log(`Rate limited. Retrying in ${retryAfter}s...`);
        await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
      } else {
        throw error;
      }
    }
  }
  throw new Error('Max retries exceeded');
}

Python Example:

import time

def make_request_with_retry(endpoint, data, max_retries=3):
  for attempt in range(max_retries):
    try:
      response = session.post(f'{BASE_URL}{endpoint}', json=data)
      if response.status_code == 429:
        retry_after = int(response.headers.get('Retry-After', 60))
        print(f"Rate limited. Retrying in {retry_after}s...")
        time.sleep(retry_after)
        continue
      return response.json()
    except Exception as e:
      raise e
  raise Exception('Max retries exceeded')

8.6 BEST PRACTICES

  1. Implement Exponential Backoff

    const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
  2. Cache Responses

    • Cache GET responses for static data
    • Use ETags for conditional requests
  3. Batch Requests

    • Combine multiple operations where possible
    • Use bulk endpoints when available
  4. Monitor Usage

    • Track X-RateLimit-Remaining header
    • Slow down before hitting limits
  5. Queue Long Operations

    • Use async endpoints (/queue_*) for heavy operations
    • Poll status endpoints instead of waiting synchronously
  6. Respect Retry-After

    • Always wait the specified duration before retrying
    • Don't hammer the API after receiving a 429

9. SUPPORT & RESOURCES

Technical Resources

Environments

EnvironmentConfiguration FileUse Case
Developmentsamconfig.dev.tomlDevelopment testing
Testsamconfig.test.tomlIntegration testing
Stagingsamconfig.staging.tomlPre-production
Sandboxsamconfig.sandbox.tomlFeature testing
Productionsamconfig.prod.tomlLive environment

Database Schema

Core Tables:

  • users - User accounts (id, username, email, password, verified, role)
  • savestory - Saved stories (id, userid, mystory)
  • savesurvey - Survey data
  • questioncategories - Question categories (id, name, description, type, priority)
  • formquestions - Questions (id, question, category_id)
  • reportanswers - User answers (userID, reportID, questionID, answer, date_answered)

PreEmpt.Life API Documentation
Version 1.0
Last Updated: January 19, 2026
Next Review: April 19, 2026