Join the RebelShip Community Discord

shippingmanager.cc - Unofficial API Reference

Keep a weather eye open, mateys: This here map was forged by pickin' apart the loot and may hide errors or sea monsters lurkin' in the deep. This be an incomplete chart - many waters remain uncharted, and the old sea dog who scribbled this might've had one too many rums. If ye spot mistakes or missin' treasures, show some mercy to this humble cartographer!

Furthermore, hear ye this warnin': Sailin' the API tides without the official vessel likely breaks the Articles (ToS). Ye sail strictly at yer own peril! If the Governor catches ye, ye might be made to walk the plank and be banned from the game forever!

Mark ye well - these answers have been scrubbed clean and act as false flags. They don't reflect reality for reasons best kept silent. A savvy sailor will understand why! ;)


Authentication & User Management

Login

Endpoint: POST /api/auth/login
Request:
{
  "token": "d91237c8f-fufu-4243-baba-a631b80a1234"
}

Response:
{
  "data": {
    "user": {
      "id": 1234567,
      "company_name": "My Shipping Co",
      "difficulty": "easy",
      "company_type": ["container", "tanker"],
      "status": "active",
      "hub": "hamburg",
      "user_image": null,
      "cash": 11164061,
      "fuel": 5345875,
      "co2": 65000000,
      "points": 3,
      "stock": 956.81,
      "stock_trend": "up",
      "language": "en-GB",
      "reputation": 84,
      "created_at": "2025-09-25T21:51:35.000000Z",
      "is_admin": 0,
      "time_last_login": 1700000000
    },
    "settings": {
      "max_co2": 55000000,
      "max_fuel": 5750000,
      "stock_for_sale": 0,
      "stock_total": 75000,
      "training": 1,
      "tutorial_step": 20,
      "zoom": 0,
      "maps": null,
      "speed": null,
      "metropolis": 0,
      "anchor_points": 121,
      "drydock_count": 93,
      "ceo_level": 38,
      "experience_points": 26632,
      "staff_training_points": 3,
      "levelup_experience_points": 28508,
      "anchor_next_build": 1700000000,
      "modifiers": { "speed_up": { "expires_at": 1700000000 } }
    }
  }
}

Steam Login

Endpoint: POST /api/auth/steam-login
Request:
{
  "steam_ticket": "..."
}

Response:
{
  "data": {
    "user": {
      "id": 1234567,
      "company_name": "My Shipping Co",
      "difficulty": "easy",
      "company_type": ["container", "tanker"],
      "status": "active",
      "hub": "hamburg",
      "user_image": null,
      "cash": 11164061,
      "fuel": 5345875,
      "co2": 65000000,
      "points": 3,
      "stock": 956.81,
      "stock_trend": "up",
      "language": "en-GB",
      "reputation": 84,
      "created_at": "2025-09-25T21:51:35.000000Z",
      "is_admin": 0,
      "time_last_login": 1700000000
    },
    "settings": {
      "max_co2": 55000000,
      "max_fuel": 5750000,
      "stock_for_sale": 0,
      "stock_total": 75000,
      "anchor_points": 121,
      "drydock_count": 93,
      "experience_points": 26632,
      "staff_training_points": 3,
      "modifiers": { "speed_up": { "expires_at": 1700000000 } }
    }
  }
}

Notes:
  • Used by Steam client for authentication
  • Returns same structure as regular login

Get Access Token

Endpoint: POST /api/auth/get-access-token
Request:
{}

Response:
{
  "data": {
    "user_id": 1234567,
    "is_signup": false,
    "access_token": "d9d47c8f-ac70-4a43-8be3-a631b80a08d1"
  }
}

Notes:
  • Returns access token for API authentication
  • is_signup: true if this is a new account

Set Language

Endpoint: POST /api/user/set-language
Request:
{
  "language": "en-GB"
}

Response:
{
  "data": {
    "success": true
  },
  "user": {
    "id": 1234567,
    "company_name": "My Shipping Co",
    "difficulty": "easy",
    "company_type": ["container", "tanker"],
    "status": "active",
    "co2": 50000000,
    "fuel": 5000000,
    "cash": 10000000,
    "hub": "hamburg",
    "points": 10,
    "stock_value": 500.00,
    "stock_trend": "up",
    "stock_midnight_value": 490.00,
    "ipo": 1,
    "reputation": 80,
    "created_at": "2025-01-01T00:00:00.000000Z",
    "checklist_done": 1,
    "made_purchase": true,
    "is_admin": 0,
    "is_guest": false,
    "language": "en-GB",
    "global_sales": [],
    "popup_alerts": null,
    "ceo_level": 30,
    "experience_points": 20000,
    "levelup_experience_points": 22000,
    "current_level_experience_points": 18000,
    "staff_training_points": 2
  }
}

Notes:
  • Supported languages: en-GB, de-DE, es-ES, fr-FR, pt-BR, etc.

Get User Settings

Endpoint: POST /api/user/get-user-settings
Request:
{}

Response:
{
  "data": {
    "settings": {
      "max_co2": 55000000,
      "max_fuel": 5750000,
      "stock_for_sale": 0,
      "stock_total": 75000,
      "training": 1,
      "tutorial_step": 20,
      "zoom": 0,
      "maps": null,
      "speed": null,
      "metropolis": 0,
      "anchor_points": 100,
      "drydock_count": 50,
      "ceo_level": 30,
      "experience_points": 20000,
      "staff_training_points": 2,
      "levelup_experience_points": 22000,
      "anchor_next_build": 1700000000,
      "modifiers": {
        "speed_up": {
          "expires_at": 1700000000
        }
      }
    }
  },
  "user": {
    "id": 1234567,
    "company_name": "My Shipping Co",
    "difficulty": "easy",
    "company_type": ["container", "tanker"],
    "status": "active",
    "co2": 50000000,
    "fuel": 5000000,
    "cash": 10000000,
    "hub": "hamburg",
    "points": 10,
    "stock_value": 500.00,
    "stock_trend": "up",
    "stock_midnight_value": 490.00,
    "ipo": 1,
    "reputation": 80,
    "created_at": "2025-01-01T00:00:00.000000Z",
    "checklist_done": 1,
    "made_purchase": true,
    "is_admin": 0,
    "is_guest": false,
    "language": "en-GB",
    "global_sales": [],
    "popup_alerts": null,
    "ceo_level": 30,
    "experience_points": 20000,
    "levelup_experience_points": 22000,
    "current_level_experience_points": 18000,
    "staff_training_points": 2
  }
}

Returns:
User profile, preferences, tutorial status, difficulty mode, home port

Get Company Info

Endpoint: POST /api/user/get-company
Request:
{
  "user_id": 1234567
}

Response:
{
  "data": {
    "achievements": {
      "achievements": [
        {
          "type": "dry_ops",
          "goal": 1,
          "target": null,
          "progress": 1,
          "time_completed": 1700000000
        },
        {
          "type": "millionaire",
          "goal": 1,
          "target": 10000000,
          "progress": 1,
          "time_completed": 1700000000
        }
      ],
      "total_points": 500,
      "total_points_user": 100,
      "achievements_done": 10
    },
    "company": {
      "company_name": "Target Company",
      "hub": "rotterdam",
      "company_type": ["container"],
      "stock_value": 100.50,
      "reputation": 85,
      "difficulty": "easy",
      "stock_trend": "up",
      "total_vessels": 10,
      "total_routes": 8,
      "created_at": "2025-01-01T00:00:00.000000Z",
      "stock_for_sale": 0,
      "stock_total": 25000,
      "level": 15,
      "total_departures": 500,
      "total_teus": 50000,
      "total_barrels": 0,
      "fuel_capacity": 5000000,
      "co2_capacity": 50000000
    },
    "alliance": {
      "id": 12345,
      "name": "Sample Alliance"
    }
  },
  "user": { ... }
}

Returns:
Company name, registration date, statistics

Get Weekly Transactions

Endpoint: POST /api/user/get-weekly-transactions
Request:
{}

Response:
{
  "data": {
    "transactions": [
      {
        "cash": -2500000,
        "context": "fuel_purchased",
        "time": 1700000000
      },
      {
        "cash": 2000000,
        "context": "vessels_departed",
        "time": 1700000100
      },
      {
        "cash": -400000,
        "context": "harbor_fee_on_depart",
        "time": 1700000100
      },
      {
        "cash": -500000,
        "context": "co2_emission_quota",
        "time": 1700000200
      },
      {
        "cash": -100000,
        "context": "bulk_wear_maintenance",
        "time": 1700000300
      },
      {
        "cash": -550000,
        "context": "salary_payment",
        "time": 1700000400
      },
      {
        "cash": -1200000,
        "context": "buy_vessel",
        "time": 1700000500
      },
      {
        "cash": -50000,
        "context": "route_fee_on_creating",
        "time": 1700000600
      },
      {
        "cash": -2800000,
        "context": "marketing_campaign_activation",
        "time": 1700000700
      }
    ]
  },
  "user": { ... }
}

Returns:
Income, expenses, profit/loss for the past 7 days

Search Users

Endpoint: POST /api/user/search
Request:
{
  "name": "foo"
}

Response:
{
  "data": {
    "companies": [
      {
        "id": 1234567,
        "company_name": "Foo Shipping",
        "difficulty": "easy",
        "company_type": ["container"],
        "status": "active",
        "hub": "rotterdam",
        "user_image": null,
        "cash": 5000000,
        "fuel": 500000,
        "co2": 20000000,
        "points": 50,
        "stock": 150.50,
        "stock_trend": "up",
        "language": "en-GB",
        "reputation": 80,
        "created_at": "2025-01-01T00:00:00.000000Z",
        "is_admin": 0,
        "time_last_login": 1700000000
      },
      {
        "id": 2345678,
        "company_name": "Foobar Transport",
        "difficulty": "realism",
        "company_type": ["container", "tanker"],
        "status": "active",
        "hub": "hamburg",
        "user_image": null,
        "cash": 10000000,
        "fuel": 800000,
        "co2": 30000000,
        "points": 100,
        "stock": 200.00,
        "stock_trend": "down",
        "language": "en-GB",
        "reputation": 90,
        "created_at": "2025-02-01T00:00:00.000000Z",
        "is_admin": 0,
        "time_last_login": 1700100000
      }
    ]
  },
  "user": { ... }
}

Returns:
List of users matching the search term (partial company name match)

Rename Company

Endpoint: POST /api/user/rename-company
Request:
{
  "name": "New Company Name"
}
Response (Not Enough Points):
{
  "error": "not_enough_points",
  "user": { ... }
}

Log Tutorial Progress

Endpoint: POST /api/user/log-tutorial-progress
Request:
{
  "step": 5
}

Response:
FIXME

Game State

Game Index (Main State)

Endpoint: POST /api/game/index
Request:
{}

Response:
{
  "data": {
    "ports": [
      {
        "id": 1,
        "code": "hamburg",
        "country": "DE",
        "full_country": "Germany",
        "size": "XL",
        "vessel_limit": "L",
        "drydock": "L",
        "metropolis": 1,
        "lat": "53.54",
        "lon": "9.99",
        "market_price": 90,
        "demand_policy": {
          "container": 50,
          "tanker": 50,
          "dry": 50,
          "refrigerated": 50,
          "crude_oil": 50,
          "fuel": 50
        },
        "demand": [],
        "consumed": []
      }
    ],
    "user_vessels": [ ... ],
    "routes": [ ... ],
    "staff": { ... },
    "settings": { ... }
  },
  "user": { ... }
}

Returns:
Complete game state including:
  • User data (cash, fuel, CO2, points)
  • All vessels with current status
  • Routes and demands
  • Staff information
  • Settings
This is the most important endpoint - it returns the full game state

Give Frontend Checklist Item

Endpoint: POST /api/checklist/give-frontend-checklist-item
Request:
{
  "checklist_key": "first_departure"
}

Response:
FIXME

Store Feedback

Endpoint: POST /api/game/store-feedback
Request:
{
  "data": { "rating": 5, "comment": "Great game!" }
}

