Jump to content

SimTX API/Public endpoints: Difference between revisions

From SimTX Wiki
Clanker (talk | contribs)
Clanker moved page SimTX API/Public endpoints to SimTX API v24/Public endpoints: Archive the v24 protocol reference
Tag: New redirect
 
Clanker (talk | contribs)
Protocol v25 reference
Tag: Removed redirect
Line 1: Line 1:
#REDIRECT [[SimTX API v24/Public endpoints]]
{{SimTX API navigation}}
The [[SimTX API/Account service|account service]] exposes a handful of '''public endpoints''' that need no credential. They serve service status, the public satellite list, public profiles, client releases and a simple network test. All are on <code><nowiki>https://auth.simtx.net</nowiki></code>; rate limits are listed on the [[SimTX API/Account service#Rate limits|account service]] page.
 
== Service status ==
<code>GET /api/v1/status</code>
 
<syntaxhighlight lang="json">
{ "status": "operational" }
</syntaxhighlight>
 
The response indicates only that the account service process is up and answering. It says nothing about game servers; use the [[SimTX API/Server directory|server directory]] for that. Not rate limited.
 
== Public satellites ==
<code>GET /api/v1/satellites</code>
 
Lists every PUBLIC satellite of every account that is <code>ACTIVE</code> or <code>DEORBITING</code> (not yet reentered). No authentication. Rate limit: 120 per minute.
 
<syntaxhighlight lang="json">
{
  "satellites": [
    {
      "stationId": "99999999-8888-4777-8666-555555555555",
      "revision": 3,
      "catalogSeq": 412,
      "state": "ACTIVE",
      "name": "SimSat-1",
      "callsign": "SSAT1",
      "ownerHandle": "n0call",
      "visibility": "PUBLIC",
      "orbit": {
        "model": "simtx-j2-v1", "epoch": "2026-10-20T12:00:00Z",
        "semiMajorAxisKm": 6921.0, "eccentricity": 0.001, "inclinationDeg": 97.6,
        "raanDeg": 120.0, "argumentOfPerigeeDeg": 90.0, "meanAnomalyDeg": 10.0
      },
      "attitude": { "mode": "NADIR", "yawDeg": 0.0 },
      "launchedAt": "2026-10-20T12:00:00Z"
    }
  ]
}
</syntaxhighlight>
 
