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
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 traveledroute_name: Route identifiertotal_distance: Distance in kmfuel_used: Actual fuel consumed in kg (CRITICAL)route_income: Actual income earned in $ (CRITICAL)wear: Wear accumulated on this tripcargo.dry/cargo.refrigerated: Actual cargo carriedduration: Trip duration in secondscreated_at: Timestamp of trip completion
// 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 renamename: 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_idsmust 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 builtvessel_model: Vessel type ("container", "tanker", "bulker", etc.)engine_type: Engine type (e.g., "mih_cp9")engine_kw: Engine power in kilowattscapacity: Cargo capacity in TEU/tonsantifouling_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 kmpropeller_types: Propeller configuration (e.g., "4_blade_propeller")
{
"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_speedguards: 0-5 security guardsprices: 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 typebulbous:1to add bulbous bow,0or 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), NOTperk_type_id(number)
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 useralliance_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 recipientsubject: Message subject line (required)body: Message content (required, max 1000 characters)
{
"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 readsystem_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 deletesystem_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 forlifetime_stats: Include lifetime statistics for each memberlast_24h_stats: Include last 24 hours statistics for each memberlast_season_stats: Include last season statistics for each memberinclude_last_season_top_contributors: Include top contributors list from last season
// 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 IDtext: 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 joinalliance_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 declinealliance_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 toapplication_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" pooldirect: 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": { ... }
}
Donate Points
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 withfilter: "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 ownedbought_at: Average purchase price (null if no shares owned)available_to_sell: Shares available for immediate salenext_available_sale_time: Unix timestamp when more shares become availablenext_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 purchaseamount: 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 sellamount: 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
| 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 viaemployee_workshopSKU 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 dollarsduration: Time required for construction (in seconds)user.cash: User's current cash balanceuser.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/falseanchor_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 admap_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