Response:
FIXME

Vessels

Get Vessel History

Endpoint: POST /api/vessel/get-vessel-history
Request:
{
  "vessel_id": 87654321
}

Response:
{
  "data": {
    "user_vessel": {
      "id": 12345678,
      "name": "MS Example",
      "type_name": "Feeder",
      "engine_type": "dac_22_95",
      "current_port_code": "hamburg",
      "price": 15000000,
      "year": 2005,
      "max_speed": 16,
      "capacity_max": { "dry": 1000, "refrigerated": 1000 },
      "capacity": { "dry": 850, "refrigerated": 750 },
      "status": "port",
      "routes": [ ... ],
      "active_route": { ... }
    },
    "vessel_history": [
      {
        "vessel_id": 12345678,
        "route_origin": "hamburg",
        "route_destination": "rotterdam",
        "route_name": "route12345",
        "total_distance": 500,
        "fuel_used": 150000,
        "route_income": 500000,
        "wear": 3,
        "cargo": { "dry": 800, "refrigerated": 700 },
        "duration": 5000,
        "created_at": "2025-01-15 10:30:00"
      },
      {
        "vessel_id": 12345678,
        "route_origin": "rotterdam",
        "route_destination": "hamburg",
        "route_name": "route12345",
        "total_distance": 500,
        "fuel_used": 150000,
        "route_income": 480000,
        "wear": 4,
        "cargo": { "dry": 750, "refrigerated": 680 },
        "duration": 5000,
        "created_at": "2025-01-15 12:00:00"
      }
    ]
  },
  "user": { ... }
}

Returns:
Complete trip history for a specific vessel including:
  • vessel_history: Array of all completed trips with:
  • route_origin / route_destination: Ports traveled
  • route_name: Route identifier
  • total_distance: Distance in km
  • fuel_used: Actual fuel consumed in kg (CRITICAL)
  • route_income: Actual income earned in $ (CRITICAL)
  • wear: Wear accumulated on this trip
  • cargo.dry / cargo.refrigerated: Actual cargo carried
  • duration: Trip duration in seconds
  • created_at: Timestamp of trip completion
Example Calculations:
// Profit per trip
const fuel_cost = (fuel_used / 1000) * fuel_price_per_ton;
const co2_cost = (fuel_used * 12.8 / 1000) * co2_price_per_ton;
const profit = route_income - fuel_cost - co2_cost;

// Fuel efficiency
const fuel_efficiency = total_distance / (fuel_used / 1000);  // km/ton

// Profit per hour
const duration_hours = duration / 3600;
const profit_per_hour = profit / duration_hours;

Get Specific Vessels

Endpoint: POST /api/vessel/get-vessels
Request:
{
  "vessel_ids": [87654321, 98765432, 12341234]
}

Response:
{
  "data": {
    "user_vessels": [
      {
        "id": 12345678,
        "name": "MS Example",
        "type_name": "Feeder",
        "engine_type": "dac_22_95",
        "current_port_code": "hamburg",
        "imo": "93657",
        "mmsi": 12345678,
        "price": 12000000,
        "year": 1995,
        "length": 390,
        "width": 0,
        "gearless": 0,
        "range": 6000,
        "kw": 4000,
        "max_speed": 13,
        "capacity_max": { "dry": 737, "refrigerated": 737 },
        "capacity": { "dry": 519, "refrigerated": 456 },
        "capacity_type": "container",
        "prices": { "dry": 647, "refrigerated": 647 },
        "co2_factor": 1,
        "fuel_factor": 1.07,
        "fuel_capacity": 2500,
        "antifouling": null,
        "bulbous_bow": 0,
        "enhanced_thrusters": 0,
        "wear": "0.00",
        "hours_between_service": 350,
        "maintenance_start_time": 0,
        "maintenance_end_time": null,
        "next_route_is_maintenance": null,
        "hours_until_check": 86,
        "travelled_hours": 264,
        "total_distance_traveled": 158215,
        "route_guards": 0,
        "route_origin": "istanbul",
        "route_destination": "hamburg",
        "route_distance": 3575,
        "route_speed": 13,
        "route_name": "route12345",
        "route_end_time": 1700000000,
        "route_dry_operation": 0,
        "time_acquired": 1700000000,
        "time_arrival": 0,
        "type": "compressed/container/1475-TEU.jpg",
        "status": "port",
        "perks": null,
        "is_parked": false,
        "event_coordinates": null,
        "event_timestamp": null,
        "event_type": null,
        "delivery_price": null,
        "routes": [ ... ],
        "active_route": { ... },
        "arrives_in": 0
      }
    ]
  },
  "user": { ... }
}

Returns:
Detailed information for specified vessels

Get All User Vessels

Endpoint: POST /api/vessel/get-all-user-vessels
Request:
{
  "include_routes": false
}

Response:
{
  "data": {
    "user_vessels": [
      {
        "id": 12345678,
        "name": "MS Example",
        "type_name": "Feeder",
        "engine_type": "dac_22_95",
        "current_port_code": "hamburg",
        "imo": "93657",
        "mmsi": 12345678,
        "price": 12000000,
        "year": 1995,
        "length": 390,
        "width": 0,
        "gearless": 0,
        "range": 6000,
        "kw": 4000,
        "max_speed": 13,
        "capacity_max": { "dry": 737, "refrigerated": 737 },
        "capacity": { "dry": 519, "refrigerated": 456 },
        "capacity_type": "container",
        "prices": { "dry": 647, "refrigerated": 647 },
        "co2_factor": 1,
        "fuel_factor": 1.07,
        "fuel_capacity": 2500,
        "antifouling": null,
        "bulbous_bow": 0,
        "enhanced_thrusters": 0,
        "wear": "0.00",
        "hours_between_service": 350,
        "maintenance_start_time": 0,
        "maintenance_end_time": null,
        "next_route_is_maintenance": null,
        "hours_until_check": 86,
        "travelled_hours": 264,
        "total_distance_traveled": 158215,
        "route_guards": 0,
        "route_origin": null,
        "route_destination": null,
        "route_distance": null,
        "route_speed": 0,
        "route_name": null,
        "route_end_time": 0,
        "route_dry_operation": null,
        "time_acquired": 1700000000,
        "time_arrival": 0,
        "type": "compressed/container/1475-TEU.jpg",
        "status": "port",
        "perks": null,
        "is_parked": false,
        "event_coordinates": null,
        "event_timestamp": null,
        "event_type": null,
        "delivery_price": null,
        "routes": [],
        "active_route": {}
      }
    ]
  },
  "user": { ... }
}

Returns:
All vessels owned by user. Set include_routes: true to include route details.

Get All Acquirable Vessels

Endpoint: POST /api/vessel/get-all-acquirable-vessels
Request:
{}

Response:
{
  "data": {
    "vessels_for_sale": [
      {
        "id": 1,
        "name": "NAVICOM",
        "type_name": "Feeder",
        "engine_type": "dac_22_95",
        "current_port_code": "new_york_city",
        "imo": "53511",
        "mmsi": 15498654,
        "price": 1548000,
        "price_in_points": 0,
        "year": 2006,
        "length": 300,
        "width": 0,
        "gearless": 0,
        "kw": 1000,
        "range": 1000,
        "max_speed": 20,
        "capacity_max": 250,
        "capacity_type": "container",
        "co2_factor": 1,
        "fuel_factor": 1.39,
        "fuel_capacity": 2417,
        "antifouling": null,
        "type": "compressed/container/220-TEU.jpg",
        "perks": null,
        "only_for_credits": 0,
        "hours_between_service": 190,
        "time_arrival": 3000
      },
      {
        "id": 59,
        "name": "Starliner",
        "type_name": "VIP",
        "engine_type": "mih_x1",
        "current_port_code": "mina_jabal_ali",
        "imo": null,
        "mmsi": 0,
        "price": 360000000,
        "price_in_points": 2500,
        "year": 2023,
        "length": 1000,
        "width": 1000,
        "gearless": 0,
        "kw": 60000,
        "range": 17500,
        "max_speed": 40,
        "capacity_max": 28000,
        "capacity_type": "container",
        "co2_factor": 1,
        "fuel_factor": 1,
        "fuel_capacity": 0,
        "antifouling": null,
        "type": "VIP/VIP_Red.jpg",
        "perks": { "moreLoad": 50 },
        "only_for_credits": 1,
        "hours_between_service": 250,
        "time_arrival": 172800
      }
    ]
  }
}

Returns:
All vessels available for purchase from the shipyard

Show Acquirable Vessel Details

Endpoint: POST /api/vessel/show-acquirable-vessel
Request:
{
  "vessel_id": 59
}

Response:
{
  "data": {
    "vessels_for_sale": {
      "id": 59,
      "name": "Starliner",
      "type_name": "VIP",
      "engine_type": "mih_x1",
      "current_port_code": "mina_jabal_ali",
      "imo": null,
      "mmsi": 0,
      "price": 360000000,
      "price_in_points": 2500,
      "year": 2023,
      "length": 1000,
      "width": 1000,
      "gearless": 0,
      "kw": 60000,
      "range": 17500,
      "max_speed": 40,
      "capacity_max": 28000,
      "capacity_type": "container",
      "co2_factor": 1,
      "fuel_factor": 1,
      "fuel_capacity": 0,
      "antifouling": null,
      "type": "VIP/VIP_Red.jpg",
      "perks": { "moreLoad": 50 },
      "only_for_credits": 1,
      "hours_between_service": 250,
      "time_arrival": 172800
    }
  },
  "user": { ... }
}

Returns:
Detailed specs, purchase price, delivery time for a specific vessel type

Purchase Vessel

Endpoint: POST /api/vessel/purchase-vessel
Request:
{
  "vessel_id": 72,
  "name": "Aquavita",
  "adjust_speed": "4_blade_propeller",
  "antifouling_model": null,
  "enhanced_deck_beams": 0
}
Response (Success):
{
  "data": {
    "vessel": {
      "id": 12345678,
      "name": "Aquavita_6244",
      "type_name": "Feeder",
      "engine_type": "dac_22_95",
      "current_port_code": "benghazi",
      "imo": "93657",
      "mmsi": 84921744,
      "price": 12105900,
      "year": 1995,
      "length": 390,
      "width": 0,
      "gearless": 0,
      "range": 6000,
      "kw": 4000,
      "max_speed": 13,
      "capacity_max": { "dry": 737, "refrigerated": 737 },
      "capacity": null,
      "capacity_type": "container",
      "prices": null,
      "co2_factor": 1,
      "fuel_factor": 1.07,
      "fuel_capacity": 2500,
      "antifouling": null,
      "bulbous_bow": null,
      "enhanced_thrusters": null,
      "wear": null,
      "hours_between_service": 350,
      "maintenance_start_time": null,
      "maintenance_end_time": null,
      "next_route_is_maintenance": null,
      "hours_until_check": 350,
      "travelled_hours": 0,
      "total_distance_traveled": null,
      "route_guards": 0,
      "route_origin": null,
      "route_destination": null,
      "route_distance": null,
      "route_speed": 0,
      "route_name": null,
      "route_end_time": 0,
      "route_dry_operation": null,
      "time_acquired": 1700000000,
      "time_arrival": 17700,
      "type": "compressed/container/1475-TEU.jpg",
      "status": "pending",
      "perks": null,
      "is_parked": false,
      "event_coordinates": null,
      "event_timestamp": null,
      "event_type": null,
      "delivery_price": 45,
      "routes": null
    }
  },
  "user": { ... }
}
Response (Error):
{
  "error": "vessel_limit_reached",
  "user": { ... }
}

Get Vessel Sell Price

Endpoint: POST /api/vessel/get-sell-price
Request:
{
  "vessel_id": 18384637
}

Response:
{
  "data": {
    "selling_price": 5181991,
    "original_price": 6202944
  },
  "user": { ... }
}

Sell Vessel

