Difference between revisions of "API"

From Tycoon Gaming
m
(Distinguish private keys further)
 
(37 intermediate revisions by 9 users not shown)
Line 1: Line 1:
 +
{{otherlang
 +
  | noborder=true
 +
  | fr=FR:API
 +
}}
 +
 +
 +
 
= Transport Tycoon API =
 
= Transport Tycoon API =
  
Line 4: Line 11:
 
* Certain routes will return different data based on server
 
* Certain routes will return different data based on server
 
* Every server requires a different URL to fetch data from, instead of one standardized URL
 
* Every server requires a different URL to fetch data from, instead of one standardized URL
* Every route uses the <span style="color:red"><code>'''/status'''</code></span> endpoint
+
* Legacy routes use the <code>'''/status'''</code> path in urls. <code>v1.api.tycoon</code> addresses are automatically routed with <code>/status</code>.
  
 
== Available servers ==
 
== Available servers ==
Line 13: Line 20:
 
!data-sort-type="text" style="width: 43%" |'''Additional Information'''
 
!data-sort-type="text" style="width: 43%" |'''Additional Information'''
 
|-
 
|-
|'''server.tycoon.community:30169'''
+
|'''v1.api.tycoon.community/main (currently unavailable)'''
tycoon-w8r4q4.users.cfx.re
+
tycoon-2epova.users.cfx.re/status
 
|Server 1
 
|Server 1
|OneSync server, may not be as stable as the other servers
 
|-
 
|'''server.tycoon.community:30122'''
 
tycoon-2epova.users.cfx.re
 
|Server 2
 
|
 
|-
 
|'''server.tycoon.community:30123'''
 
tycoon-2epovd.users.cfx.re
 
|Server 3
 
|
 
|-
 
|'''server.tycoon.community:30124'''
 
tycoon-wdrypd.users.cfx.re
 
|Server 4
 
 
|
 
|
 
|-
 
|-
|'''server.tycoon.community:30125'''
+
|'''v1.api.tycoon.community/beta (currently unavailable)'''
tycoon-njyvop.users.cfx.re
+
tycoon-njyvop.users.cfx.re/status
|Server 5 (Beta)
+
|Server 2 (Beta)
 
|Beta server, data could end up being different compared to other servers
 
|Beta server, data could end up being different compared to other servers
 
|-
 
|-
|'''na.tycoon.community:30120'''
+
 
tycoon-2r4588.users.cfx.re
 
|Server 6
 
|Despite the NA subdomain, these servers are not hosted in North America and are also European
 
|-
 
|'''na.tycoon.community:30122'''
 
tycoon-npl5oy.users.cfx.re
 
|Server 7
 
|
 
|-
 
|'''na.tycoon.community:30123'''
 
tycoon-2vzlde.users.cfx.re
 
|Server 8
 
|
 
|-
 
|'''na.tycoon.community:30124'''
 
tycoon-wmapod.users.cfx.re
 
|Server 9
 
|
 
|-
 
|'''na.tycoon.community:30125'''
 
tycoon-wxjpge.users.cfx.re
 
|Server A
 
|
 
|-
 
 
|'''lite.tycoon.community'''
 
|'''lite.tycoon.community'''
 
tycoon-dgpvx3.users.cfx.re
 
tycoon-dgpvx3.users.cfx.re
Line 71: Line 39:
 
=== Server list CDN file ===
 
=== Server list CDN file ===
  
On 19 June 2021, Tycoon's CDN now hosts a permanent JSON file that returns a list of servers, their player information endpoint, and a template for formatting API URL calls to each server. In addition to the main Transport Tycoon servers, it also includes information for the [LITE] Transportation server.
+
Tycoon's CDN hosts a permanent JSON file that returns a list of servers, their player information endpoint, and a template for formatting API URL calls to each server. In addition to the main Transport Tycoon servers, it also includes information for the [LITE] Transportation server.
The file is permanent and available at <code>https://cdn.tycoon.community/servers.json</code>.
+
The file is available at <code>https://cdn.tycoon.community/servers.json</code>.
  