{| class="wikitable"
! Field !! Type !! Description
|-
| <code>stationId</code> || string (UUID) || The satellite's station id, as used in station lists, tickets and ephemeris requests.
|-
| <code>revision</code> || integer || Station revision.
|-
| <code>catalogSeq</code> || integer || Global sequence number, increased on every change to any satellite.
|-
| <code>state</code> || string || <code>ACTIVE</code> or <code>DEORBITING</code>.
|-
| <code>name</code>, <code>callsign</code>, <code>ownerHandle</code> || string || As on the station.
|-
| <code>visibility</code> || string || Always <code>PUBLIC</code> here.
|-
| <code>orbit</code>, <code>attitude</code> || object || As on [[SimTX API/Station endpoints#Orbit and attitude|Station endpoints]]. After a deorbit burn, the post-burn elements.
|-
| <code>launchedAt</code> || string || Launch time; also the epoch of the original elements.
|-
| <code>deorbit</code> || object || Set once the deorbit burn has fired: <code>burnAt</code>, <code>reentryAt</code>, <code>reentryLocation</code>, <code>deltaVMps</code>, <code>orbit</code>. Stop drawing the satellite at <code>reentryAt</code>.
|}
 
The list is served from a snapshot at most 5 seconds old, replaced as soon as any satellite changes. Responses carry an <code>ETag</code> and <code>Cache-Control: no-cache</code>; send <code>If-None-Match</code> to get <code>304 Not Modified</code> when nothing changed. Propagate the elements with the [[SimTX API/Satellites#Orbit model|orbit model]] to draw the satellites.
 
== Public profiles ==
Every active account has a public profile consisting of its handle, display name, join date, public badges and visible awards. Nothing else about an account is public.
 
=== Profile search ===
<code>GET /api/v1/profiles?q=</code>''text''
 
{| class="wikitable"
! Parameter !! Description
|-
| <code>q</code> || Case-insensitive substring matched against handles and display names. Optional; an empty query lists accounts alphabetically.
|}
 
Returns at most 24 profiles. An exact handle match is listed first, then the rest ordered by handle.
 
<syntaxhighlight lang="json">
{
  "profiles": [
    {
      "handle": "n0call",
      "displayName": "Example Operator",
      "joinedAt": "2026-08-20T09:12:44.100000Z",
      "badges": [
        { "roleKey": "SUPPORTER", "label": "Supporter", "color": "#e0b04c" }
      ]
    }
  ]
}
</syntaxhighlight>
 
{| class="wikitable"
! Field !! Type !! Description
|-
| <code>handle</code> || string || Unique handle. Users may change it, at most once every 30 days.
|-
| <code>displayName</code> || string || Free-form display name.
|-
| <code>joinedAt</code> || string || Account creation time.
|-
| <code>badges</code> || array || Public role badges, sorted by label.
|-
| <code>badges[].roleKey</code> || string || Stable role identifier, for example <code>SUPPORTER</code> or <code>MODERATOR</code>.
|-
| <code>badges[].label</code> || string || Text to display.
|-
| <code>badges[].color</code> || string || CSS colour for the badge, usually <code>#rrggbb</code>.
|}
 
=== Single profile ===
<code>GET /api/v1/profiles/{handle}</code>
 
Returns the same fields as a search result plus <code>awards</code>. Unknown handles return <code>404 profile_not_found</code>.
 
{| class="wikitable"
! Field !! Type !! Description
|-
| <code>awards[].awardId</code> || string (UUID) || Award definition.
|-
| <code>awards[].accountAwardId</code> || string (UUID) || This particular grant.
|-
| <code>awards[].slug</code> || string || Stable short identifier of the award.
|-
| <code>awards[].name</code> || string || Display name.
|-
| <code>awards[].description</code> || string || Description.
|-
| <code>awards[].iconUrl</code> || string || Icon image URL. May be empty.
|-
| <code>awards[].grantedAt</code> || string || When the award was granted.
|-
| <code>awards[].visible</code> || boolean || Whether the user shows it on their profile. Only visible awards are returned here.
|-
| <code>awards[].displayOrder</code> || integer || Order chosen by the user; lower first.
|-
| <code>awards[].revokedAt</code> || string or null || Always null for awards returned here.
|}
 
== Releases ==
<code>GET /api/v1/releases</code>
 
Lists published releases of the official SimTX Transmitter, newest first.
 
<syntaxhighlight lang="json">
{
  "releases": [
    {
      "releaseId": "7edca7c6-97ca-4291-9691-3f0a5cd41a20",
      "version": "0.3.7",
      "title": "SimTX 0.3.7",
      "notes": ["WFM now accepts baseband directly.", "Added rate selection up to 384 kHz."],
      "downloadUrl": "/downloads/simtx-transmitter-0.3.7.jar",
      "artifactFilename": "simtx-transmitter-0.3.7.jar",
      "artifactSize": 8087129,
      "artifactSha256": "8632bc25e1271146c8638c2780e4a6bdb40379d0dd7cae8f0631f8e16b5da69b",
      "published": true,
      "createdAt": "2026-09-14T19:37:41.639246Z",
      "updatedAt": "2026-09-14T19:38:53.435832Z",
      "publishedAt": "2026-09-14T19:37:41.639246Z"
    }
  ]
}
</syntaxhighlight>
 
{| class="wikitable"
! Field !! Type !! Description
|-
| <code>version</code> || string || Version number.
|-
| <code>title</code> || string || Release title.
|-
| <code>notes</code> || array of string || Change notes, one entry per item.
|-
| <code>downloadUrl</code> || string or null || Download location. A value starting with <code>/</code> is relative to <code><nowiki>https://auth.simtx.net</nowiki></code>; otherwise it is an absolute URL.
|-
| <code>artifactFilename</code>, <code>artifactSize</code>, <code>artifactSha256</code> || string, integer, string || File name, size in bytes and lowercase hex SHA-256 of the download. Verify the hash after downloading.
|-
| <code>published</code> || boolean || Always true here.
|-
| <code>createdAt</code>, <code>updatedAt</code>, <code>publishedAt</code> || string || Timestamps.
|}
 
=== Release downloads ===
<code>GET /downloads/{filename}</code> returns the stored file with <code>Content-Disposition: attachment</code>, an <code>ETag</code> equal to the quoted SHA-256, and <code>Cache-Control: public, max-age=300</code>. Unknown files return <code>404 release_artifact_not_found</code>.
 
=== Update manifest ===
<code>GET /downloads/transmitter-update.properties</code> returns the newest downloadable release as a Java properties file (<code>text/plain; charset=utf-8</code>, cached for 60 seconds). The official transmitter uses it for update checks.
 
<syntaxhighlight lang="properties">
version=0.3.7
url=/downloads/simtx-transmitter-0.3.7.jar
sha256=8632bc25e1271146c8638c2780e4a6bdb40379d0dd7cae8f0631f8e16b5da69b
notes=WFM now accepts baseband directly.
</syntaxhighlight>
 
When a release has several notes, they are joined on a single line, separated by a space, the character U+00B7 and a space. Returns <code>404 release_manifest_unavailable</code> when no release has a download.
 
== Network test ==
Two endpoints let a client estimate latency and upload bandwidth to SimTX infrastructure. The SimTX website's network test uses them.
 
=== Latency probe ===
<code>GET /api/v1/network-test/ping</code>
 
<syntaxhighlight lang="json">
{ "serverTimeMillis": 1793016000000 }
</syntaxhighlight>
 
<code>serverTimeMillis</code> is the server's clock in Unix milliseconds. Measure the round-trip time on the client side. Rate limit: 60 per minute.
 
=== Upload probe ===
<code>POST /api/v1/network-test/upload</code> with <code>Content-Type: application/octet-stream</code> and a body of 1 byte to 1 MiB (1,048,576 bytes). The <code>Content-Length</code> header is required.
 
<syntaxhighlight lang="json">
{ "receivedBytes": 1048576, "serverReadMillis": 412.7 }
</syntaxhighlight>
 
{| class="wikitable"
! Field !! Description
|-
| <code>receivedBytes</code> || Number of body bytes read.
|-
| <code>serverReadMillis</code> || Time the server spent reading the body, in milliseconds.
|}
 
Errors: <code>415 network_test_content_type</code> for any other content type, <code>413 network_test_chunk_size</code> for an empty, missing-length or oversized body. Rate limit: 144 per minute.
 
{{SimTX API navbox}}
[[Category:SimTX API]]
[[Category:SimTX API account service]]

Revision as of 16:42, 24 October 2026

The account service exposes a handful of public endpoints that need no credential. They serve service status, the public satellite list, public profiles, client releases and a simple network test. All are on https://auth.simtx.net; rate limits are listed on the account service page.

Service status

GET /api/v1/status

{ "status": "operational" }

The response indicates only that the account service process is up and answering. It says nothing about game servers; use the server directory for that. Not rate limited.

Public satellites

GET /api/v1/satellites

Lists every PUBLIC satellite of every account that is ACTIVE or DEORBITING (not yet reentered). No authentication. Rate limit: 120 per minute.

{
  "satellites": [
    {
      "stationId": "99999999-8888-4777-8666-555555555555",
      "revision": 3,
      "catalogSeq": 412,
      "state": "ACTIVE",
      "name": "SimSat-1",
      "callsign": "SSAT1",
      "ownerHandle": "n0call",
      "visibility": "PUBLIC",
      "orbit": {
        "model": "simtx-j2-v1", "epoch": "2026-10-20T12:00:00Z",
        "semiMajorAxisKm": 6921.0, "eccentricity": 0.001, "inclinationDeg": 97.6,
        "raanDeg": 120.0, "argumentOfPerigeeDeg": 90.0, "meanAnomalyDeg": 10.0
      },
      "attitude": { "mode": "NADIR", "yawDeg": 0.0 },
      "launchedAt": "2026-10-20T12:00:00Z"
    }
  ]
}
Field Type Description
stationId string (UUID) The satellite's station id, as used in station lists, tickets and ephemeris requests.
revision integer Station revision.
catalogSeq integer Global sequence number, increased on every change to any satellite.
state string ACTIVE or DEORBITING.
name, callsign, ownerHandle string As on the station.
visibility string Always PUBLIC here.
orbit, attitude object As on Station endpoints. After a deorbit burn, the post-burn elements.
launchedAt string Launch time; also the epoch of the original elements.
deorbit object Set once the deorbit burn has fired: burnAt, reentryAt, reentryLocation, deltaVMps, orbit. Stop drawing the satellite at reentryAt.

The list is served from a snapshot at most 5 seconds old, replaced as soon as any satellite changes. Responses carry an ETag and Cache-Control: no-cache; send If-None-Match to get 304 Not Modified when nothing changed. Propagate the elements with the orbit model to draw the satellites.

Public profiles

Every active account has a public profile consisting of its handle, display name, join date, public badges and visible awards. Nothing else about an account is public.

Profile search

GET /api/v1/profiles?q=text

Parameter Description
q Case-insensitive substring matched against handles and display names. Optional; an empty query lists accounts alphabetically.

Returns at most 24 profiles. An exact handle match is listed first, then the rest ordered by handle.

{
  "profiles": [
    {
      "handle": "n0call",
      "displayName": "Example Operator",
      "joinedAt": "2026-08-20T09:12:44.100000Z",
      "badges": [
        { "roleKey": "SUPPORTER", "label": "Supporter", "color": "#e0b04c" }
      ]
    }
  ]
}
Field Type Description
handle string Unique handle. Users may change it, at most once every 30 days.
displayName string Free-form display name.
joinedAt string Account creation time.
badges array Public role badges, sorted by label.
badges[].roleKey string Stable role identifier, for example SUPPORTER or MODERATOR.
badges[].label string Text to display.
badges[].color string CSS colour for the badge, usually #rrggbb.

Single profile

GET /api/v1/profiles/{handle}

Returns the same fields as a search result plus awards. Unknown handles return 404 profile_not_found.

Field Type Description
awards[].awardId string (UUID) Award definition.
awards[].accountAwardId string (UUID) This particular grant.
awards[].slug string Stable short identifier of the award.
awards[].name string Display name.
awards[].description string Description.
awards[].iconUrl string Icon image URL. May be empty.
awards[].grantedAt string When the award was granted.
awards[].visible boolean Whether the user shows it on their profile. Only visible awards are returned here.
awards[].displayOrder integer Order chosen by the user; lower first.
awards[].revokedAt string or null Always null for awards returned here.

Releases

GET /api/v1/releases

Lists published releases of the official SimTX Transmitter, newest first.

{
  "releases": [
    {
      "releaseId": "7edca7c6-97ca-4291-9691-3f0a5cd41a20",
      "version": "0.3.7",
      "title": "SimTX 0.3.7",
      "notes": ["WFM now accepts baseband directly.", "Added rate selection up to 384 kHz."],
      "downloadUrl": "/downloads/simtx-transmitter-0.3.7.jar",
      "artifactFilename": "simtx-transmitter-0.3.7.jar",
      "artifactSize": 8087129,
      "artifactSha256": "8632bc25e1271146c8638c2780e4a6bdb40379d0dd7cae8f0631f8e16b5da69b",
      "published": true,
      "createdAt": "2026-09-14T19:37:41.639246Z",
      "updatedAt": "2026-09-14T19:38:53.435832Z",
      "publishedAt": "2026-09-14T19:37:41.639246Z"
    }
  ]
}
Field Type Description
version string Version number.
title string Release title.
notes array of string Change notes, one entry per item.
downloadUrl string or null Download location. A value starting with / is relative to https://auth.simtx.net; otherwise it is an absolute URL.
artifactFilename, artifactSize, artifactSha256 string, integer, string File name, size in bytes and lowercase hex SHA-256 of the download. Verify the hash after downloading.
published boolean Always true here.
createdAt, updatedAt, publishedAt string Timestamps.

Release downloads

GET /downloads/{filename} returns the stored file with Content-Disposition: attachment, an ETag equal to the quoted SHA-256, and Cache-Control: public, max-age=300. Unknown files return 404 release_artifact_not_found.

Update manifest

GET /downloads/transmitter-update.properties returns the newest downloadable release as a Java properties file (text/plain; charset=utf-8, cached for 60 seconds). The official transmitter uses it for update checks.

version=0.3.7
url=/downloads/simtx-transmitter-0.3.7.jar
sha256=8632bc25e1271146c8638c2780e4a6bdb40379d0dd7cae8f0631f8e16b5da69b
notes=WFM now accepts baseband directly.

When a release has several notes, they are joined on a single line, separated by a space, the character U+00B7 and a space. Returns 404 release_manifest_unavailable when no release has a download.

Network test

Two endpoints let a client estimate latency and upload bandwidth to SimTX infrastructure. The SimTX website's network test uses them.

Latency probe

GET /api/v1/network-test/ping

{ "serverTimeMillis": 1793016000000 }

serverTimeMillis is the server's clock in Unix milliseconds. Measure the round-trip time on the client side. Rate limit: 60 per minute.

Upload probe

POST /api/v1/network-test/upload with Content-Type: application/octet-stream and a body of 1 byte to 1 MiB (1,048,576 bytes). The Content-Length header is required.

{ "receivedBytes": 1048576, "serverReadMillis": 412.7 }
Field Description
receivedBytes Number of body bytes read.
serverReadMillis Time the server spent reading the body, in milliseconds.

Errors: 415 network_test_content_type for any other content type, 413 network_test_chunk_size for an empty, missing-length or oversized body. Rate limit: 144 per minute.

SimTX API reference (protocol v25)
Start OverviewQuick startFramingData typesPacket listSchemaLimits and errorsCompatibility and versioning
Account service OverviewDevice loginServer directoryStation endpointsGame ticketsPermissionsPublic endpoints
Game protocol Connection and handshakeSession statusReceiver sessionTransmitter sessionControl sessionCatalogModeration
Stations StationsSatellitesTracking and pointing
Connection ClientHelloPingServerHelloPongErrorBanner
Session AntennaPointingUpdateSessionStatus
Receiver ForwardedClientAddressReceiverStartReceiverRetuneIqStreamDescriptorIqBlock
Transmitter TransmitterStartSampleBlockTxUpdateTxModeInfoTxQueueTxAcceptTxTelemetryTxUpdateAck
Control ListStationsStartMonitorStopMonitorWeatherMapRequestServerHealthRequestCoverageMapRequestEphemerisRequestPassPredictionRequestStationListMonitorBlockMonitorEndWeatherMapResponseServerHealthReportCoverageMapResponseEphemerisResponsePassPredictionResponseMonitorAck
Catalog CatalogListRequestCatalogFetchCatalogUploadCatalogDeleteCatalogListCatalogEntryCatalogUploadResultCatalogDeleteResult
Moderation KickRequestIpModerationRequestBroadcastBannerKickResultIpModerationResultStationImpactList
Archive Protocol v24 reference