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
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
- 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
// 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
amountparameter
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 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": { ... }
}
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_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": "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 builtvessel_model: Vessel type ("container", "tanker", "bulker", etc.)engine_type: Engine type ("diesel", "lng", "electric", etc.)engine_kw: Engine power in kilowattscapacity: Cargo capacity in TEU/tonsantifouling_model: Antifouling coating typebulbous: Bulbous bow (0 or 1)enhanced_thrusters: Enhanced thrusters (0 or 1)range: Maximum range in kmspeed: Maximum speed in knotsfuel_consumption: Fuel consumption per hourpropeller_types: Propeller configurationhull_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
nullevent 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_speedguards: 0-5 security guardsprices: 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 departvessels: 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_departmeans 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)
- 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_idsmust 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 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
Notes:
- DESTRUCTIVE ACTION - Spends money immediately
- Vessel must be parked (
is_parked: true) to perform upgrades - Upgrades trigger a maintenance period (
statuschanges to"maintenance") maintenance_start_timeandmaintenance_end_timeindicate the maintenance window- After upgrade:
antifoulingfield shows the model,bulbous_bowbecomestrue - 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), 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
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: trueflag - Hijacking messages include
case_idfor 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 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
- 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 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)
- 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 deletesystem_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 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": { ... }
}
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 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": { ... }
}
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
offsetbylimitvalue - 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 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
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 (Diamonds)
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 withfilter: "search"
| 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 |
- Only companies with
stock_for_sale >= 1appear in results - Companies with 0 shares for sale are NOT listed
- The
search_byparameter is completely ignored for all filters except"search" - IPO date can be determined from
history[0].timein finance-overview response
{
"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 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": { ... }
}
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 sellamount: 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
amountshares 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 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
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: 1indicates negotiation was done at least onesrequested_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 admap_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