'''File contents:'''
+
== Private Keys ==
<pre>{
+
 
  "servers": [
+
TL;DR: Create a new private key using <code>/api private new</code>
    {
+
 
      "id": "w8r4q4",
+
Add charges using <code>/api private refill</code> (adds 1000 charges for $1M)
      "owner": "tycoon",
+
 
      "number": "1",
+
Add <code>x</code> charges using <code>/api private refill x</code> (adds x charges for $1000 * <code>x</code>)
      "endpoint": "status/widget/players.json",
+
 
      "name": "Server 1"
+
The API requires a private key to access most features.
    },
+
 
    {
+
Each private key has a limited amount of API calls (also called charges), which are consumed every time an API call is made using the key. Additional charges can be purchased in game using the <code>/api private refill</code> command at the cost of $1000 (in-game money) per charge. Any user can generate a private key (Make sure you keep it safe). To generate a private key, use the <code>/api private new</code> command in game. If you already have a private key generated, the old one will be deleted and a new one will take its place. When you generate a private key for the first time, it will come with some free charges allowing you to test the API for free. The API key can be copied using the <code>/api private copy</code> command, which will display the key for you to copy to your clipboard. Any user with a linked Discord account will receive a Discord role upon refilling their keys.
      "id": "2epova",
+
 
      "owner": "tycoon",
+
[[File:Api key guide.png|thumb|A depiction of the public/private key relationship]]
      "number": "2",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 2"
 
    },
 
    {
 
      "id": "2epovd",
 
      "owner": "tycoon",
 
      "number": "3",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 3"
 
    },
 
    {
 
      "id": "wdrypd",
 
      "owner": "tycoon",
 
      "number": "4",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 4"
 
    },
 
    {
 
      "id": "njyvop",
 
      "owner": "tycoon",
 
      "number": "5",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 5 (Beta)"
 
    },
 
    {
 
      "id": "2r4588",
 
      "owner": "tycoon",
 
      "number": "6",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 6"
 
    },
 
    {
 
      "id": "npl5oy",
 
      "owner": "tycoon",
 
      "number": "7",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 7"
 
    },
 
    {
 
      "id": "2vzlde",
 
      "owner": "tycoon",
 
      "number": "8",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 8"
 
    },
 
    {
 
      "id": "wmapod",
 
      "owner": "tycoon",
 
      "number": "9",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server 9"
 
    },
 
    {
 
      "id": "wxjpge",
 
      "owner": "tycoon",
 
      "number": "A",
 
      "endpoint": "status/widget/players.json",
 
      "name": "Server A"
 
    },
 
    {
 
      "id": "dgpvx3",
 
      "owner": "tycoon",
 
      "number": "L",
 
      "endpoint": "sessionmanager/players.json",
 
      "name": "[LITE] Transportation"
 
    }
 
  ],
 
  "notice": "Proxy may not always be available, even if the server is",
 
  "template": "https://${owner}-${id}.users.cfx.re/${endpoint}"
 
}</pre>
 
  
== API Keys ==
+
== Public keys ==
  
TL;DR: Create a new key using <code>/api key new</code>
+
Public keys are keys that can be used to access a players account information without needing that player's private key and charges.
  
Add charges using <code>/api key refill</code> (adds 1000 charges for $1M)
+
The public key is not valid by itself and must be included alongside a valid private key
  
