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) Use Cases:
  • Searching for players by company name
  • Adding contacts or sending private messages
  • Returns all matching users (can be slow with common search terms)
  • Response includes both search results and current user data

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

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

Use Cases:
  • Calculate actual profit per trip (income - fuel_cost - co2_cost)
  • Calculate fuel efficiency (km per ton)
  • Calculate ROI (total profit / purchase price)
  • Identify most profitable routes
  • Track vessel performance over time
  • THIS IS THE GOLDMINE FOR VESSEL EFFICIENCY CALCULATIONS
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": 59,
  "amount": 1
}
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": { ... }
}

Notes:
  • DESTRUCTIVE ACTION - Deducts cash from user balance
  • Vessels enter "pending" status with delivery time
  • Can purchase multiple vessels at once with amount parameter

Get Vessel Sell Price

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

Response:
FIXME
Notes:
  • Only works for vessels owned by the user

Sell Vessel

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

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

Notes:
  • Permanently removes vessel from user's fleet
  • Cash is added to user balance immediately
  • Vessel must be idle (not on route, not in maintenance)
  • Cannot be undone - vessel is permanently sold

Rename Vessel

Endpoint: POST /api/vessel/rename-vessel
Request:
{
  "vessel_id": 87654321,
  "name": "Pacific Explorer"
}
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": { ... }
}

Notes:
  • Parks (moors) a vessel, taking it out of active service
  • Parked vessels do not consume bunker or require maintenance
  • Vessel must be idle (not on route, not in maintenance)
  • Can be resumed later using /vessel/resume-parked-vessel

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": { ... }
}

Notes:
  • Unmoores a parked vessel, putting it back into active service
  • Vessel can then be assigned routes and departed
  • Vessel returns to idle status after resuming

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": "Timbucto",
  "vessel_model": "tanker",
  "engine_type": "diesel",
  "engine_kw": 15000,
  "capacity": 50000,
  "antifouling_model": "premium",
  "bulbous": 1,
  "enhanced_thrusters": 1,
  "range": 8500,
  "speed": 18.5,
  "fuel_consumption": 45,
  "propeller_types": "high_efficiency",
  "hull_color": "#2C3E50",
  "deck_color": "#ECF0F1",
  "bridge_color": "#FFFFFF",
  "container_color_1": "#E74C3C",
  "container_color_2": "#3498DB",
  "container_color_3": "#2ECC71",
  "container_color_4": "#F39C12",
  "name_color": "#FFFFFF",
  "custom_image": ""
}
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 ("diesel", "lng", "electric", etc.)
  • engine_kw: Engine power in kilowatts
  • capacity: Cargo capacity in TEU/tons
  • antifouling_model: Antifouling coating type
  • bulbous: Bulbous bow (0 or 1)
  • enhanced_thrusters: Enhanced thrusters (0 or 1)
  • range: Maximum range in km
  • speed: Maximum speed in knots
  • fuel_consumption: Fuel consumption per hour
  • propeller_types: Propeller configuration
  • hull_color: Hull color (hex code)
  • deck_color: Deck color (hex code)
  • bridge_color: Bridge color (hex code)
  • container_color_1-4: Container colors (hex codes)
  • name_color: Name text color (hex code)
  • custom_image: Custom vessel image (base64 or URL)

Response:
FIXME
Notes:
  • Builds a custom vessel with specified components and appearance
  • Cost varies based on engine, capacity, and upgrades
  • Vessel enters "pending" status with delivery time
  • Can use premium currency to instant-deliver after building
  • All color fields use hex color codes (e.g., "#FF0000" for red)
  • DESTRUCTIVE ACTION - Spends money

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": { ... }
}

Notes:
  • Used to check if a vessel has an active event (hijacking, breakdown, etc.)
  • Returns null event if no active event
  • Called periodically by the game client to check vessel status

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": 12345,
  "user_vessel_id": 87654321,
  "speed": 6,
  "guards": 0,
  "dry_operation": 0,
  "price_dry": 655,
  "price_refrigerated": 655
}

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)
  • Prices are per TEU (Twenty-foot Equivalent Unit)

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 prices per TEU (dry and refrigerated)

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": { ... }
}

Notes:
  • Vessel must have an assigned route before departure
  • Higher speed increases fuel consumption but reduces travel time
  • Guards consume additional resources but reduce hijacking risk

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" }
        }
      }
    ]
  }
}

Notes:
  • user_id: Target alliance member whose vessels to depart
  • vessels: Number of COOP tickets to use
  • Target user must have vessels in harbor with assigned routes
  • Actual departed count may be less than requested if target has fewer eligible vessels
  • Error no_vessels_are_ready_to_depart means target has no vessels in harbor or no routes assigned

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

Get Auto-Calculated Route Pricing

Endpoint: POST /api/route/auto-price
Request:
{
  "route_id": 12345
}
Parameters:
  • route_id: ID of the route to get pricing suggestions for

Response:
FIXME
Notes:
  • Provides pricing suggestions based on demand and market conditions
  • Helps optimize revenue per TEU (Twenty-foot Equivalent Unit)
  • Separate pricing for dry and refrigerated cargo
  • Prices are recommendations, can be adjusted when creating route

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
Notes:
  • These ports may have reduced fees or special bonuses

Get Alliance Data for Port

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

Response:
FIXME
Notes:
  • Returns top 3 alliances by total departures from this port
  • Includes user's own alliance rank if in an alliance
  • Returns empty response if port has no alliance data (instead of 404)