Endpoint: POST /api/vessel/sell-vessel
Request:
{
  "vessel_id": 87654321
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Rename Vessel

Endpoint: POST /api/vessel/rename-vessel
Request:
{
  "vessel_id": <vessel_id>,
  "name": "<new_vessel_name>"
}
Parameters:
  • vessel_id: ID of the vessel to rename
  • name: New vessel name (2-30 characters)

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Notes:
  • Name must be between 2-30 characters
  • Special characters and HTML are sanitized
  • Name change is immediate and reflected across all UI
  • No cost to rename vessels

Park Vessel

Endpoint: POST /api/vessel/park-vessel
Request:
{
  "vessel_id": 87654321
}
Parameters:
  • vessel_id: ID of the vessel to park (moor)

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Resume Parked Vessel

Endpoint: POST /api/vessel/resume-parked-vessel
Request:
{
  "vessel_id": 87654321
}
Parameters:
  • vessel_id: ID of the parked vessel to resume

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Deliver Vessels (Instant Delivery)

Endpoint: POST /api/vessel/deliver-vessels
Request:
{
  "vessel_ids": "[87654321]"
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Notes:
  • Costs premium currency (points): Each vessel has a delivery_price
  • Instantly delivers pending vessels without waiting for delivery time
  • vessel_ids must be a JSON string (not array)
  • Returns {"error": "not_enough_points", "user": {...}} if insufficient points
  • Only works for vessels with status: "pending"

Build Custom Vessel

Endpoint: POST /api/vessel/build-vessel
Request:
{
  "name": "Pacific Explorer",
  "ship_yard": "hamburg",
  "vessel_model": "container",
  "engine_type": "mih_cp9",
  "engine_kw": 60000,
  "capacity": 13500,
  "antifouling_model": "type_a",
  "bulbous": 1,
  "enhanced_thrusters": 0,
  "range": 18000,
  "propeller_types": "4_blade_propeller"
}
Parameters:
  • name: Vessel name (2-30 characters)
  • ship_yard: Port code where vessel will be built
  • vessel_model: Vessel type ("container", "tanker", "bulker", etc.)
  • engine_type: Engine type (e.g., "mih_cp9")
  • engine_kw: Engine power in kilowatts
  • capacity: Cargo capacity in TEU/tons
  • antifouling_model: Antifouling coating type (e.g., "type_a")
  • bulbous: Bulbous bow (0 or 1)
  • enhanced_thrusters: Enhanced thrusters (0 or 1)
  • range: Maximum range in km
  • propeller_types: Propeller configuration (e.g., "4_blade_propeller")
Response (Success):
{
  "data": {
    "success": true
  },
  "user": { ... }
}
Response (Error - Vessel Limit Reached):
{
  "error": "vessel_limit_reached",
  "user": { ... }
}

Get Vessel Parts

Endpoint: POST /api/vessel/get-vessel-parts
Request:
{}

Response:
{
  "data": {
    "vessel_parts": [
      { "type": "antifouling", "model": "type_a", "price_factor": 0.0218, "co2": -0.1, "fuel": 0.01, "construction_time": 500 },
      { "type": "antifouling", "model": "type_b", "price_factor": 0.0218, "co2": 0.1, "fuel": -0.01, "construction_time": 500 },
      { "type": "bulbous", "price_factor": 0.0833, "co2": -0.03, "fuel": -0.03, "construction_time": 800 },
      { "type": "enhanced_thrusters", "price": 140, "channel_wait": 0.96, "dock_time": 0.9, "fuel": 1.01 },
      { "type": "propeller_types", "model": "4_blade_propeller", "speed": 0 },
      { "type": "propeller_types", "model": "5_blade_propeller", "speed": 0.08, "price_factor": 0.073 },
      { "type": "propeller_types", "model": "6_blade_propeller", "speed": 0.12, "price_factor": 0.114 },
      { "type": "enhanced_deck_beams", "increase_teu": 1.04, "price": 257 }
    ],
    "engines": [
      { "type": "mih_x1", "name": "MIH X1", "price_per_kw": 833, "min_output": 2500, "max_output": 11000 },
      { "type": "wartsila_syk_6", "name": "Wartsila SYK-6", "price_per_kw": 833, "min_output": 5000, "max_output": 15000 }
    ]
  },
  "user": { ... }
}


Vessel Events

Check Vessel Event

Endpoint: POST /api/vessel-event/check
Request:
{
  "vessel_id": 87654321
}
Parameters:
  • vessel_id: ID of the vessel to check for events

Response:
{
  "data": {
    "id": 1032536,
    "requested_amount": 2568000,
    "paid_amount": null,
    "user_proposal": null,
    "has_negotiation": 0,
    "round_end_time": 0,
    "status": "successful",
    "danger_zone_slug": "west_african_coast",
    "registered_at": 1700000000
  },
  "user": { ... }
}

Routes

Get Vessel Ports

Endpoint: POST /api/route/get-vessel-ports
Request:
{
  "user_vessel_id": 87654321
}

Response:
{
  "data": {
    "local": {
      "ports": [
        {
          "id": 157,
          "code": "hamburg",
          "country": "DE",
          "full_country": "Germany",
          "size": "L",
          "vessel_limit": "L",
          "drydock": "L",
          "metropolis": 1,
          "lat": "53.53042164",
          "lon": "9.9126393",
          "market_price": 92,
          "demand_policy": { "container": 57, "tanker": 43, "dry": 50, "refrigerated": 50, "crude_oil": 50, "fuel": 50 },
          "demand": [],
          "consumed": []
        }
      ]
    },
    "all": { "ports": [ ... ] },
    "metropolis": { "ports": [ ... ] }
  },
  "user": { ... }
}

Returns:
All ports that this specific vessel can travel to (based on vessel range/type)

Get Routes Between Ports

Endpoint: POST /api/route/get-routes-by-ports
Request:
{
  "port1": "hamburg",
  "port2": "new_york"
}

Response:
{
  "data": {
    "routes": [
      {
        "id": 35320,
        "path": [ { "lon": 153.178158, "lat": -27.361132 }, ... ],
        "port1": "hamburg",
        "port2": "rotterdam",
        "danger_zones_ids": null,
        "channels_ids": "NULL",
        "distances": [ 0.048, 0.047, ... ],
        "total_distance": 485,
        "status": "active",
        "hijacking_risk": 0,
        "creation_cost": 0,
        "channel_cost": 0
      }
    ],
    "reversed": false
  },
  "user": { ... }
}

Returns:
Available routes between two ports, including distance, travel time, demand

Get Suggested Route

Endpoint: POST /api/route/get-suggested-route
Request:
{
  "user_vessel_id": 87654321
}

Response:
{
  "suggested": {
    "routes": [
      {
        "id": 1435,
        "path": [ { "lon": -72.349, "lat": 18.556 }, ... ],
        "port1": "port_au_prince",
        "port2": "port_castries",
        "danger_zones_ids": [ "caribbean_sea" ],
        "channels_ids": "NULL",
        "distances": [ 0.037, 0.035, ... ],
        "total_distance": 994,
        "status": "active",
        "hijacking_risk": 14,
        "creation_cost": 18743,
        "channel_cost": 0
      }
    ]
  }
}

Create/Assign Route

Endpoint: POST /api/route/create-user-route
Request:
{
  "route_id": 35320,
  "user_vessel_id": 87654321,
  "speed": 12,
  "guards": 2,
  "dry_operation": 0,
  "price_dry": 500,
  "price_refrigerated": 500
}

Response:
{
  "data": {
    "user_vessel": {
      "id": 12345678,
      "name": "MS Example",
      "type_name": "Feeder",
      "current_port_code": "hamburg",
      "route_origin": "hamburg",
      "route_destination": "rotterdam",
      "route_distance": 485,
      "route_speed": 5,
      "route_name": "route22795",
      "route_end_time": 0,
      "status": "port",
      "routes": [ { "route_id": 35320, ... } ],
      "active_route": [],
      "arrives_in": 0
    }
  },
  "user": { ... }
}

Returns:
Success/failure of route assignment
Notes:
  • speed: 1-10 (affects fuel consumption and travel time)
  • guards: Number of security guards (0-5, reduces piracy risk)
  • dry_operation: 0 or 1 (whether vessel operates in dry mode)
  • Container vessels: price_dry, price_refrigerated (per TEU)
  • Tanker vessels: price_crude_oil, price_fuel (per barrel)

Update Route Data

Endpoint: POST /api/route/update-route-data
Request:
{
  "user_vessel_id": 18210536,
  "speed": 21,
  "guards": 0,
  "prices": {
    "dry": 496,
    "refrigerated": 496
  }
}

Response:
{
  "data": {
    "user_vessel": {
      "id": 12345678,
      "name": "MS Example",
      "type_name": "Feeder Max",
      "current_port_code": "hamburg",
      "route_origin": "hamburg",
      "route_destination": "rotterdam",
      "route_distance": 822,
      "route_speed": 21,
      "route_guards": 0,
      "prices": { "dry": 496, "refrigerated": 496 },
      "status": "port",
      "routes": [ { "route_id": 66427, ... } ],
      "active_route": { ... }
    }
  },
  "user": { ... }
}

Notes:
  • Updates speed, guards, and prices for an existing route
  • Only works for vessels at port or anchor (not enroute)
  • speed: 1 to vessel's max_speed
  • guards: 0-5 security guards
  • prices: Container: dry, refrigerated (per TEU) / Tanker: crude_oil, fuel (per barrel)

Depart Vessel on Route

Endpoint: POST /api/route/depart
Request:
{
  "user_vessel_id": 87654321,
  "speed": 8,
  "guards": 2,
  "history": 0
}

Response:
{
  "data": {
    "depart_info": {
      "depart_income": 6357,
      "fuel_usage": 627,
      "guard_payment": 0,
      "channel_payment": 0,
      "harbor_fee": 903,
      "teu_dry": 7,
      "teu_refrigerated": 8,
      "crude_oil": 0,
      "fuel": 0,
      "vessel_count": 1,
      "co2_emission": 14542,
      "crew_morale": 80,
      "management_morale": 81
    },
    "user_vessels": [
      {
        "id": 12345678,
        "name": "MS Example",
        "type_name": "Feeder",
        "current_port_code": "rotterdam",
        "status": "enroute",
        "route_origin": "hamburg",
        "route_destination": "rotterdam",
        "route_distance": 485,
        "route_speed": 5,
        "route_end_time": 1700000000,
        "arrives_in": 6125
      }
    ],
    "vessel_history": [
      {
        "vessel_id": 12345678,
        "route_origin": "hamburg",
        "route_destination": "rotterdam",
        "route_name": "route22795",
        "total_distance": 485,
        "fuel_used": 627,
        "route_income": 6357,
        "wear": 3,
        "cargo": { "dry": 7, "refrigerated": 8 },
        "duration": 6075,
        "created_at": "2025-01-15 10:30:00"
      }
    ]
  },
  "user": { ... }
}

Depart Vessel on COOP Route

Endpoint: POST /api/route/depart-coop
Request:
{
  "user_id": 1000001,
  "vessels": 2
}
Response (Success):
{
  "data": {
    "vessels_departed": 2,
    "message": "Successfully departed 2 vessels"
  },
  "user": { ... }
}
Response (Error):
{
  "error": "no_data",
  "user": {
    "popup_alerts": [
      {
        "type": "coop_departure",
        "data": {
          "error": "no_vessels_are_ready_to_depart",
          "values": { "company_name": "Target Company" }
        }
      }
    ]
  }
}

Depart All Ready Vessels

Endpoint: POST /api/route/depart-all
Request:
{}

Response:
{
  "data": {
    "depart_info": {
      "depart_income": 11978451,
      "fuel_usage": 10135528,
      "guard_payment": 0,
      "channel_payment": 0,
      "harbor_fee": 454344,
      "teu_dry": 9407,
      "teu_refrigerated": 8527,
      "crude_oil": 77222,
      "fuel": 71930,
      "vessel_count": 15,
      "co2_emission": 141251297,
      "crew_morale": 100,
      "management_morale": 99
    },
    "user_vessels": [
      {
        "id": 12345678,
        "name": "MS Example",
        "type_name": "Feeder",
        "current_port_code": "rotterdam",
        "status": "enroute",
        "route_origin": "hamburg",
        "route_destination": "rotterdam",
        "route_distance": 1756,
        "route_speed": 20,
        "route_end_time": 1700000000,
        "arrives_in": 7685
      }
    ]
  },
  "user": { ... }
}

Notes:
  • Departs all vessels that are ready and have routes assigned
  • No parameters needed - automatically finds all eligible vessels
  • Used by the game's "Depart All" button
  • Vessels without assigned routes are skipped
  • Moored vessels are skipped

Update Route Prices

Endpoint: POST /api/route/update-route-prices
Request:
{
  "user_vessel_id": 12345678,
  "price_dry": 500,
  "price_refrigerated": 500
}

Response:
FIXME

Route Research (DISABLED)

Endpoint: POST /api/route/research
Response:
{
  "reason": "no_method",
  "params": { "method": "research", "class": "RouteController" }
}

Notes:
THIS ENDPOINT DOES NOT EXIST ON THE SERVER - Returns 404

Ports

Get Port Information

Endpoint: POST /api/port/get-ports
Request:
{
  "port_code": ["hamburg", "new_york"]
}

Response:
{
  "data": {
    "port": [
      {
        "id": 4,
        "code": "baltimore",
        "country": "US",
        "full_country": "United states",
        "size": "XL",
        "vessel_limit": "L",
        "drydock": "L",
        "metropolis": 0,
        "lat": "39.25366917",
        "lon": "-76.54634907",
        "market_price": 83,
        "demand_policy": { "container": 47, "tanker": 53, "dry": 50, "refrigerated": 50, "crude_oil": 50, "fuel": 50 },
        "demand": { "container": { "dry": 70714, "refrigerated": 61029 }, "tanker": { "fuel": 6067553, "crude_oil": 7420395 } },
        "consumed": { "container": { "dry": 4539, "refrigerated": 3715 }, "tanker": { "fuel": 0, "crude_oil": 0 } }
      }
    ]
  },
  "user": { ... }
}

Returns:
Detailed port information (coordinates, fees, facilities)

Get Assigned Ports

Endpoint: POST /api/port/get-assigned-ports
Request:
{}

Response:
{
  "data": {
    "ports": [
      {
        "id": 1,
        "code": "boston_us",
        "country": "US",
        "full_country": "United states",
        "size": "XL",
        "vessel_limit": "L",
        "drydock": "L",
        "metropolis": 0,
        "lat": "42.35087678",
        "lon": "-71.03737001",
        "market_price": 85,
        "demand_policy": { "container": 61, "tanker": 39, "dry": 50, "refrigerated": 50, "crude_oil": 50, "fuel": 50 },
        "demand": { "container": { "dry": 114050, "refrigerated": 115886 }, "tanker": { "fuel": 4641487, "crude_oil": 5404596 } },
        "consumed": { "container": { "dry": 166, "refrigerated": 157 }, "tanker": { "fuel": 0, "crude_oil": 0 } }
      },
      ...
    ]
  },
  "user": { ... }
}

Returns:
List of ports assigned to the user based on alliance benefits and special unlocks

Get Alliance Data for Port

Endpoint: POST /api/alliance/get-alliance-data
Request:
{
  "port_code": "murmansk"
}

Response:
{
  "data": {
    "top_alliances": [
      { "id": 1234, "name": "Alliance One", "teu": 49442581, "bbl": 2063231232, "rank": 1 },
      { "id": 2345, "name": "Alliance Two", "teu": 44481543, "bbl": 2057336024, "rank": 2 },
      { "id": 3456, "name": "Alliance Three", "teu": 30592264, "bbl": 2809352322, "rank": 3 }
    ],
    "my_alliance": { "id": 4567, "name": "My Alliance", "teu": 17829740, "bbl": 1378085596, "rank": 9 }
  },
  "user": { ... }
}

Demand & Pricing

Auto-Price Route

Endpoint: POST /api/demand/auto-price
Request:
{
  "user_vessel_id": 87654321,
  "route_id": 12345
}

Response:
{
  "data": {
    "dry": 503,
    "ref": 503
  },
  "user": { ... }
}

Returns:
Calculated optimal pricing for this route based on current demand

Maintenance & Repair

Get Maintenance Status

Endpoint: POST /api/maintenance/get
Request:
{
  "vessel_ids": "[87654321, 87653421]"
}

Response:
{
  "data": {
    "vessels": [
      {
        "id": 12345678,
        "maintenance_data": [
          { "type": "wear", "duration": 0, "price": 0, "discounted_price": 0 },
          { "type": "drydock_major", "duration": 3600, "price": 60916, "discounted_price": 6091 },
          { "type": "drydock_minor", "duration": 1800, "price": 36549, "discounted_price": 3654 }
        ],
        "nearest_dry_dock": {
          "port": "hamburg",
          "distance": 485,
          "min_fuel": "0.6",
          "max_fuel": "0.8",
          "route_id": 35320,
          "route": { ... }
        }
      }
    ],
    "subsidy": {
      "rate": 0.9,
      "count": 93,
      "level": 100
    }
  },
  "user": { ... }
}

Returns:
Maintenance status, wear levels, repair costs for specified vessels
Notes:
  • vessel_ids is a JSON string (not array)

Get Maintenance Log

Endpoint: POST /api/maintenance/get-log
Request:
{}

Response:
{
  "data": {
    "logs": [
      {
        "action": "wear",
        "data": { "end_time": 1700000000, "vessel_id": 12345678 },
        "timestamp": 1700000000
      },
      {
        "action": "drydock_major",
        "data": { "end_time": 1700003600, "vessel_id": 12345679 },
        "timestamp": 1700000000
      }
    ]
  },
  "user": { ... }
}

Returns:
History of all maintenance performed

Bulk Drydock Maintenance

Endpoint: POST /api/maintenance/do-major-drydock-maintenance-bulk
Request:
{
  "vessel_ids": "[87653421,12345678]",
  "speed_factor": "maximum"
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success/failure, total cost
Notes:
  • speed_factor: "maximum" or "normal" (affects repair time and cost)

Bulk Wear Maintenance

Endpoint: POST /api/maintenance/do-wear-maintenance-bulk
Request:
{
  "vessel_ids": "[87653421,12345678]"
}
Parameters:
  • vessel_ids: JSON string containing array of vessel IDs to repair

Response:
{
  "data": {
    "user_vessels": [
      {
        "id": 12345678,
        "name": "MS Example",
        "type_name": "Feeder",
        "engine_type": "dac_22_95",
        "current_port_code": "hamburg",
        "wear": 0,
        "hours_until_check": 84,
        "travelled_hours": 215,
        "status": "enroute",
        ...
      }
    ]
  },
  "user": { ... }
}

Upgrade Vessel

Endpoint: POST /api/maintenance/upgrade-vessel
Request:
{
  "vessel_id": 18429537,
  "antifouling_model": "type_a",
  "bulbous": 1
}
Parameters:
  • vessel_id: The vessel ID to upgrade (required)
  • antifouling_model: "type_a", "type_b", or "type_c" (optional) - Antifouling coating type
  • bulbous: 1 to add bulbous bow, 0 or omit to skip (optional)

Response:
{
  "data": {
    "user_vessel": {
      "id": 12345678,
      "name": "MS Example",
      "type_name": "Feeder",
      "engine_type": "dac_22_95",
      "current_port_code": "hamburg",
      "co2_factor": 0.87,
      "fuel_factor": 1.06,
      "antifouling": "type_a",
      "bulbous_bow": true,
      "enhanced_thrusters": 0,
      "wear": "0.00",
      "hours_between_service": 300,
      "maintenance_start_time": 1700000000,
      "maintenance_end_time": 1700001300,
      "status": "maintenance",
      "is_parked": true,
      ...
    }
  },
  "user": { ... }
}

Returns:
Updated vessel data with upgrades applied

Pay Port State Control Audit

Endpoint: POST /api/maintenance/pay-audit
Request:
{}
Response (Success):
{
  "data": {
    "success": true
  },
  "user": { ... }
}
Response (No Audit):
{
  "error": "no_audit_in_progress",
  "user": { ... }
}


Bunker (Fuel & CO2)

Get Bunker Prices

Endpoint: POST /api/bunker/get-prices
Request:
{}

Response:
{
  "data": {
    "prices": [
      { "fuel_price": 840, "co2_price": 16, "time": "09:00", "day": 24 },
      { "fuel_price": 470, "co2_price": 21, "time": "09:30", "day": 24 },
      { "fuel_price": 350, "co2_price": 10, "time": "10:00", "day": 24 },
      ...
    ]
  },
  "user": { ... }
}

Returns:
Current fuel and CO2 prices per ton

Purchase Fuel

Endpoint: POST /api/bunker/purchase-fuel
Request:
{
  "amount": 2107
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success/failure, amount purchased, cost
Notes:
  • Amount is in tons

Purchase CO2

Endpoint: POST /api/bunker/purchase-co2
Request:
{
  "amount": 1194
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success/failure, amount purchased, cost
Notes:
  • Amount is in tons

Staff Management

Get User Staff

Endpoint: POST /api/staff/get-user-staff
Request:
{}

Response:
{
  "data": {
    "info": {
      "crew": { "group": "crew", "label": "very_happy", "percentage": 80 },
      "management": { "group": "management", "label": "very_happy", "percentage": 81 }
    },
    "staff": [
      {
        "type": "cfo",
        "abilities": null,
        "salary": 26115,
        "morale": "82.84",
        "amount": 1,
        "raise_salary_percent": 6,
        "cut_salary_percent": 3,
        "management_morale": { "group": "management", "label": "very_happy", "percentage": 81 },
        "crew_morale": { "group": "crew", "label": "very_happy", "percentage": 80 },
        "training": [
          { "level": 11, "perk": "shop_cash", "type_id": 1, "can_train": true, "requirements": [], "max_level": 20, "current_effect": 110, "next_level_effect": 120 },
          ...
        ],
        "training_max_level": 140,
        "training_current_level": 23
      },
      ...
    ]
  },
  "user": { ... }
}

Returns:
All staff members, salaries, satisfaction levels

Raise Staff Salary

Endpoint: POST /api/staff/raise-salary
Request:
{
  "type": "cfo"
}

Response:
{
  "data": {
    "staff": {
      "type": "coo",
      "abilities": null,
      "salary": 14400,
      "morale": 73,
      "amount": 1,
      "raise_salary_percent": 6,
      "cut_salary_percent": 3,
      "management_morale": { "group": "management", "label": "happy", "percentage": 74 },
      "crew_morale": { "group": "crew", "label": "very_happy", "percentage": 79 },
      "training": [ ... ],
      "training_max_level": 86,
      "training_current_level": 1
    }
  },
  "user": { ... }
}

Notes:
  • Staff types: ceo, cfo, cto, sales, etc.

Reduce Staff Salary

Endpoint: POST /api/staff/reduce-salary
Request:
{
  "type": "cfo"
}

Response:
{
  "data": {
    "staff": {
      "type": "coo",
      "abilities": null,
      "salary": 13585,
      "morale": 70,
      "amount": 1,
      "raise_salary_percent": 6,
      "cut_salary_percent": 3,
      "management_morale": { "group": "management", "label": "happy", "percentage": 73 },
      "crew_morale": { "group": "crew", "label": "very_happy", "percentage": 79 },
      "training": [ ... ],
      "training_max_level": 86,
      "training_current_level": 1
    }
  },
  "user": { ... }
}

Spend Training Point

Endpoint: POST /api/staff/spend-training-point
Request:
{
  "type": "cfo",
  "perk_type": "cheap_anchor_points"
}

Response:
{
  "data": {
    "staff": {
      "type": "cfo",
      "abilities": null,
      "salary": 26115,
      "morale": "82.84",
      "amount": 1,
      "raise_salary_percent": 6,
      "cut_salary_percent": 3,
      "management_morale": { "group": "management", "label": "very_happy", "percentage": 81 },
      "crew_morale": { "group": "crew", "label": "very_happy", "percentage": 80 },
      "training": [
        { "level": 11, "perk": "shop_cash", "type_id": 1, "can_train": true, "requirements": [], "max_level": 20, "current_effect": 110, "next_level_effect": 120 },
        { "level": 4, "perk": "lower_channel_fees", "type_id": 2, "can_train": true, "requirements": [], "max_level": 20, "current_effect": 10, "next_level_effect": 12 },
        ...
      ],
      "training_max_level": 140,
      "training_current_level": 24
    },
    "perk_modifiers": [
      { "perk_type": "shop_cash", "modifier": 110 },
      { "perk_type": "cheap_anchor_points", "modifier": 16 },
      ...
    ]
  },
  "user": { ... }
}

Returns:
Updated staff data with new perk level, perk modifiers, and remaining training points
Notes:
  • Staff types: cfo, coo, cmo, cto, captain, first_officer, boatswain, technical_officer
  • Use perk_type (string name), NOT perk_type_id (number)
All Available Perk Types:

CFO Perks:

  • shop_cash - Increases cash received from shop (max level 20)
  • lower_channel_fees - Reduces channel fees (max level 20)
  • cheap_anchor_points - Reduces anchor point costs (max level 20)
  • cheap_fuel - Reduces fuel costs (max level 20, requires shop_cash level 15)
  • cheap_co2 - Reduces CO2 costs (max level 20, requires shop_cash level 15)
  • cheap_harbor_fees - Reduces harbor fees (max level 20, requires shop_cash level 20)
  • cheap_route_creation_fee - Reduces route creation fees (max level 20, requires cheap_anchor_points level 5)

COO Perks:

  • happier_staff - Increases staff happiness (max level 20)
  • less_crew - Reduces crew requirements (max level 20, requires happier_staff level 5)
  • improved_staff_negotiations - Improves staff salary negotiations (max level 6, requires happier_staff level 10)
  • lower_hijacking_chance - Reduces hijacking probability (max level 20)
  • cheap_guards - Reduces guard costs (max level 20, requires lower_hijacking_chance level 5)

CMO Perks:

  • higher_demand - Increases cargo demand (max level 20, requires user level 20)
  • cheap_marketing - Reduces marketing costs (max level 20)

CTO Perks:

  • reduce_co2_consumption - Reduces CO2 consumption (max level 20)
  • reduce_fuel_consumption - Reduces fuel consumption (max level 20, requires reduce_co2_consumption level 5)
  • travel_speed_increase - Increases vessel speed (max level 3, requires reduce_fuel_consumption level 3)
  • slower_wear - Reduces vessel wear rate (max level 20)
  • cheaper_maintenance - Reduces maintenance costs (max level 20)

Captain Perks:

  • lower_crew_unhappiness - Reduces crew unhappiness (max level 5, requires user level 12)

First Officer Perks:

  • less_crew_needed - Reduces crew needed per vessel (max level 5, requires user level 8)

Boatswain Perks:

  • slower_wear_boatswain - Reduces vessel wear rate (max level 5)

Technical Officer Perks:

  • less_fuel_consumption - Reduces fuel consumption (max level 5)

Contacts & Social

Get Contacts

Endpoint: POST /api/contact/get-contacts
Request:
{}

Response:
{
  "data": {
    "contacts": [
      {
        "id": 1234567,
        "company_name": "Contact Company A",
        "difficulty": "easy",
        "company_type": ["container", "tanker"],
        "status": "active",
        "hub": "hamburg",
        "user_image": null,
        "cash": 168837042,
        "fuel": 13414,
        "co2": 65000000,
        "points": 183,
        "stock": 5264.88,
        "stock_trend": "down",
        "language": "en-GB",
        "reputation": 41,
        "created_at": "2023-02-25T06:42:15.000000Z",
        "is_admin": 0,
        "time_last_login": 1700000000
      }
    ],
    "alliance_contacts": [ ... ],
    "blocked_contacts": []
  },
  "user": { ... }
}

Returns:
Contact list including:
  • contacts: Direct contacts added by user
  • alliance_contacts: Members of user's alliance

Add Contact

Endpoint: POST /api/contact/add-contact
Request:
{
  "user_id": 3595073
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success status

Remove Contacts

Endpoint: POST /api/contact/remove-contacts
Request:
{
  "user_ids": "[3595073]"
}

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success status

Messenger (Private Messages)

Get Chats

Endpoint: POST /api/messenger/get-chats
Request:
{}

Response:
{
  "data": [
    {
      "system_chat": true,
      "id": 12345678,
      "values": {
        "case_id": 1032536,
        "company_name": "My Shipping Co",
        "vessel_name": "MS Example",
        "user_vessel_id": 12345678,
        "tr_danger_zone": "west_african_coast",
        "requested_amount": 2568000
      },
      "subject": "vessel_got_hijacked",
      "body": "vessel_got_hijacked",
      "time_last_message": 1700000000,
      "new": true,
      "read_at": 0,
      "display_at": null,
      "participants_string": "Gameplay"
    },
    {
      "id": 117969,
      "subject": "Hello!",
      "last_message": "How are you doing?",
      "time_last_message": 1700000000,
      "new": false,
      "participants_string": "Other Player",
      "messages": []
    }
  ],
  "user": { ... }
}

Send Private Message

Endpoint: POST /api/messenger/send-message
Request:
{
  "recipient": 1234567,
  "subject": "Trade Discussion",
  "body": "Hello, I'm interested in discussing a potential partnership."
}
Parameters:
  • recipient: User ID of the message recipient
  • subject: Message subject line (required)
  • body: Message content (required, max 1000 characters)
Rate Limit: ~45 seconds between messages. Sending too quickly returns error:
{
  "error": "Please wait a moment."
}

Response:
{
  "data": {
    "chat": {
      "id": 116022,
      "subject": "Trade Discussion",
      "last_message": "Hello, how are you?",
      "time_last_message": 1700000000,
      "new": false,
      "participants_string": "Other Player",
      "messages": [
        { "body": "Hello!", "is_mine": false, "user_id": 1234567, "created_at": 1700000000 },
        { "body": "Hello, how are you?", "is_mine": true, "user_id": 1234568, "created_at": 1700000100 }
      ]
    }
  },
  "user": { ... }
}

Notes:
  • Both subject and body are required fields

Get Chat Messages

Endpoint: POST /api/messenger/get-chat
Request:
{
  "chat_id": 12345
}

Response:
{
  "data": {
    "chat": {
      "id": 117874,
      "subject": "Message",
      "last_message": "Thanks for the info!",
      "time_last_message": 1700000000,
      "new": false,
      "participants_string": "Other Player",
      "messages": [
        { "body": "Hello there!", "is_mine": false, "user_id": 1234567, "created_at": 1700000000 },
        { "body": "Thanks for the info!", "is_mine": true, "user_id": 1234568, "created_at": 1700000100 }
      ]
    }
  },
  "user": { ... }
}

Notes:
  • Use /messenger/get-chats (plural) to get list of all chats first
  • Then use this endpoint to get messages for a specific chat
  • Messages are returned in chronological order

Mark Chat as Read

Endpoint: POST /api/messenger/mark-as-read
Request:
{
  "chat_ids": "[12345,12346]",
  "system_message_ids": "[]"
}
Parameters:
  • chat_ids: JSON string of regular chat IDs to mark as read
  • system_message_ids: JSON string of system message IDs to mark as read

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Notes:
  • Both parameters are required (use "[]" for empty)

Delete Chat

Endpoint: POST /api/messenger/delete-chat
Request:
{
  "chat_ids": "[]",
  "system_message_ids": "[12345]"
}
Parameters:
  • chat_ids: JSON string of regular chat IDs to delete
  • system_message_ids: JSON string of system message IDs to delete

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Notes:
  • Both parameters are required (use "[]" for empty)

Alliance

Get User's Alliance

Endpoint: POST /api/alliance/get-user-alliance
Request:
{}

Response:
{
  "data": {
    "alliance": {
      "id": 10618,
      "name": "Example Alliance",
      "image": "alliance_logo_02",
      "image_colors": { "primary": "#eff5f7", "secondary": ["#B21514", "#F75754"] },
      "language": "en-GB",
      "description": "Alliance description here...",
      "members": 28,
      "time_founded": 1700000000,
      "benefit_level": 13,
      "season_end_time": 1762128000,
      "total_share_value": 38041.36,
      "stats": {
        "departures_24h": 7486,
        "contribution_score_24h": 34726,
        "coops_24h": 612,
        "season_departures": 76273,
        "season_contribution_score": 278608,
        "season_coops": 3459,
        "total_departures": 854667,
        "total_contribution_score": 2921792,
        "total_coops": 46071
      },
      "benefit": {
        "level": 13,
        "rep_boost": 2.1,
        "demand_boost": 6.4,
        "coop_boost": 68
      },
      "league_level": 3,
      "group_position": 2,
      "coop": { "used": 3459, "needed": 1904 }
    }
  },
  "user": { ... }
}

Returns:
User's alliance membership status, alliance ID

Get Alliance Details

Endpoint: POST /api/alliance/get-alliance
Request:
{
  "alliance_id": 12345
}

Response:
{
  "data": {
    "alliance": {
      "id": 10618,
      "name": "Example Alliance",
      "image": "alliance_logo_02",
      "image_colors": { "primary": "#eff5f7", "secondary": ["#B21514", "#F75754"] },
      "language": "en-GB",
      "description": "Alliance description...",
      "members": 28,
      "time_founded": 1700000000,
      "benefit_level": 13,
      "season_end_time": 1762128000,
      "total_share_value": 38041.36,
      "stats": { ... },
      "benefit": { ... },
      "league_level": 3,
      "coop": { "used": 3459, "needed": 1904 }
    }
  },
  "user": { ... }
}

Returns:
Alliance name, tag, description, level, statistics

Get Alliance Members

Endpoint: POST /api/alliance/get-alliance-members
Request:
{
  "alliance_id": 12334,
  "lifetime_stats": false,
  "last_24h_stats": false,
  "last_season_stats": false,
  "include_last_season_top_contributors": true
}

Response:
(see below)
Returns:
Array of alliance members with their statistics and roles Parameters:
  • alliance_id: Alliance ID to fetch members for
  • lifetime_stats: Include lifetime statistics for each member
  • last_24h_stats: Include last 24 hours statistics for each member
  • last_season_stats: Include last season statistics for each member
  • include_last_season_top_contributors: Include top contributors list from last season
Common Variations:
// Only last season top contributors (minimal data)
{"alliance_id": 12334, "lifetime_stats": false, "last_24h_stats": false, "last_season_stats": false, "include_last_season_top_contributors": true}

// Last season stats + top contributors
{"alliance_id": 12334, "lifetime_stats": false, "last_24h_stats": false, "last_season_stats": true, "include_last_season_top_contributors": true}

// Last 24h stats + top contributors
{"alliance_id": 12334, "lifetime_stats": false, "last_24h_stats": true, "last_season_stats": false, "include_last_season_top_contributors": true}

// Lifetime stats + top contributors
{"alliance_id": 12334, "lifetime_stats": true, "last_24h_stats": false, "last_season_stats": false, "include_last_season_top_contributors": true}

Response:
{
  "data": {
    "members": [
      {
        "user_id": 1234567,
        "role": "ceo",
        "has_management_role": true,
        "is_rookie": false,
        "time_joined": 1700000000,
        "company_name": "Company A",
        "share_value": 5273.66,
        "difficulty": "easy",
        "tanker_ops": true,
        "time_last_login": 1700000000,
        "contribution": 36359,
        "departures": 3579
      },
      {
        "user_id": 1234568,
        "role": "member",
        "has_management_role": false,
        "is_rookie": false,
        "time_joined": 1700000000,
        "company_name": "Company B",
        "share_value": 3259.61,
        "difficulty": "easy",
        "tanker_ops": true,
        "time_last_login": 1700000000,
        "contribution": 28179,
        "departures": 18731
      }
    ],
    "last_season_top_contributors": [
      { "user_id": 1234567, "contribution_score_sum": 104809, "point_reward": 20 },
      { "user_id": 1234568, "contribution_score_sum": 61472, "point_reward": 10 }
    ]
  },
  "user": { ... }
}

Get Alliance Chat Feed

Endpoint: POST /api/alliance/get-chat-feed
Request:
{
  "alliance_id": 12345,
  "offset": 0,
  "limit": 50
}

Response:
{
  "data": {
    "chat_feed": [
      {
        "type": "chat",
        "user_id": 1234567,
        "message": "Hello everyone!",
        "time_created": 1700000000
      },
      {
        "type": "feed",
        "user_id": 1234568,
        "feed_type": "member_joined",
        "replacements": { "company_name": "New Player Co" },
        "time_created": 1700000000
      },
      {
        "type": "feed",
        "user_id": 1234569,
        "feed_type": "member_left",
        "replacements": { "company_name": "Old Player Co" },
        "time_created": 1700000000
      }
    ]
  },
  "user": { ... }
}

Returns:
Recent alliance chat messages and events

Post Alliance Chat Message

Endpoint: POST /api/alliance/post-chat
Request:
{
  "alliance_id": 12345,
  "text": "Great work everyone on hitting our contribution goals this week!"
}
Parameters:
  • alliance_id: Your alliance ID
  • text: Message content (max 1000 characters)

Response:
{
  "data": {
    "chat_feed": [
      {
        "type": "chat",
        "user_id": 1234567,
        "message": "Great work everyone on hitting our contribution goals!",
        "time_created": 1700000000
      }
    ]
  },
  "user": { ... }
}

Get Alliance High Scores

Endpoint: POST /api/alliance/get-high-scores
Request:
{
  "page": 0,
  "tab": "current",
  "language": "global",
  "league_level": "all",
  "score": "contribution"
}

Response:
{
  "data": {
    "highscores": {
      "max_league_level_in_use": 8,
      "alliances": [
        {
          "id": 8878,
          "name": "Top Alliance",
          "image": "alliance_logo_11",
          "image_colors": { "primary": "#eff5f7", "secondary": ["#B21514", "#F75754"] },
          "language": "en-GB",
          "description": "Alliance description...",
          "members": 26,
          "time_founded": 1700000000,
          "benefit_level": 28,
          "season_end_time": 1762128000,
          "league_level": 1,
          "stats": { "contribution": 2330229 }
        }
      ]
    }
  },
  "user": { ... }
}

Returns:
Alliance leaderboard rankings

Get Open Alliances

Endpoint: POST /api/alliance/get-open-alliances
Request:
{
  "limit": 50,
  "offset": 0,
  "filter": "all"
}

Response:
{
  "data": {
    "alliances": [
      {
        "id": 8878,
        "name": "Example Alliance",
        "image": "alliance_logo_11",
        "image_colors": { "primary": "#eff5f7", "secondary": ["#B21514", "#F75754"] },
        "language": "en-GB",
        "description": "Alliance description...",
        "members": 26,
        "time_founded": 1700000000,
        "benefit_level": 28,
        "season_end_time": 1762128000,
        "league_level": 1,
        "recruitment_status": "open"
      }
    ],
    "has_next": true
  },
  "user": { ... }
}

Returns:
Paginated list of alliances Parameters:
  • limit: Number of results per page (e.g., 10, 50, 100)
  • offset: Pagination offset (0-based)
  • filter: "all" (all alliances) or "open" (only alliances accepting members)

Get Alliance Member Settings

Endpoint: POST /api/alliance/get-member-settings
Request:
{
  "alliance_id": 12345
}

Response:
{
  "data": [
    {
      "user_id": 1234567,
      "coop_enabled": true,
      "restrictions": {
        "selected_vessel_capacity": 0,
        "time_restriction_arr": [0, 24],
        "time_range_enabled": false
      }
    },
    {
      "user_id": 1234568,
      "coop_enabled": false,
      "restrictions": {
        "selected_vessel_capacity": 9000,
        "time_restriction_arr": [22, 6],
        "time_range_enabled": true
      }
    }
  ],
  "user": { ... }
}

Returns:
Member permissions, roles, settings

Get Alliance Settings

Endpoint: POST /api/alliance/get-settings
Request:
{
  "alliance_id": 12345
}

Response:
{
  "data": {
    "settings": {
      "coop_enabled": true,
      "restrictions": {
        "selected_vessel_capacity": 0,
        "time_restriction_arr": [0, 24],
        "time_range_enabled": false
      }
    }
  },
  "user": { ... }
}

Returns:
Alliance configuration, requirements, privacy settings

Get Queue Pool for Alliance

Endpoint: POST /api/alliance/get-queue-pool-for-alliance
Request:
{
  "alliance_id": 12345,
  "pool_type": "direct",
  "filter_share_value": "any",
  "filter_fleet_size": "any",
  "filter_experience": "all",
  "page": 1
}

Response:
{
  "data": {
    "pool": {
      "direct": []
    }
  },
  "user": { ... }
}

Returns:
Queue pool of available vessels/members for alliance cooperation
  • pool.direct: Array of direct queue pool entries (vessels available for cooperation)

Notes:
  • pool_type: "direct" or "any"
  • filter_share_value: "any", "low", "medium", "high"
  • filter_fleet_size: "any", "small", "medium", "large"
  • filter_experience: "all" or "rookies_only"
  • page: Pagination (1-based)

Update User Role

Endpoint: POST /api/alliance/update-user-role
Request:
{
  "user_id": 1234567,
  "role": "member"
}

Response:
FIXME
Returns:
Success/failure of role update
Notes:
  • Requires alliance management permissions (ceo, coo, or management role)
  • role: "ceo", "coo", "management", "member"

Accept User to Join Alliance

Endpoint: POST /api/alliance/accept-user-to-join-alliance
Request:
{
  "user_id": 12345678,
  "alliance_id": 12345
}

Response:
FIXME
Notes:
  • Requires alliance management permissions
  • user_id: The ID of the user applying to join
  • alliance_id: The ID of the accepting alliance
  • User must have a pending application in the queue pool
  • Upon success, user becomes a member of the alliance

Decline User Direct Application

Endpoint: POST /api/alliance/decline-user-direct-application
Request:
{
  "user_id": 12345678,
  "alliance_id": 12345
}

Response:
FIXME
Notes:
  • Requires alliance management permissions
  • user_id: The ID of the user whose application to decline
  • alliance_id: The ID of the alliance
  • Removes the application from the queue pool
  • User can reapply after being declined

Apply to Join Alliance

Endpoint: POST /api/alliance/apply-direct-to-join-alliance
Request:
{
  "alliance_id": 12345,
  "application_text": "Let my in - I'm a pro, dude!"
}

Response:
FIXME
Notes:
  • Used by users without an alliance to apply to join an open alliance
  • alliance_id: The ID of the alliance to apply to
  • application_text: Optional motivational speech (max 1000 characters)
  • Alliance must be open (less than 50 members)
  • User can apply to multiple alliances simultaneously
  • Application appears in the alliance's queue pool

Join Pool for Any Alliance

Endpoint: POST /api/alliance/join-pool-for-any-alliance
Request:
{}

Response:
FIXME
Notes:
  • Used as a backup option when applying to specific alliances
  • If not accepted to any specific alliance within 48 hours, user enters general pool
  • Alliances can browse the general pool to find members
  • User can only be in the pool if they have no alliance
  • Automatically removed from pool when user joins an alliance

Leave Pool for Any Alliance

Endpoint: POST /api/alliance/leave-pool-for-any-alliance
Request:
{
  "time_requested_in_48h": true
}

Response:
FIXME
Notes:
  • Removes user from the any-alliance pool
  • time_requested_in_48h: Whether request was made within the 48-hour window
  • User can rejoin the pool at any time

Cancel Application to Alliance

Endpoint: POST /api/alliance/cancel-application
Request:
{
  "alliance_id": 12345
}

Response:
FIXME
Notes:
  • Cancels a specific pending application to an alliance
  • alliance_id: The ID of the alliance to cancel application for
  • Removes application from alliance's queue pool
  • User can reapply to the same alliance after cancelling

Leave Alliance

Endpoint: POST /api/alliance/leave-alliance
Request:
{}

Response:
FIXME
Notes:
  • Leaves your current alliance
  • User must be a member of an alliance to use this endpoint
  • Cannot be undone - must reapply to rejoin
  • All contribution points and alliance benefits are lost
  • Immediate effect - no waiting period

Cancel All Applications

Endpoint: POST /api/alliance/cancel-all-applications
Request:
{}

Response:
FIXME
Notes:
  • Cancels all pending applications to all alliances
  • Does not affect any-alliance pool membership
  • User can submit new applications after cancelling all

Cancel Direct Application to Join Alliance

Endpoint: POST /api/alliance/cancel-direct-application-to-join-alliance
Request:
{
  "alliance_id": 1234
}

Response:
FIXME
Notes:
  • Cancels a specific pending application to an alliance
  • alliance_id: The ID of the alliance to cancel application for
  • User can reapply to the same alliance after cancelling

Get User Pool State

Endpoint: POST /api/alliance/get-user-pool-state
Request:
{}

Response:
FIXME
Returns:
Current status of user's alliance applications
Notes:
  • Returns the user's pending alliance applications
  • any: Whether user is in the "any alliance" pool
  • direct: Array of direct applications to specific alliances
  • Used to track application status before joining an alliance

Exclude User from Alliance

Endpoint: POST /api/alliance/exclude-user
Request:
{
  "user_id": 1234567
}

Response:
FIXME

Update Alliance Data

Endpoint: POST /api/alliance/update-alliance-data
Request:
{
  "alliance_id": 12345,
  "description": "New alliance description",
  "image": "alliance_logo_05"
}

Response:
FIXME

Forum

Create Post

Endpoint: POST /api/forum/create-post
Request:
{ "topic_id": 12345, "body": "Post content" }
Response:
FIXME

Create Post and Topic

Endpoint: POST /api/forum/create-post-and-topic
Request:
{ "forum_id": 1, "title": "Topic Title", "body": "First post" }
Response:
FIXME

Delete Post

Endpoint: POST /api/forum/delete-post
Request:
{ "post_id": 12345 }
Response:
FIXME

Delete Topic

Endpoint: POST /api/forum/delete-topic
Request:
{ "topic_id": 12345 }
Response:
FIXME

Lock Topic

Endpoint: POST /api/forum/lock-topic
Request:
{ "topic_id": 12345 }
Response:
FIXME

Unlock Topic

Endpoint: POST /api/forum/unlock-topic
Request:
{ "topic_id": 12345 }
Response:
FIXME

Move Topic

Endpoint: POST /api/forum/move-topic
Request:
{ "topic_id": 12345, "forum_id": 2 }
Response:
FIXME

Report Post

Endpoint: POST /api/forum/report-post
Request:
{ "post_id": 12345, "reason": "Spam" }
Response:
FIXME

Set Topic Sticky

Endpoint: POST /api/forum/set-topic-sticky
Request:
{ "topic_id": 12345 }
Response:
FIXME

Unset Topic Sticky

Endpoint: POST /api/forum/unset-sticky-topic
Request:
{ "topic_id": 12345 }
Response:
FIXME

Coop (Cooperative Play)

Get Coop Data

Endpoint: POST /api/coop/get-coop-data
Request:
{}

Response:
{
  "data": {
    "coop": {
      "available": 0,
      "cap": 68,
      "sent_this_season": 204,
      "received_this_season": 25,
      "sent_historical": 1101,
      "received_historical": 417
    },
    "members_coop": [
      {
        "user_id": 1234567,
        "enabled": true,
        "sent_this_season": 136,
        "sent_last_season": 609,
        "sent_cargo_load_last_season": 811992,
        "received_this_season": 105,
        "sent_historical": 3306,
        "received_historical": 3508,
        "total_vessels": 221,
        "fuel": 1947444,
        "donations_this_season": 0,
        "donations_last_season": 0,
        "donations_historical": 558,
        "has_real_purchase": false
      }
    ]
  },
  "user": { ... }
}

Returns:
Cooperative opportunities, available cargo sharing

Update Coop Settings

Endpoint: POST /api/coop/update-settings
Request:
{
  "coop_enabled": true,
  "capacity_min": 2500,
  "hhmm_from": 22,
  "hhmm_to": 6,
  "time_range_enabled": false
}

Response:
{
  "data": {
    "settings": {
      "coop_enabled": true,
      "restrictions": {
        "selected_vessel_capacity": 254,
        "time_restriction_arr": [0, 24],
        "time_range_enabled": false
      }
    }
  },
  "user": { ... }
}

Endpoint: POST /api/coop/donate-points
Request:
{
  "user_id": 123456,
  "points": 5,
  "message": "Optional message",
  "all_members": false
}
Parameters:
  • user_id: Target user ID (ignored if all_members=true)
  • points: Amount of diamonds to donate (must be <= available points)
  • message: Optional message (max 140 characters)
  • all_members: If true, sends to all alliance members

Response:
{
  "data": {
    "points_donated": 1
  },
  "user": { ... }
}

Returns:
Success/failure
Notes:
  • Donates diamonds (points) to alliance members
  • Can donate to single member or all members at once
  • Total cost = points x number of recipients
  • Points are deducted immediately from donor's balance

Stock Market

Get Finance Overview

Endpoint: POST /api/stock/get-finance-overview
Request:
{
  "user_id": 1234567
}

Response:
{
  "data": {
    "investors": {
      "Investor A": { "id": 1234567, "total_shares": 25000, "bought_at": 40.14 },
      "Investor B": { "id": 1234568, "total_shares": 25000, "bought_at": 399.37 }
    },
    "investments": {
      "Company X": {
        "id": 1234569,
        "total_shares": 9000,
        "invested": 604440,
        "return": 284220,
        "bought_at": 67.16,
        "available_to_sell": 9000,
        "next_available_sale_time": 1700000000,
        "next_available_sale_amount": 9000,
        "current_value": 98.74,
        "stock_trend": "up"
      }
    },
    "stock": {
      "company_name": "My Shipping Co",
      "difficulty": "easy",
      "stock": 818.79,
      "stock_trend": "up",
      "stock_for_sale": 0,
      "stock_total": 50000,
      "history": [
        { "value": "40.01", "time": 1700000000 },
        { "value": "77.97", "time": 1700086400 },
        ...
      ],
      "increase_stock": { "price": 100000, "amount": 25000 }
    }
  },
  "user": { ... }
}

Returns:
User's stock portfolio, holdings, value

Get Stock Market

Endpoint: POST /api/stock/get-market
Request:
{
  "filter": "top",
  "page": 1,
  "limit": 40,
  "search_by": ""
}

Response:
{
  "data": {
    "market": [
      {
        "id": 1154043,
        "company_name": "Top Company A",
        "stock": 7697.20,
        "stock_trend": "same",
        "stock_for_sale": 10861,
        "last_update": 1700000000
      },
      {
        "id": 1031742,
        "company_name": "Top Company B",
        "stock": 7689.26,
        "stock_trend": "down",
        "stock_for_sale": 200294,
        "last_update": 1700000000
      }
    ],
    "has_next": true
  },
  "user": { ... }
}

Returns:
Stock market listings (only companies with stock_for_sale >= 1) Parameters:
  • filter: Filter/sort type (top, low, activity, recent-ipo, search)
  • page: Page number for pagination (1-based)
  • limit: Results per page (minimum 20, typically 40)
  • search_by: Search query (only used with filter: "search")

Get Stock Information

Endpoint: POST /api/stock/get-stock
Request:
{
  "user_id": 1234567
}
Response (Success):
{
  "data": {
    "stock": {
      "company_name": "Target Company",
      "stock": 2500.50,
      "stock_trend": "up",
      "stock_for_sale": 5000,
      "stock_total": 50000
    }
  },
  "user": { ... }
}
Response (Error - No Data):
{
  "error": "no_data",
  "user": { ... }
}

Returns:
Stock information for specific user/company
Notes:
  • Returns detailed stock data including price, trend, trading volume

Get Company Investments

Endpoint: POST /api/stock/get-company-investments
Request:
{
  "stock_issuer_user_id": 1234567
}

Response:
{
  "data": {
    "owned": 0,
    "bought_at": null,
    "available_to_sell": 0,
    "next_available_sale_time": 0,
    "next_available_sale_amount": 0
  },
  "user": { ... }
}

Returns:
User's investment in a specific company's stock
Notes:
  • owned: Number of shares owned
  • bought_at: Average purchase price (null if no shares owned)
  • available_to_sell: Shares available for immediate sale
  • next_available_sale_time: Unix timestamp when more shares become available
  • next_available_sale_amount: Additional shares available after cooldown

Purchase Stock

Endpoint: POST /api/stock/purchase-stock
Request:
{
  "stock_issuer_user_id": 1234567,
  "amount": 100
}
Parameters:
  • stock_issuer_user_id: ID of the company/user whose stock to purchase
  • amount: Number of shares to buy (must be >= 1)

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Sell Stock

Endpoint: POST /api/stock/sell-stock
Request:
{
  "stock_user_id": 1234567,
  "amount": 100
}
Parameters:
  • stock_user_id: ID of the company/user whose stock to sell
  • amount: Number of shares to sell (must be >= 1)

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Increase Stock For Sale

Endpoint: POST /api/stock/increase-stock-for-sale
Request:
{}

Response:
FIXME
Returns:
Updated user data after issuing new shares
Notes:
  • Only available for users who have completed IPO (gone public)
  • Each call issues exactly 25,000 new shares to the market
  • Price doubles with each tier based on total shares in circulation: 0-25k shares: $6.5M, 25k-50k shares: $12.5M, 50k-75k shares: $25M, 75k-100k shares: $50M, (doubles each subsequent tier)

IPO (Initial Public Offering)

Get IPO Price

Endpoint: POST /api/ipo/price
Request:
{}
Response (Not yet IPO'd): FIXME Response (Already IPO'd):
{
  "error": "user_already_performed_ipo",
  "user": { ... }
}

Perform IPO

Endpoint: POST /api/ipo/perform
Request:
{}

Response:
FIXME

Shop

Get Money Products (IAP)

Endpoint: POST /api/shop/get-money-products
Request:
{
  "platform": "web"
}

Response:
{
  "data": {
    "money_products": [
      {
        "id": 1,
        "offer_id": null,
        "product": "storepack_299",
        "name_key": "Shop/Packs/Name/mini_pack",
        "name": "Mini pack",
        "sub_header_key": null,
        "sub_header": null,
        "image": "shop/sm-shop-storepack-299.png",
        "background_image": "shop/not_implemented_yet.png",
        "sku": "com.trophygames.sm.storepack_299",
        "rewards": [
          { "type": "cash", "amount": 10500000 },
          { "type": "points", "amount": 100 }
        ],
        "type": "normal",
        "sorting": 1,
        "price": 3,
        "steam_price": 299,
        "ribbon_text": null,
        "ribbon_text_key": null
      }
    ]
  },
  "user": { ... }
}

Returns:
Available in-app purchase products (premium currency)

Get Points Products

Endpoint: POST /api/shop/get-points-products
Request:
{
  "platform": "web"
}

Response:
{
  "data": {
    "products": {
      "credit_products": [
        {
          "id": 1,
          "name": "4x Speed for 4 hours",
          "sku": "speed_up",
          "description": "Increase vessel speed by 4x for 4 hours",
          "price": 1200,
          "image": "price_tag_icon.svg",
          "rewards": [{ "type": "speed_up", "hours": 4 }],
          "order": 11,
          "restricted": false,
          "special_tag": null,
          "one_time": null,
          "salary": 0
        },
        {
          "id": 2,
          "name": "Increase fuel tank capacity",
          "sku": "capacity_fuel",
          "price": 120,
          "rewards": [{ "type": "capacity_fuel", "amount": 3000000 }]
        },
        {
          "id": 9,
          "name": "Tanker Ops",
          "sku": "add_tanker",
          "price": 450,
          "rewards": [{ "type": "add_tanker" }]
        },
        {
          "id": 15,
          "name": "CMO",
          "sku": "staff_cmo",
          "price": 150,
          "rewards": [{ "type": "staff_cmo", "name": "cmo" }],
          "salary": 13057
        }
      ]
    }
  },
  "user": { ... }
}

Returns:
Items purchasable with in-game points

Buy Point Product

Endpoint: POST /api/shop/buy-point-product
Request:
{
  "sku": "staff_cmo"
}
Parameters:
  • sku: Product SKU from get-points-products (e.g., "staff_cmo", "staff_coo", "staff_cto", "capacity_fuel", "capacity_co2", "speed_up", "add_tanker")

Response:
{
  "data": {
    "success": true
  },
  "user": { ... }
}

Returns:
Success/failure of purchase
Notes:
  • Purchases items using in-game points (diamonds)
  • Points are deducted immediately from user's balance
All Available SKUs:

| SKU | Name | Price | Effect | |-----|------|-------|--------| | capacity_fuel | Increase fuel tank capacity | 120 | +18,000 tonnes fuel storage | | capacity_co2 | Increase CO2 quota capacity | 60 | +90,000 tonnes CO2 storage | | add_tanker | Tanker Ops | 450 | Unlock tanker vessels | | speed_up | 4x Speed for 4 hours | 1200 | Boost vessel speed | | postpone_drydocking | Postpone drydocking | 1200 | +250 hours until drydock | | metropol_routes | Metropol Routes | 200 | Access to major ports | | map_light | Map Light | 150 | Light map theme | | map_dark | Map Dark | 200 | Dark map theme | | map_street | Map Street | 250 | Street map theme | | map_satellite | Map Satellite | 200 | Satellite map theme | | map_city | Map City | 250 | City map theme | | map_sky | Map Sky | 250 | Sky map theme | | zoom | Increase Zoom | 600 | Extra map zoom level | | all_map_features | All map features | 1425 | All maps + zoom | | staff_cmo | CMO | 150 | Chief Marketing Officer | | staff_cfo | CFO | 150 | Chief Financial Officer | | staff_coo | COO | 150 | Chief Operations Officer | | staff_cto | CTO | 150 | Chief Technical Officer | | reset_staff_training | Reset Staff Training | 600 | Reset training points (requires 15+ spent) | | employee_workshop | Employee workshop | 300 | +1 Staff training point | | vip_vessel | Starliner | 2500 | Special vessel +50% revenue |


Spend Training Point

Endpoint: POST /api/staff/spend-training-point
Request:
{
  "perk_type": "cheap_fuel"
}
Parameters:
  • perk_type: The perk to upgrade (see table below)

Response:
{
  "data": {
    "staff": {
      "type": "cfo",
      "training": [
        {
          "level": 11,
          "perk": "shop_cash",
          "type_id": 1,
          "can_train": true,
          "max_level": 20,
          "current_effect": 110,
          "next_level_effect": 120
        }
      ],
      "training_max_level": 140,
      "training_current_level": 24
    },
    "perk_modifiers": [
      { "perk_type": "shop_cash", "modifier": 110 },
      { "perk_type": "cheap_fuel", "modifier": 5 }
    ]
  },
  "user": { ... }
}
Available Perks:

| Perk Type | Effect | |-----------|--------| | shop_cash | More cash from shop transactions | | slower_wear_boatswain | Slower vessel wear/degradation | | cheap_anchor_points | Cheaper anchor point purchases | | less_fuel_consumption | Lower fuel consumption | | happier_staff | Better staff morale | | lower_channel_fees | Cheaper Suez/Panama channel fees | | cheap_route_creation_fee | Lower route creation costs | | cheap_fuel | Cheaper fuel purchases |


Notes:
  • Requires staff_training_points (get via employee_workshop SKU or leveling up)
  • Use perk_type string name, NOT type_id number
  • Each perk has a max_level that cannot be exceeded

Create Purchase

Endpoint: POST /api/shop/create-purchase
Request:
{ "product_id": 1, "platform": "web" }
Response:
FIXME

Request Steam Payment

Endpoint: POST /api/shop/request-steam-payment
Request:
{ "product_id": 1 }
Response:
FIXME

Confirm Steam Payment

Endpoint: POST /api/shop/confirm-steam-payment
Request:
{ "order_id": "steam_order_12345", "transaction_id": "txn_12345" }
Response:
FIXME

Validate Payment

Endpoint: POST /api/shop/validate-payment
Request:
{ "platform": "steam", "receipt": "..." }
Response:
FIXME

Leaderboards

Top List by Difficulty

Endpoint: POST /api/top-list/by-difficulty-mode
Request:
{
  "difficulty": "easy",
  "page": 1
}

Response:
{
  "data": {
    "users": [
      {
        "id": 1234567,
        "company_name": "Top Company",
        "difficulty": "easy",
        "company_type": ["container", "tanker"],
        "status": "active",
        "hub": "hamburg",
        "cash": 2026465520537527,
        "fuel": 194395531,
        "co2": 1577564027,
        "points": 9296,
        "stock": 17092.49,
        "stock_trend": "same",
        "language": "en-GB",
        "reputation": 36,
        "created_at": "2023-08-16T10:47:42.000000Z",
        "is_admin": 0,
        "time_last_login": 1700000000,
        "share_value": 17092.49,
        "alliance": {
          "id": 115,
          "name": "Top Alliance",
          "image": "alliance_logo_08",
          "members": 29,
          "benefit_level": 0,
          "league_level": 6
        }
      }
    ]
  },
  "user": { ... }
}

Returns:
Global leaderboard for specific difficulty
Notes:
  • Difficulty options: "easy", "realism"

Competitors

Endpoint: POST /api/top-list/competitors
Request:
{}

Response:
{
  "data": {
    "users": [
      {
        "id": 1234567,
        "company_name": "Competitor A",
        "difficulty": "easy",
        "company_type": ["container"],
        "status": "active",
        "hub": "hamburg",
        "cash": 10796890,
        "fuel": 3500000,
        "co2": 50000000,
        "points": 81,
        "stock": 820.5,
        "stock_trend": "up",
        "language": "en-GB",
        "reputation": 83,
        "created_at": "2025-02-26T17:09:29.000000Z",
        "is_admin": 0,
        "time_last_login": 1700000000,
        "share_value": 820.5,
        "alliance": {
          "id": 10638,
          "name": "Some Alliance",
          "members": 29,
          "benefit_level": 8,
          "league_level": 3
        }
      }
    ]
  },
  "user": { ... }
}

Returns:
Players near your ranking

League System

Get User League and Group

Endpoint: POST /api/league/get-user-league-and-group
Request:
{}

Response:
{
  "data": {
    "league": {
      "level": 3,
      "group": 7,
      "time_season_end": 1762128000,
      "max_league_level_in_use": 8,
      "alliances": [
        {
          "id": 10477,
          "name": "Top Alliance",
          "image": "alliance_logo_10",
          "image_colors": { "primary": "#f7941d", "secondary": ["#F4F3F4", "#D8FFFE"] },
          "language": "en-GB",
          "description": "Alliance description...",
          "members": 20,
          "time_founded": 1746358024,
          "benefit_level": 18,
          "season_end_time": 1762128000,
          "total_share_value": 58158.98,
          "stats": {
            "contribution_score_24h": 69757,
            "season_contribution_score": 356906
          },
          "league_handicap": 0,
          "league_level": 3,
          "group_position": 1,
          "promotion": false,
          "top_tier_reward": false
        }
      ],
      "season_update": false
    }
  },
  "user": { ... }
}

Returns:
Current league, division, ranking within group

Get League and Group

Endpoint: POST /api/league/get-league-and-group
Request:
{
  "league_level": 3,
  "league_group": 7
}

Response:
FIXME

Live Operations

Get Campaign

Endpoint: POST /api/live-ops/get-campaign
Request:
{
  "trigger": "login"
}

Response:
{
  "data": {
    "action": "open_shop",
    "product": null
  },
  "user": { ... }
}

Returns:
Active promotional campaigns, events, offers
Notes:
  • Trigger types seems to be something like: "login", "shop_open", "level_up", etc.

Get Campaign (Alternative)

Endpoint: POST /api/campaign/get-campaign
Request:
{}

Response:
FIXME
Returns:
Active campaigns with status information
Notes:
  • Alternative endpoint for getting campaign information
  • Returns campaign list with status (active/inactive)

Marketing

Get Marketing Campaigns

Endpoint: POST /api/marketing-campaign/get-marketing
Request:
{}

Response:
{
  "data": {
    "marketing_campaigns": [
      {
        "id": 1,
        "name": "campaign_1",
        "min_efficiency": 5,
        "max_efficiency": 7,
        "campaign_duration": 4,
        "price": 624954,
        "option_name": "reputation"
      },
      {
        "id": 7,
        "name": "campaign_2",
        "min_efficiency": 11,
        "max_efficiency": 14,
        "campaign_duration": 4,
        "price": 937430,
        "option_name": "reputation"
      },
      {
        "id": 24,
        "name": "campaign_5",
        "min_efficiency": 10,
        "max_efficiency": 15,
        "campaign_duration": 24,
        "price": 3163828,
        "option_name": "awareness"
      },
      {
        "id": 25,
        "name": "campaign_6",
        "min_efficiency": 7,
        "max_efficiency": 10,
        "campaign_duration": 12,
        "price": 937430,
        "option_name": "green"
      }
    ],
    "active_campaigns": [
      {
        "id": 23,
        "name": "campaign_4",
        "option_name": "reputation",
        "end_time": 1700000000,
        "increase": 27,
        "duration": 24
      }
    ]
  },
  "user": { ... }
}

Returns:
Active marketing campaigns and promotions

Activate Marketing Campaign

Endpoint: POST /api/marketing-campaign/activate-marketing-campaign
Request:
{
  "campaign_id": 1
}
Parameters:
  • campaign_id: ID of the marketing campaign to activate

Response:
FIXME

Anchor Point

Get Anchor Price

Endpoint: POST /api/anchor-point/get-anchor-price
Request:
{}

Response:
{
  "data": {
    "price": 3487797,
    "duration": 18540,
    "reset_price": 10
  },
  "user": { ... }
}

Returns:
Current price per anchor point, duration, and user data including:
  • price: Cost per anchor point in dollars
  • duration: Time required for construction (in seconds)
  • user.cash: User's current cash balance
  • user.points: User's premium currency balance

Purchase Anchor Points

Endpoint: POST /api/anchor-point/purchase-anchor-points
Request:
{
  "amount": 1
}

Response:
{
  "data": {
    "success": true,
    "anchor_next_build": 1700000000,
    "reset_price": 10
  },
  "user": { ... }
}

Returns:
Success/failure, completion timestamp
  • success: true/false
  • anchor_next_build: Unix timestamp when anchor point will be ready
  • Total cost: price * amount

Reset Anchor Timing (Instant Completion)

Endpoint: POST /api/anchor-point/reset-anchor-timing
Request:
{}

Response:
FIXME
Returns:
Success/failure

Hijacking (Piracy)

Get Hijacking Case

Endpoint: POST /api/hijacking/get-case
Request:
{
  "case_id": 1234567
}

Response:
{
  "data": {
    "id": 1234567,
    "requested_amount": 3655000,
    "paid_amount": null,
    "user_proposal": 1888000,
    "has_negotiation": 1,
    "round_end_time": 1700000000,
    "status": "successful",
    "danger_zone_slug": "madagascar",
    "registered_at": 1700000000
  },
  "user": { ... }
}

Returns:
Hijacking case details including:
  • Vessel information
  • Pirate demands (requested_amount)
  • User proposal (user_proposal, if negotiation started)
  • Negotiation status (has_negotiation: 0 or 1)
  • Current state of the ransom negotiation

Submit Ransom Offer

Endpoint: POST /api/hijacking/submit-offer
Request:
{
  "case_id": 1234567,
  "amount": 1888000
}

Response:
{
  "data": {
    "id": 1234567,
    "requested_amount": 3057000,
    "paid_amount": null,
    "user_proposal": 1888000,
    "has_negotiation": true,
    "round_end_time": 1700000000,
    "status": "successful",
    "danger_zone_slug": "madagascar",
    "registered_at": 1700000000
  },
  "user": { ... }
}

Returns:
Success/failure of counter-offer submission
Notes:
  • Used to negotiate ransom amount with pirates
  • Amount is in dollars
  • Pirates never accept or reject they only re-counter your offer 2 times
  • Sending amounts different from 25/50/75% or more than the allowed 2 offers: Pirates will scam you (response payment price differs from the actual amount deducted from your balance)
  • Response appears as new message in messenger thread
  • Multiple negotiation rounds possible

Pay Ransom

Endpoint: POST /api/hijacking/pay
Request:
{
  "case_id": 1234567
}
Parameters:
  • case_id: ID of the hijacking case to pay ransom for

Response:
FIXME
Notes:
  • Pays the agreed ransom to close the hijacking case
  • Cash is deducted from user balance immediately
  • Vessel is released after payment
  • Case status changes to "solved"
  • Payment amount is determined by negotiation or original demand

Advertisements

Get Map Ads Info

Endpoint: GET /api/ad/get-map-ads-info
Request:
None (GET request, no body)
Response:
FIXME
Returns:
Information about map advertisement rewards and cooldown status
Notes:
  • This is a GET request, not POST
  • map_ad_reward: Anchor Points reward for watching an ad
  • map_ad_cooldown: Seconds until next ad can be watched (0 = ready)

Public Endpoints

Get Languages

Endpoint: POST /api/public/get-languages
Request:
{}

Response:
{
  "data": [
    {
      "suffix": "en-GB",
      "suffix_ios": "en",
      "suffix_2char": "uk",
      "language": "English",
      "language_eng": "English",
      "language_vue": "English",
      "country": "gb",
      "active": true,
      "sort": 1
    },
    {
      "suffix": "de-DE",
      "suffix_ios": "de",
      "suffix_2char": "de",
      "language": "Deutsch",
      "language_eng": "German",
      "language_vue": "German",
      "country": "de",
      "active": true,
      "sort": 3
    }
  ]
}

Returns:
All supported languages and translations

Log Error

Endpoint: POST /api/public/log-error
Request:
{
  "user_id": 1234567,
  "error": "VUE_ERROR",
  "message": "Cannot read properties of null",
  "info": "TypeError - GameMap",
  "location": "Current page - No page",
  "game_version": "1.0.310",
  "platform": "Google Chrome or Chromium",
  "component_name": "GameMap",
  "modal_history": "No history"
}

Response:
{
  "data": {
    "success": true
  }
}

Returns:
Success acknowledgment

Check Company Name

Endpoint: POST /api/public/check-company-name
Request:
{
  "name": "My New Company"
}
Response (Available):
{
  "data": {
    "success": true
  }
}


Analytics

Send Delta Event

Endpoint: POST /api/deltadna/send-delta-event
Request:
{
  "name": "shopOpen",
  "params": {
    "storePath": "Unknown",
    "storePage": "packs"
  }
}

Response:
{
  "data": true,
  "user": { ... }
}

Rate Limiting

The actual game API rate limit is well above 200 req/s for most endpoints.

Exception - Messenger: The /api/messenger/send-message endpoint has a strict rate limit of approximately 45 seconds between messages. Attempting to send messages faster returns:
{
  "error": "Please wait a moment."
}

Error Responses

Common error status codes:

  • 200: Success
  • 400: Bad request (invalid parameters)
  • 401: Unauthorized (invalid/expired session)
  • 403: Forbidden (action not allowed)
  • 429: Rate limit exceeded
  • 500: Server error