The API requires an API Key to access most features.
+
The public key can be be used as an authorization/identification token, changing the target account from the private key's owner to the public key's owner for commands whose data is determined by public/private key ownership (i.e deadliest_catch, faction endpoints) or, allowing access to data for accounts with [[API#Privacy related options|API locks]] in place.
  
Each key has a limited amount of API calls (also called charges), which are consumed every time an API call is made using the key. Additional charges can be purchased in game using the <code>/api key refill</code> command at the cost of $1000 (in-game money) per charge. Any user can generate an API key; this key is said user's private key. (Make sure you keep it safe!) To generate a key, use the <code>/api key new</code> command in game. If you already have a key generated, the old one will be deleted and a new one will take its place. When you generate a key for the first time, it will come with some free charges allowing you to test the API for free. The API key can be copied using the <code>/api key copy</code> command, which will display the key for you to copy to your clipboard. Any user with a linked Discord account will receive a Discord role upon refilling their keys.
+
To generate a public key, use <code>/api public generate</code>
  
 
== Privacy related options ==
 
== Privacy related options ==
  
As the API has become more and more commonly used, it is now possible to restrict access to your player/personal data so that only your API key can query it. In order to restrict access, do <code>/api lock</code> in game, and privacy will be enabled.
+
You may restrict access to your own data with the <code>/api lock</code> command in-game. When your API information is locked, data is inaccessible to anyone requesting it unless the request includes your public or private key.
  
 
== API Endpoints ==
 
== API Endpoints ==
Line 177: Line 74:
 
=== General notes ===
 
=== General notes ===
  
* API keys should be sent as headers, like such: <code>X-Tycoon-Key: [api-key]</code>
+
* Private keys should be sent as headers, like such: <code>X-Tycoon-Key: [api-key]</code>
* Each endpoint here will mention if a key is required to be used. Note that currently, every route which requires a key will only use 1 charge per request.
+
* Public keys are sent with the <code>X-Tycoon-Public-Key: [public-key]</code> header
 +
* Each endpoint here will mention if a private key is required to be used. Note that currently, every route which requires a key will only use 1 charge per request.
 
* Typically, this data is returned as JSON, unless explicitly mentioned.
 
* Typically, this data is returned as JSON, unless explicitly mentioned.
* Most routes will have a response header called <code>X-Tycoon-Charges</code>, which will give you the number of charges remaining after the request.
+
* Most routes will have a response header called <code>X-Tycoon-Charges</code>, which will give you the number of private key charges remaining after the request.
  
 
==== Standard status codes ====
 
==== Standard status codes ====
  
* 401 Unauthorized - An API key is required for the route
+
* 400 Bad Request - invalid endpoint
 +
* 401 Unauthorized - A private key is required for the route
 
* 402 Payment Required - No API charges remaining
 
* 402 Payment Required - No API charges remaining
* 403 Forbidden - Invalid API key
+
* 403 Forbidden - Invalid private key or invalid public key
 
* 404 Not Found - Invalid API route
 
* 404 Not Found - Invalid API route
  
 
<hr></hr>
 
<hr></hr>
 +
 +
=== Endpoints List ===
 +
 +
==== <code>GET /endpoints.json</code> ====
 +
Returns all available endpoints of the target server. This returned value should always be the same regardless of which server it's used on (excluding beta and/or event).<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
[
 +
  ...
 +
  "/faction/balance.json",
 +
  "/charges.json",
 +
  ...
 +
]
 +
</pre>
  
 
=== Main endpoints ===
 
=== Main endpoints ===
Line 197: Line 114:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>204 NO CONTENT</code>
 
* '''Code:''' <code>204 NO CONTENT</code>
* '''Requires key''': <code>false</code>
+
* '''Requires private key''': <code>false</code>
  
 
==== <code>GET /charges.json</code> ====
 
==== <code>GET /charges.json</code> ====
Line 203: Line 120:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>  
 
* '''Code:''' <code>200 OK</code>  
* '''Requires key''': <code>true</code>
+
* '''Requires private key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 215: Line 132:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>false</code>  
+
* '''Requires private key''': <code>false</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 225: Line 142:
  
 
==== <code>GET /skillrotation.json</code> ====
 
==== <code>GET /skillrotation.json</code> ====
 +
==== <code>GET /sotd.json</code> ====
 
Fetches the current skill rotation for the servers<br>
 
Fetches the current skill rotation for the servers<br>
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
 
<pre>
 
<pre>
 
{
 
{
   "bonus": 11, // Bonus percentage (10-30)
+
  "aptitude": "trucking/postop", // Skill component
   "skill": "Cargo Piloting" // Name of the skill it applies to
+
  "short": "PostOP",
 +
   "bonus": 33, // Bonus Percentage (25-50)
 +
   "skill": "PostOP" // Name of the skill it applies to
 +
}
 +
</pre>
 +
 
 +
==== <code>GET /racing/tracks.json</code> ====
 +
Fetches general info about TT races.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  ...
 +
  {
 +
    "index": 1,
 +
    "name": "TTfred",
 +
    "wr": {
 +
      "vehicle": "On Foot",
 +
      "time": 759614,
 +
      "date": 1644171709000.0,
 +
      "name": "IFS™"
 +
    },
 +
    "class": "Cars",
 +
    "length": 28167,
 +
    "type": "ground"
 +
  },
 +
  ...
 +
}
 +
</pre>
 +
 
 +
==== <code>GET /dealership.json</code> ====
 +
Fetches data about the current dealership rotation.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  "Premium": [
 +
      {
 +
          "name": "Patriot Stretch",
 +
          "price": 500000,
 +
          "model": "patriot2"
 +
      },
 +
      ...
 +
  ],
 +
  "Offroad": [
 +
      {
 +
          "name": "Bifta",
 +
          "price": 5000,
 +
          "model": "bifta"
 +
      },
 +
      ...
 +
  ],
 +
  ...
 
}
 
}
 
</pre>
 
</pre>
Line 244: Line 220:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''  
 
'''Response data:'''  
The response is a JSON object containing weather data.
 
 
<pre>
 
<pre>
 
{
 
{
   "time_remaining": 1497, // Time in seconds until next weather change
+
   "minute": 36,
   "current_weather": "drizzling" // The current weather on the server
+
  "hour": 16,  
 +
   "weather": "CLEAR" // The current weather on the server
 
}
 
}
 
</pre>
 
</pre>
 +
 
==== <code>GET /forecast.json</code> ====
 
==== <code>GET /forecast.json</code> ====
 
Fetches info about the current forecast on the server.<br>
 
Fetches info about the current forecast on the server.<br>
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''  
 
'''Response data:'''  
The response is a JSON object containing forecast data.
 
 
<pre>
 
<pre>
 
[
 
[
Line 271: Line 247:
 
]
 
]
 
</pre>
 
</pre>
 +
 
==== <code>GET /airline.json</code> ====
 
==== <code>GET /airline.json</code> ====
 
Returns the current active destinations for players doing airline.<br>
 
Returns the current active destinations for players doing airline.<br>
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>
+
* '''Requires private key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 300: Line 277:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>false</code>  
+
* '''Requires private key''': <code>false</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 316: Line 293:
  
 
==== <code>GET /map/positions.json</code> ====
 
==== <code>GET /map/positions.json</code> ====
Fetches the data of players, including position and vehicle data, along with each player's last 20 locations separated by around 4 seconds.<br>
+
Fetches the data of players, including position and vehicle data, along with each player's last 30 locations separated by around 500 milliseconds.<br>
 
'''Note: the position history doesn't seem to apply to every player, so make sure to check if this data exists first!'''<br>
 
'''Note: the position history doesn't seem to apply to every player, so make sure to check if this data exists first!'''<br>
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>
+
* '''Requires private key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 378: Line 355:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>false</code>  
+
* '''Requires private key''': <code>false</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 440: Line 417:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 455: Line 432:
 
     ...
 
     ...
 
   ]
 
   ]
 +
}
 +
</pre>
 +
 +
==== <code>GET /racing/map/[id]</code> ====
 +
Fetches the name and blip information about a race.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  "finish": {
 +
    "blip": 26739008,
 +
    "x": -2169.2763671875,
 +
    "z": 16.877534866333,
 +
    "y": 5195.4794921875,
 +
    "h": 0.68444913625717
 +
  },
 +
  "checkpoints": [
 +
    { ... },
 +
    ...
 +
  ],
 +
  "start": {
 +
    ...
 +
  },
 +
  "name": "TTfred"
 
}
 
}
 
</pre>
 
</pre>
Line 469: Line 473:
 
| Business || omni_businesses
 
| Business || omni_businesses
 
|-
 
|-
| Garages || omni_garbage
+
| Garbage Collector || omni_garbage
 
|-
 
|-
 
| Heli Job || omni_helitour
 
| Heli Job || omni_helitour
Line 484: Line 488:
 
|-
 
|-
 
| Houses, Stuff in Houses || vrp
 
| Houses, Stuff in Houses || vrp
 +
|-
 +
| RTS Ground (Vehicles, Locations) || rts_ground
 +
|-
 +
| Tycoons Custom Vehicle Classes || custom-vehicle-classes
 
|}
 
|}
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>false</code>
+
* '''Requires private key''': <code>false</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 513: Line 521:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 525: Line 533:
 
</pre>
 
</pre>
  
 +
==== <code>GET /streak/[vRPid]</code> ====
 +
Get users streak.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  "data": {
 +
    "days": 72,
 +
    "record": 49,
 +
    "streak": 49
 +
  },
 +
  "code": "200",
 +
  "user_id": 56112
 +
}
 +
</pre>
  
 
==== <code>GET /getuserbiz/[vRPid]</code> ====
 
==== <code>GET /getuserbiz/[vRPid]</code> ====
Line 530: Line 556:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 547: Line 573:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 562: Line 588:
 
   },
 
   },
 
   "user_id": 41306
 
   "user_id": 41306
 +
}
 +
</pre>
 +
 +
==== <code>GET /trunks/[vRPid]</code> ====
 +
Get users vehicle inventories.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
{
 +
    "user_id": 256983,
 +
    "code": "200",
 +
    "trunks": [
 +
        {
 +
            "inventory": {},
 +
            "type": "aircraft",
 +
            "vehicle": "a320"
 +
        },
 +
        {
 +
            "inventory": {
 +
                "upgrade_kit_primo2": {
 +
                    "amount": 1
 +
                },
 +
                "fridge_airline_meal": {
 +
                    "amount": 668
 +
                }
 +
            },
 +
            "type": "aircraft",
 +
            "vehicle": "a330neo"
 +
        },
 +
        {
 +
            "inventory": {},
 +
            "type": "helicopter",
 +
            "vehicle": "volatus"
 +
        }
 +
    ]
 +
}
 +
</pre>
 +
 +
 +
==== <code>GET /deadliest_catch.json</code> ====
 +
Get users placed pots.<br>
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
[
 +
    ...,
 +
    {
 +
        "position": {
 +
            "y": -5161.54150390625,
 +
            "z": 0.21182405948638,
 +
            "x": 4909.94287109375
 +
        },
 +
        "age": 951507,  // Seconds since pot was placed
 +
        "type": "crab"
 +
    },
 +
    ...
 +
]
 +
</pre>
 +
 +
==== <code>GET /stats/[vRPid]</code> ====
 +
Returns users stats
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  ...
 +
  {
 +
    "stat": "quarry_coop",
 +
    "name": "Contributed Quarry Deliveries",
 +
    "amount": 446
 +
  },
 +
  ...
 +
}
 +
</pre>
 +
==== <code>GET /storages/[vRPid]</code> ====
 +
Returns users storages
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
'''Response data:'''
 +
<pre>
 +
{
 +
    "user_id": 256983,
 +
    "code": "200",
 +
    "storages": [
 +
        {
 +
            "inventory": {
 +
                "gut_knife_fade|132": {
 +
                    "amount": 1
 +
                },
 +
                "liberty_voucher_goods": {
 +
                    "amount": 168
 +
                }
 +
            },
 +
            "name": "bctp"
 +
        },
 +
        {
 +
            "inventory": {},
 +
            "name": "tsu"
 +
        }
 +
    ]
 +
}
 +
</pre>
 +
==== <code>GET /racing/races/[vRPid]</code> ====
 +
Returns users racing stats
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  ...
 +
  {
 +
    "track_id": -1837157281,
 +
    "time": 50636,
 +
    "vehicle": "Visione",
 +
    "achieved": 1642359702000.0,
 +
    "user_id": 56112
 +
  },
 +
  ...
 
}
 
}
 
</pre>
 
</pre>
Line 569: Line 727:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 579: Line 737:
 
   "data": {
 
   "data": {
 
     "inventory": {
 
     "inventory": {
       "group_card|mechanic|Mechanic": {
+
       "job_card|mechanic|Mechanic": {
 
         "amount": 10
 
         "amount": 10
 
       }
 
       }
Line 592: Line 750:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 614: Line 772:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 646: Line 804:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
 
'''Response data:'''
 
'''Response data:'''
 
<pre>
 
<pre>
Line 655: Line 813:
 
   "loan": 0,
 
   "loan": 0,
 
   "code": "200"
 
   "code": "200"
 +
}
 +
</pre>
 +
 +
==== <code>GET /iteminfo/[itemid]</code> ====
 +
Returns item info
 +
*Item IDs returned by the API in requests such as DataAdv can be used as-is
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
'''Response data:'''
 +
<pre>
 +
{
 +
  "item_id": "itemid", // Same as input, always returned
 +
  "name": "Item Name",
 +
  "weight": 0.0,
 +
  "description": "Description", // As seen in the in-game M-menu (HTML included)
 +
  "exists": true // Does the requested item id resolve to an actual item?
 
}
 
}
 
</pre>
 
</pre>
Line 662: Line 838:
 
=== Faction endpoints ===
 
=== Faction endpoints ===
 
This data also fits under the "Global endpoint" category, however, there are many faction-related endpoints, so it's simpler to combine them into one small section.<br>
 
This data also fits under the "Global endpoint" category, however, there are many faction-related endpoints, so it's simpler to combine them into one small section.<br>
Do note, all endpoints except <code>GET /getuserfaq/[vRPid]</code> are related to the faction the key creator is in and may require a certain rank in the faction.
+
Do note, all endpoints except <code>GET /getuserfaq/[vRPid]</code> are related to the faction the key creator or public key is in and may require a certain rank in the faction.
  
 
==== <code>GET /getuserfaq/[vRPid]</code> ====
 
==== <code>GET /getuserfaq/[vRPid]</code> ====
Line 669: Line 845:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>  
  
 
'''Response data:'''
 
'''Response data:'''
Line 686: Line 862:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 698: Line 875:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 727: Line 905:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 739: Line 918:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 751: Line 931:
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>true</code>  
+
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public Key''': <code>true</code>
  
 
'''Response data:'''
 
'''Response data:'''
Line 761: Line 942:
 
}
 
}
 