Use Cases:
  • Display port competition/rankings
  • Show alliance dominance at specific ports
  • Track alliance performance by port

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:
  • DESTRUCTIVE ACTION - Spends money immediately
  • 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": { ... }
}

Notes:
  • Repairs wear damage on multiple vessels in one operation
  • More efficient than repairing vessels individually
  • vessel_ids must be a JSON string, not a raw array
  • DESTRUCTIVE ACTION - Spends money immediately
  • Vessels must be idle (not on route)

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
Notes:
  • DESTRUCTIVE ACTION - Spends money immediately
  • Vessel must be parked (is_parked: true) to perform upgrades
  • Upgrades trigger a maintenance period (status changes to "maintenance")
  • maintenance_start_time and maintenance_end_time indicate the maintenance window
  • After upgrade: antifouling field shows the model, bulbous_bow becomes true
  • Antifouling types affect fuel efficiency (type_a < type_b < type_c)
  • Bulbous bow reduces fuel consumption

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:
  • DESTRUCTIVE ACTION - Deducts cash from user balance
  • 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:
  • DESTRUCTIVE ACTION - Deducts cash from user balance
  • 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": { ... }
}

Returns:
New salary, satisfaction change
Notes:
  • DESTRUCTIVE ACTION - Increases ongoing salary costs
  • 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": { ... }
}

Returns:
New salary, satisfaction change
Notes:
  • DESTRUCTIVE ACTION - Decreases staff satisfaction
  • May lead to staff quitting if satisfaction too low

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

Notes:
  • Used for private messaging and social features

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": { ... }
}

Returns:
List of all message threads including:
  • Private conversations with other players
  • System messages (hijacking notifications, stock trades, etc.)
  • Each chat includes subject, last message, timestamp, participants

Notes:
  • System chats have system_chat: true flag
  • Hijacking messages include case_id for ransom negotiations
  • Messages array is empty (use separate endpoint to get full thread)

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
  • Message appears immediately in recipient's messenger
  • Used for player-to-player communication

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)
  • Regular chats: player-to-player messages
  • System messages: hijacking notifications, stock trades, etc.
  • Clears "unread" badge from marked chats

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)
  • Permanently removes chat threads
  • Cannot be undone
  • Commonly used to clean up resolved hijacking cases

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": { ... }
}

Returns:
List of all alliance members with requested statistics

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": { ... }
}

Notes:
  • Message appears immediately in alliance chat feed
  • Empty messages (after trimming) are rejected
  • HTML and JavaScript content is sanitized/rejected for security

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)

Notes:
  • Use for alliance search/directory functionality
  • Paginate by incrementing offset by limit value
  • Filter "all" returns all alliances regardless of recruitment status
  • Filter "open" returns only alliances that are actively recruiting

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

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 (see below)
  • page: Page number for pagination (1-based)
  • limit: Results per page (minimum 20, typically 40)
  • search_by: Search query - ONLY works with filter: "search"
Filter Options:

| Filter | Behavior | search_by | |--------|----------|-----------| | "top" | Sort by highest stock value | IGNORED | | "low" | Sort by lowest stock value | IGNORED | | "activity" | Sort by trading activity | IGNORED | | "recent-ipo" | Sort by IPO date (newest first) | IGNORED | | "search" | Search by company name | REQUIRED |

Important Notes:
  • Only companies with stock_for_sale >= 1 appear in results
  • Companies with 0 shares for sale are NOT listed
  • The search_by parameter is completely ignored for all filters except "search"
  • IPO date can be determined from history[0].time in finance-overview response
Search Example:
{
  "filter": "search",
  "page": 1,
  "limit": 40,
  "search_by": "foobar"
}

Returns only companies matching "foobar" in their name and stocks_for_sale > 1


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": { ... }
}

Notes:
  • Purchases stock shares from another player's company
  • Cash is deducted immediately based on current stock price
  • Company must have done IPO (gone public)
  • Returns error "user_has_not_done_ipo" if company is not public
  • DESTRUCTIVE ACTION - Spends money

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": { ... }
}

Returns:
Success confirmation with revenue from sale
Notes:
  • Sells stock shares you own from another player's company
  • Cash is credited immediately based on current stock price
  • You must own at least amount shares to sell
  • This action generates income

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
  • Triggered from stock graph page via + button next to 'Shares (Sale/Total)' legend
  • 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)
  • DESTRUCTIVE ACTION - Spends money

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

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", "normal", "hard"

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

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)
  • Used internally for tracking active campaign count

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
Notes:
  • Activates a marketing campaign to boost vessel performance
  • Campaigns have duration and cost
  • Only one campaign can be activeted at a time
  • Effects apply immediately

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

Notes:
  • DESTRUCTIVE ACTION - Spends cash immediately
  • Anchor points increase vessel capacity
  • Construction takes time
  • Requires sufficient cash balance

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

Notes:
  • Called when user receives a hijacking message notification
  • has_negotiation: 1 indicates negotiation was done at least ones
  • requested_amount: Original pirate ransom demand (will be reduced with every pirate count offer)
  • user_proposal: User's counter-offer (if submitted)

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 sending more offers as the allowed 2 > Pirates want to scam you. (Responese payment price isn't the value the is taken from your balance :D)
  • 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
  • DESTRUCTIVE ACTION - Spends money

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)
  • Used by the game to display ad availability on the map

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

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