</pre>
 
</pre>
 +
 +
<hr></hr>
 +
 +
=== Company endpoints ===
 +
 +
==== <code>GET /companies/rts/ground.json</code> ====
 +
Returns ground vehicles avaiblile to deliver<br>
 +
Returns empty if not opened the menu
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
* '''Accepts Public key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
{
 +
"vehicles": [
 +
  "brutus ",
 +
  "infernus",
 +
  "fugitive",
 +
  "romero",
 +
  "formula",
 +
  "zr350ta",
 +
  "iwagen",
 +
  "blazer3"
 +
]
 +
}
 +
</pre>
 +
 +
==== <code>GET /companies/pigs/party.json</code> ====
 +
Returns information of ongoing pigs heist<br>
 +
 +
'''Response:'''
 +
* '''Code:''' <code>200 OK</code>
 +
* '''Requires private key''': <code>true</code>
 +
 +
'''Response data:'''
 +
<pre>
 +
{
 +
"master": { // Heist Leader
 +
  "source": 662, // Server player id
 +
  "ready": true,
 +
  "cut": 2 // Number of successful heists
 +
},
 +
"take": 0, // Total stolen money of current heist
 +
"slaves": [
 +
  {
 +
  "source": 661, // Server player id
 +
  "ready": true,
 +
  "cut": 1 // Number of successful heist locations
 +
  }
 +
],
 +
"kills": 0, // Number of A.I. enemies killed
 +
"limit": 1024 // Total players allowed in a heist - hardcoded 1024
 +
}
 +
</pre>
 +
  
 
<hr></hr>
 
<hr></hr>
Line 768: Line 1,007:
  
 
==== <code>GET sessionmanager/players.json</code> ====
 
==== <code>GET sessionmanager/players.json</code> ====
Returns a list of players, similar to the main servers' <code>status/widget/players.json</code>.
+
Returns a list of players, similar to the main servers' <code>widget/players.json</code>.
  
 
'''Response:'''
 
'''Response:'''
 
* '''Code:''' <code>200 OK</code>
 
* '''Code:''' <code>200 OK</code>
* '''Requires key''': <code>false</code>  
+
* '''Requires private key''': <code>false</code>  
  
 
'''Response data:'''
 
'''Response data:'''

Latest revision as of 22:44, 22 July 2024

French Dutch



Contents

Transport Tycoon API

The api for TT follows a few standard principles:

  • Certain routes will return different data based on server
  • Every server requires a different URL to fetch data from, instead of one standardized URL
  • Legacy routes use the /status path in urls. v1.api.tycoon addresses are automatically routed with /status.

Available servers

Note: Secondary adress listings are the cfx.re proxy- usage is the same.

Address Server Name Additional Information
v1.api.tycoon.community/main (currently unavailable)

tycoon-2epova.users.cfx.re/status

Server 1
v1.api.tycoon.community/beta (currently unavailable)

tycoon-njyvop.users.cfx.re/status

Server 2 (Beta) Beta server, data could end up being different compared to other servers
lite.tycoon.community

tycoon-dgpvx3.users.cfx.re

[LITE] Transportation Runs a different gamemode, does not respond to standard Transport Tycoon API calls. sessionmanager/players.json will fetch a list of players.

Server list CDN file

Tycoon's CDN hosts a permanent JSON file that returns a list of servers, their player information endpoint, and a template for formatting API URL calls to each server. In addition to the main Transport Tycoon servers, it also includes information for the [LITE] Transportation server. The file is available at https://cdn.tycoon.community/servers.json.

Private Keys

TL;DR: Create a new private key using /api private new

Add charges using /api private refill (adds 1000 charges for $1M)

Add x charges using /api private refill x (adds x charges for $1000 * x)

The API requires a private key to access most features.

Each private key has a limited amount of API calls (also called charges), which are consumed every time an API call is made using the key. Additional charges can be purchased in game using the /api private refill command at the cost of $1000 (in-game money) per charge. Any user can generate a private key (Make sure you keep it safe). To generate a private key, use the /api private new command in game. If you already have a private key generated, the old one will be deleted and a new one will take its place. When you generate a private key for the first time, it will come with some free charges allowing you to test the API for free. The API key can be copied using the /api private copy command, which will display the key for you to copy to your clipboard. Any user with a linked Discord account will receive a Discord role upon refilling their keys.

A depiction of the public/private key relationship

Public keys

Public keys are keys that can be used to access a players account information without needing that player's private key and charges.

The public key is not valid by itself and must be included alongside a valid private key

The public key can be be used as an authorization/identification token, changing the target account from the private key's owner to the public key's owner for commands whose data is determined by public/private key ownership (i.e deadliest_catch, faction endpoints) or, allowing access to data for accounts with API locks in place.

To generate a public key, use /api public generate

Privacy related options

You may restrict access to your own data with the /api lock command in-game. When your API information is locked, data is inaccessible to anyone requesting it unless the request includes your public or private key.

API Endpoints

General notes

  • Private keys should be sent as headers, like such: X-Tycoon-Key: [api-key]
  • Public keys are sent with the X-Tycoon-Public-Key: [public-key] header
  • Each endpoint here will mention if a private key is required to be used. Note that currently, every route which requires a key will only use 1 charge per request.
  • Typically, this data is returned as JSON, unless explicitly mentioned.
  • Most routes will have a response header called X-Tycoon-Charges, which will give you the number of private key charges remaining after the request.

Standard status codes

  • 400 Bad Request - invalid endpoint
  • 401 Unauthorized - A private key is required for the route
  • 402 Payment Required - No API charges remaining
  • 403 Forbidden - Invalid private key or invalid public key
  • 404 Not Found - Invalid API route

Endpoints List

GET /endpoints.json

Returns all available endpoints of the target server. This returned value should always be the same regardless of which server it's used on (excluding beta and/or event).
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

[
  ...
  "/faction/balance.json",
  "/charges.json",
  ...
]

Main endpoints

GET /alive

This endpoint is simply designed to be used as a status check for the API.
Response:

  • Code: 204 NO CONTENT
  • Requires private key: false

GET /charges.json

Used to check how many charges are left on the specific key. Will not use an API charge.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data: An array where index 0 is the amount of charges remaining

[xxxx]

GET /economy.csv

Fetches general info about the economy of TT, such as the amount of billionaires, etc.
Response:

  • Code: 200 OK
  • Requires private key: false

Response data: The response is a large CSV file separated with semicolons, with a lot of data about the economy in Transport Tycoon.

Time;Debt;Money;Debts;Millionaires;Billionaires;Users;Players
1580811614;14255411890;1106983649214;10361;14458;179;316329;40

GET /skillrotation.json

GET /sotd.json

Fetches the current skill rotation for the servers
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "aptitude": "trucking/postop", // Skill component 
  "short": "PostOP",
  "bonus": 33, // Bonus Percentage (25-50)
  "skill": "PostOP" // Name of the skill it applies to
}

GET /racing/tracks.json

Fetches general info about TT races.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  ...
  {
    "index": 1,
    "name": "TTfred",
    "wr": {
      "vehicle": "On Foot",
      "time": 759614,
      "date": 1644171709000.0,
      "name": "IFS™"
    },
    "class": "Cars",
    "length": 28167,
    "type": "ground"
  },
  ...
}

GET /dealership.json

Fetches data about the current dealership rotation.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
   "Premium": [
       {
           "name": "Patriot Stretch",
           "price": 500000,
           "model": "patriot2"
       },
       ...
   ],
   "Offroad": [
       {
           "name": "Bifta",
           "price": 5000,
           "model": "bifta"
       },
       ...
   ],
   ...
}

Server-specific endpoints

GET /weather.json

Fetches info about the current weather on the server, including how long until it changes.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "minute": 36,
  "hour": 16, 
  "weather": "CLEAR" // The current weather on the server
}

GET /forecast.json

Fetches info about the current forecast on the server.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

[
  'CLEAR',      'OVERCAST',
  'EXTRASUNNY', 'CLEARING',
  'RAIN',       'RAIN',
  'RAIN',       'CLOUDS',
  'FOGGY'
]

GET /airline.json

Returns the current active destinations for players doing airline.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "875": [ // Route number
    "Velum", // Vehicle model / name
    { // Destination
      "z": 20.51197052002,
      "y": 6583.7412109375,
      "x": 2777.1384277344,
      "h":  47.063835144043,
      "airport": "MGA"
      "name": "Mount Gordo Terminal 3"
    },
    false, // Boarding/arrived (set once the plane is unloading)
    41306 // vRP id
  ]
}

GET /players.json

Fetches basic data about the current players on the server.
Response:

  • Code: 200 OK
  • Requires private key: false

Response data:

{
  "players": [
    [
      "xxxx", // [0] user name
      895, //    [1] source id
      41306 //   [2] vRP id
    ],
  ]
}

GET /map/positions.json

Fetches the data of players, including position and vehicle data, along with each player's last 30 locations separated by around 500 milliseconds.
Note: the position history doesn't seem to apply to every player, so make sure to check if this data exists first!
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "players": [
    [
      "xxxx", // Player name
      820, // Source ID (FiveM assigned plyr ID)
      41306, // vRP id
      { // Position
        "z": 16.24852180480957, // Current X coordinate
        "y": 5180.30029296875,  // Current Y coordinate
        "x": -2179.143798828125 // Current Z coordinate
      },
      { // Vehicle Data
        "vehicle_type": "helicopter",
        "vehicle_name": "Maverick",
        "vehicle_label": "MAVERICK",
        "vehicle_class": 15, // Vehicle class id, see https://docs.fivem.net/natives/?_0x29439776AAA00A62
        "vehicle_spawn": "maverick",
        "owned_vehicles": {
          "trailer": "drybulktr",
          "cab": "urnext",
          "car": "rc350"
        },
        "vehicle_model": -1660661558, // Model hash
        "trailer": "",
        "has_trailer": false
      },
      { // Job data
        "group": "firefighter",
        "name": "Firefighter"
      },
      [ // Incremental position history
        [
          78, //     Incremental index
          3612.8, // X
          3766.1, // Y
          32.3    // Z
        ],
        [
          79,
          3612.8,
          3766.1,
          32.3
        ],
        ...
      ]
    ]
  ],
  "caches": 6648,
  "requests": 6834
}

GET /widget/players.json

Fetches basic data about the current players on the server.
Response:

  • Code: 200 OK
  • Requires private key: false

Response data:

{
  "server": {
    "number": "1",
    "dxp": [
      true, // Dxp active
      "xxxx", // Dxp host
      22474824, // Time remaining
      0, // Extra DXP time
      6325176 // How long the Dxp has been active
    ],
    "limit": 128, // Player limit
    "region": "OS",
    "uptime": "14h 25m",
    "beta": "",
    "motd": "",
    "name": ""
  },
  "players": [
    [
      "xxxx", // Username
      895, // Source ID (FiveM assigned plyr ID)
      434912, // vRP id
      "img", // Avatar url
      false, // Staff
      "Train Conductor", // Job
      false // Donator
    ]
  ]
}

Global endpoints

These endpoints should return data regardless of the server they are run on (excluding Beta and [LITE]). These endpoints are related to user data.

GET /top10/[statName]

Fetches the top 10 info for the specific stat. Available stats:

firefighter_streak_record
omni_void_leaderboard
ems_streak_record
ems_deliveries
houses_crafted
toll_paid
trap_paid
drops_collected
quarry_excavate
quarry_coop
quarry_deliver
quarry_solo
vehicles_crafted
eastereggs_pickup
maid_maxscans
maid_ticket

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "code": "200",
  "stat": "toll_paid",
  "top": [
    {
      "amount": 14765137,
      "username": "xxxxx",
      "user_id": 41306
    },
    ...
  ]
}

GET /racing/map/[id]

Fetches the name and blip information about a race.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "finish": {
    "blip": 26739008,
    "x": -2169.2763671875,
    "z": 16.877534866333,
    "y": 5195.4794921875,
    "h": 0.68444913625717
  },
  "checkpoints": [
    { ... },
    ...
  ],
  "start": {
    ...
  },
  "name": "TTfred"
}

GET /config/[resourceName]

Pulls the config.lua of specific server resources which support this. Available resources:

Type/Job Config Path
Bus Job omni_busdriver
Business omni_businesses
Garbage Collector omni_garbage
Heli Job omni_helitour
EMS/Paramedic omni_paramedic
Conductor omni_pax
Postop Ground omni_postop_ground
Postop Air omni_postop_air
Self Storages omni_self_storage
Houses, Stuff in Houses vrp
RTS Ground (Vehicles, Locations) rts_ground
Tycoons Custom Vehicle Classes custom-vehicle-classes

Response:

  • Code: 200 OK
  • Requires private key: false

Response data: The lua file which configures the given resource.

--[[ omni_businesses CONFIG 1/1 (sh_businesses.lua) ]]--
BUSINESSES = {
  {
      name = "Jonny Tung",
      id = "biz_tung",
      cost = 25*10^6,
      reqlvl = {"@business.business.>61"},
      visuallvl = "62",
      position = {name = "Jonny Tung", x = -902.894836, y = -227.015121, z = 39.818169, h = 331.733337}, -- glitchdetector (3)
      special = {
          {type = "special", name = "Location", x = -905.682617, y = -232.291809, z = 39.818180, h = 137.194992},
          {type = "garage", name = "Garage", x = -900.111206, y = -201.733612, z = 38.247940, h = 71.658554}, -- glitchdetector (3)
      },
  }
  ...

GET /snowflake2user/[discordId]

Converts the discord snowflake into a vRP id, for use in other endpoints.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "code": "200",
  "user_id": 41306,
  "discord_id": 138725221749358592,
  "type": "linked"
}

GET /streak/[vRPid]

Get users streak.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "data": {
    "days": 72,
    "record": 49,
    "streak": 49
  },
  "code": "200",
  "user_id": 56112
}

GET /getuserbiz/[vRPid]

Get users owned businesses.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "code": "200",
  "businesses": {
    "biz_vespucci_masks": 14 // [id]: level
  },
  "user_id": 41306
}

GET /ownedvehicles/[vRPid]

Get users owned vehicles.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "code": "200",
  "vehicles": {
    "trailers2": ["trailer", 2750], // Model: array[class, inventory_size]
    "vestra": ["aircraft", 30],
    "bmx": ["bicycle", 10],
    "neon": ["car", 10],
    "hakuchou": ["bike", 10],
    "hauler2": ["cab", 10]
  },
  "user_id": 41306
}

GET /trunks/[vRPid]

Get users vehicle inventories.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
    "user_id": 256983,
    "code": "200",
    "trunks": [
        {
            "inventory": {},
            "type": "aircraft",
            "vehicle": "a320"
        },
        {
            "inventory": {
                "upgrade_kit_primo2": {
                    "amount": 1
                },
                "fridge_airline_meal": {
                    "amount": 668
                }
            },
            "type": "aircraft",
            "vehicle": "a330neo"
        },
        {
            "inventory": {},
            "type": "helicopter",
            "vehicle": "volatus"
        }
    ]
}


GET /deadliest_catch.json

Get users placed pots.
Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

[
    ...,
    {
        "position": {
            "y": -5161.54150390625,
            "z": 0.21182405948638,
            "x": 4909.94287109375
        },
        "age": 951507,  // Seconds since pot was placed
        "type": "crab"
    },
    ...
]

GET /stats/[vRPid]

Returns users stats

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  ...
  {
    "stat": "quarry_coop",
    "name": "Contributed Quarry Deliveries",
    "amount": 446
  },
  ...
}

GET /storages/[vRPid]

Returns users storages

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
    "user_id": 256983,
    "code": "200",
    "storages": [
        {
            "inventory": {
                "gut_knife_fade|132": {
                    "amount": 1
                },
                "liberty_voucher_goods": {
                    "amount": 168
                }
            },
            "name": "bctp"
        },
        {
            "inventory": {},
            "name": "tsu"
        }
    ]
}

GET /racing/races/[vRPid]

Returns users racing stats

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  ...
  {
    "track_id": -1837157281,
    "time": 50636,
    "vehicle": "Visione",
    "achieved": 1642359702000.0,
    "user_id": 56112
  },
  ...
}

GET /data/[vRPid]

Get users data, such as inventory, clothing, and more.
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{ // Too much data to display and annotate, try and experiment, and dont be afraid to ask around!
  "code": "200",
  "data_type": "data_offline",
  "user_id": 41306,
  "data": {
    "inventory": {
      "job_card|mechanic|Mechanic": {
        "amount": 10
      }
    }
  }
  ...
}

GET /dataadv/[vRPid]

Get users data with more detailed item info (weight, name, etc).
Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

 
{
  "amount": 185,
  "weight": 0.0,
  "name": "<span style=\"color:lawngreen\">Sandwich</span>"
},

GET /chest/[chestName]

Allows you to fetch the items inside of chests.
Chest naming scheme cheatsheat:

  • Fetch vehicle storage: u[vRPid]veh_[vehClass]_[model]
  • Fetch home storage: u[vRPid]home
  • Fetch backpack storage: u[vRPid]backpack
  • Fetch faction storage: self_storage:[vRPid]:faq_[factionId]:chest
  • Other storage: self_storage:[vRPid]:[storageId]:chest

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "data":  {
    "refined_flint":  {
      "amount":  288
    },
    "scrap_gravel":  {
      "amount":  48
    },
    "tcargodust":  {
      "amount":  1650
    },
    "refined_sand":  {
      "amount":  504
    }
  },
  "code":  "200",
  "data_type":  "chest",
  "chest":  "self_storage:41306:faq_56:chest"
}

GET /wealth/[vRPid]

Returns users wealth

Note: User Must be online to obtain wealth Data

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "user_id": 256983,
  "wallet": 101256983,
  "bank": 0,
  "loan": 0,
  "code": "200"
}

GET /iteminfo/[itemid]

Returns item info

  • Item IDs returned by the API in requests such as DataAdv can be used as-is

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
  "item_id": "itemid", // Same as input, always returned
  "name": "Item Name",
  "weight": 0.0,
  "description": "Description", // As seen in the in-game M-menu (HTML included)
  "exists": true // Does the requested item id resolve to an actual item?
}

Faction endpoints

This data also fits under the "Global endpoint" category, however, there are many faction-related endpoints, so it's simpler to combine them into one small section.
Do note, all endpoints except GET /getuserfaq/[vRPid] are related to the faction the key creator or public key is in and may require a certain rank in the faction.

GET /getuserfaq/[vRPid]

Returns the faction the user is in, if in any.

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
    "is_in_faction": true,
    "faction_id": 56,
    "code": "200",
    "user_id": xxxxx
}

GET /faction/size.json

Returns the amount of members in faction.

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

[787] // 0: Member count

GET /faction/members.json

Returns the info of the members in a faction.

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

  { // Most of this data is self explanatory
    "earned": 2199936,
    "management": 0,
    "user_id": 1,
    "admin": 0,
    "recruiter": 1,
    "username": [ // Username as UTF-16 character codes
        67,
        111,
        108,
        108,
        105,
        110,
        115
    ],
    "joined": 1608662095000.0 // Timestamp of when the user joined
  }
]

GET /faction/perks.json

Returns the amount of perks a faction has

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

[39] // 0: Perk amount

GET /faction/balance.json

Returns the factions balance

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

[107965.0] // 0: Faction balance

GET /faction/info.json

Returns some basic faction info

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public Key: true

Response data:

{
  "tag": "The Corrupt",
  "faction_id": 56,
  "name": "CoCo"
}

Company endpoints

GET /companies/rts/ground.json

Returns ground vehicles avaiblile to deliver
Returns empty if not opened the menu

Response:

  • Code: 200 OK
  • Requires private key: true
  • Accepts Public key: true

Response data:

{
 "vehicles": [
  "brutus ",
  "infernus",
  "fugitive",
  "romero",
  "formula",
  "zr350ta",
  "iwagen",
  "blazer3"
 ]
}

GET /companies/pigs/party.json

Returns information of ongoing pigs heist

Response:

  • Code: 200 OK
  • Requires private key: true

Response data:

{
 "master": { // Heist Leader
  "source": 662, // Server player id
  "ready": true,
  "cut": 2 // Number of successful heists
 },
 "take": 0, // Total stolen money of current heist
 "slaves": [
  {
   "source": 661, // Server player id
   "ready": true,
   "cut": 1 // Number of successful heist locations
  }
 ],
 "kills": 0, // Number of A.I. enemies killed
 "limit": 1024 // Total players allowed in a heist - hardcoded 1024
}



[LITE] endpoints

These endpoints are specific to the [LITE] Transportation server and are not shared with the main Transport Tycoon servers.

GET sessionmanager/players.json

Returns a list of players, similar to the main servers' widget/players.json.

Response:

  • Code: 200 OK
  • Requires private key: false

Response data:

{
  "server": {
    "number": "",
    "dxp": [false],
    "motd": "",
    "beta": "",
    "name": "[LITE] Transportation",
    "region": "",
    "uptime": "50h 12m",
    "limit": 32
  },
  "players": [
    [
      "Username1",
      "91",      // Source ID? (FiveM-assigned player ID)
      "91",
      false,
      false,
      "Trucker", // Job
      false
    ],
    ...
  ]
}