Connect a server you host elsewhere
Order a join address for a game server you run elsewhere, tell Coritan where it listens and which region carries its players, and test it.
Connect a Minecraft server that you run somewhere else, such as at home or with another host, to give it a join address under coritan.gg. You order an external server as a plan. You tell Coritan where your server listens and which region carries its players, and Coritan creates the join address once you pay. This page covers the order, the connection settings, testing the connection and what your server must allow (How external servers work).
For a server hosted here, create a join address instead.
Before you begin
Section titled Before you begin- Your server runs Minecraft Java, or Minecraft Bedrock that accepts NetherNet connections, which Bedrock uses from version 26.50 (How external servers work).
- Your server has a public IP address, or a hostname that resolves only to public addresses, and the internet can reach it on its port. On a home connection, forward the port on your router to the machine that runs the server.
- For the first invoice, credit on your account pays first. Otherwise you pay by card or PayPal on the page the order lands on (How the first payment works).
Order an external server
Section titled Order an external serverOpen the order page in one of these ways:
- On the Edge Proxy page, select New proxy…, choose Minecraft Java or Minecraft Bedrock, then choose A server elsewhere. That card shows the plan's starting price. The order page opens set to the edition you chose.
- On Order a service, select the External Server card under Edge Proxy. The order page opens set to Java.
The page has three numbered sections, and the summary under Your order sits beside them. On a phone the summary follows the sections, and Review order at the bottom of the screen takes you to it.
Under Plan, the External Server plan is already chosen. Choose the billing cycle with the buttons beside the heading, such as Monthly. A longer term names what it saves, such as
Annually · save 25%.Under Join address, type the name that players will type in Join subdomain, such as
survival-smp. The field checks the name as you type, and showssurvival-smp.coritan.gg is available.when it is free (Name rules).To pick a generated name instead, select Suggest a name, then select one of the names it offers. Picking one also fills in Server name when it is empty.
Optionally, enter a Server name of up to 100 characters. Without one, the external server takes its subdomain as its name.
Under Your server, check that the Edition, Java or Bedrock, matches your server. When you change it, the Port moves to the new edition's default port, unless you had typed a port of your own.
In Server address, enter your server's public IP address or hostname, such as
203.0.113.10orplay.example.com. In Port, enter the port it listens on. When you paste an address with its port, such asplay.example.com:25565, the page splits it.Leave the options as they are unless your server needs them (Connection settings).
Under Proxy region, choose the region closest to most of your players. Each card shows the region's name and code, such as
Frankfurtandfra · Germany. The page chooses a region for you when one has an edge available.Check the summary. It lists the plan with its billing cycle, the Join address and the address it Forwards to, such as
203.0.113.10:25565, with Change beside each to go back to its section. The Total shows the price and what is due today, and the line under it says how the first invoice is paid.Select Connect server under the summary. While something is missing, the button is greyed out and the line under it names what, such as
Enter a subdomain.
If we refuse the order, Could not place the order appears above the button with the reason, and your choices stay as they were.
Once you place it, the order's own page opens. When its title is Order placed, payment due, pay under Pay invoice with account credit, a saved card or PayPal account, or a new card (Pay and follow the order). To pay later, leave the page and pay the invoice under Invoices. Coritan sets the external server up once the invoice is paid.
Connection settings
Section titled Connection settings- Edition
- Java for Minecraft Java Edition, or Bedrock for Minecraft Bedrock. The edition decides who can join and on which port (Editions and ports).
- Server address
- Your server's public IP address, or a full hostname of up to 253 characters. Coritan refuses private and reserved addresses, its own edges and other customers' join addresses (Addresses Coritan cannot forward to).
- Port
- The port your server listens on, from
1to65535. It starts at25565for Java and19132for Bedrock. Players still join on the edge's own port, whatever you enter here. - PROXY protocol
- Off by default, and for Java only. When it is on, the edge starts each connection with a PROXY protocol version 2 header that carries the player's address. Turn it on only when your server expects the header, or every player is refused (Set up your server).
- RealIP in the handshake
- Shown for Java while PROXY protocol is off. The edge adds the player's address to the server address in the handshake, where a plugin can read it (What your server receives). Turn it off when your own proxy in front of the server stops matching its forced hosts. Clearing it on the order page has no effect: a new external server starts with it on, so clear it on the Connection tab once the server is set up.
- Geyser on the same port
- Java only. It marks a Java server that also answers Bedrock players through Geyser on the same address and port, and the edition badge then reads
Java + Geyser. The edge does not carry Bedrock players to an external server through Geyser, so Bedrock players cannot join it, even with this on. - Proxy region
- The region whose edges carry your players (Regions and edge addresses). The list offers only the regions that have an edge available.
Change the connection
Section titled Change the connection- Open the external server from the Game tab of Edge Proxy, and select the Connection tab. Change on the Route card of the Overview tab opens it too.
- Change the Server name, the connection settings or the Proxy region. The region list shows each region's name and code, such as
Frankfurt (fra). When your current region has no edge available, its entry ends in(no edges available right now). - Select Save changes. The dashboard shows
Settings saved.
When you change the server address or port, Coritan checks your server at once, and the badge in the header shows the result. After you change only the edition, the badge shows Not checked until the next check. A custom domain linked to the join address follows every change. The Activity table on the Billing tab lists each change as Config changed, with External server settings changed as its details.
While the plan is suspended, the tab shows This server is suspended, and you cannot change the connection until the plan is active again (Failed payments and suspended services).
Test the connection
Section titled Test the connection- Open the external server's Overview tab.
- On the Your server card, select Test connection.
When your server answers, the dashboard shows a message such as Backend answered in 18 ms., and the card shows the Latency, Players, Version and MOTD. When it does not answer, the dashboard shows the reason, and the card shows The backend did not answer with the same reason (Troubleshooting).
Your account can run 20 tests a minute. Test connection is greyed out while the plan is suspended.
Set up your server
Section titled Set up your server- Allow the Edge addresses from the Your server card through your server's firewall, on its port. Players' connections arrive from these addresses. You can block every other address on that port, so that players reach the server only through the join address. Check the list again after you change the region.
- Leave
online-modeinserver.propertiesas it is. The edge does not take part in signing players in, so your server checks each player as it always has. - Keep
prevent-proxy-connectionsatfalse, its default, unless PROXY protocol is on. The setting compares the address that each player connects from with the one they signed in to Minecraft from. Without PROXY protocol, your server sees the edge's address instead, and refuses every player. - With PROXY protocol on, set your server to expect the header, or it refuses every player:
- Paper:
proxies.proxy-protocol: trueinconfig/paper-global.yml - Velocity:
haproxy-protocol = trueinvelocity.toml - Waterfall:
proxy_protocol: trueon the listener inconfig.yml
- Paper:
- With RealIP in the handshake on, install a plugin that reads the player's address from the handshake if you want your server's logs and bans to see it. A server without one ignores the extra text.
The On your server card on the Connection tab repeats these points.
Result
Section titled ResultOnce you pay the first invoice, Coritan creates the join address, such as survival-smp.coritan.gg, and checks your server. The order's page follows the setup and updates on its own. Its title becomes Your order is ready when the external server is active, and Open external server at the top of the page opens it.
The external server's status moves from pending to provisioning, then to active. It appears on the Game tab of Edge Proxy, with a note such as External · Frankfurt that names its region. When your server answers the check, the badge shows Online, and players can join at the join address.
Troubleshooting
Section titled TroubleshootingEnter a public IP address; private, loopback and reserved ranges cannot be proxied to.- The address is private, such as
192.168.1.20. Enter your server's public address. On a home connection, that is your router's public address, with the port forwarded to the server. Enter a public IP address or a full hostname, such as play.example.com.- The address has no dot, such as
minecraft. Enter the full hostname. Enter a public hostname; private and reserved names cannot be proxied to.- The name ends in a private suffix, such as
.localor.lan. Enter a public hostname or the public IP address. The server address has characters that are not valid in a hostname.- A hostname has only letters, digits, hyphens and dots. Remove spaces, underscores and any other characters.
Enter a port between 1 and 65535.- The port is out of range. Enter the port your server listens on.
Choose the region players should connect through.- No region is chosen. When Proxy region says
No regions are available for this product right now., no region has an edge available, so try again later. Otherwise, choose a region. That subdomain is taken.- We cannot give you the name, and the message under Join subdomain says why, such as
Subdomain is already in use. Choose another name, or select Suggest a name. Could not resolve play.example.com; check the address- The hostname has no address. Check its spelling, or enter your server's IP address.
play.example.com resolves to a private or reserved address, so we cannot proxy to it- At least one of the name's addresses is private. Point the name at your public address, or enter the public IP address.
- A message that starts
That address is one of our proxy edges - The address belongs to one of Coritan's edges, for example because you entered the IP address that your join address resolves to. Enter the address your server listens on. To forward to a server hosted here, enter that server's join address.
play.example.com is another customer's server on this network; enter the address of a server you run- The name is another customer's join address or custom domain. Enter your own server's address.
survival-smp.coritan.gg is already a join address in front of a server; enter that server's own address- The name is the join address of an external server. Enter the address that server listens on.
No server on this network answers to lobby.coritan.gg; check the join address, or enter the server's own address- The name is under
coritan.gg, but no join address has it. Check the spelling. That region has no proxy edges available right now- The region lost its last available edge after the form opened. Choose another region.
- The status is
failedafter you paid - Coritan could not set up the external server. The Activity table on the Billing tab lists
Provisioning failedwith the reason. It can be one of the address messages above, orSubdomain 'survival-smp' is already in use on coritan.ggwhen someone took the name before setup. Contact support with the service number. - The badge shows
OfflinewithNo Minecraft Java server answered on that address and port - Nothing answered at the address and port within 3 seconds. Check that the server is running, that Port is the port it listens on, that your router forwards the port, and that your firewall allows the Edge addresses. Then select Test connection.
The server answered, but not with a valid status:and a reason- Something answered on the port, but it did not answer as a Minecraft Java server. Check the Port, and check that the Edition is Java.
No Minecraft Bedrock server answered on that address and port- Nothing answered as a Bedrock server within 3 seconds. Check that the server is running, the Port, your router's port forward and your firewall.
Something answered, but it is not a Bedrock server- Something other than a Bedrock server answers on the port, such as a Java server. Check the Port, and check that the Edition is Bedrock.
- The badge shows
Offlinewith PROXY protocol on, but players can join - The check does not send a PROXY protocol header, so a server that requires the header does not answer it (How Coritan checks your server). Players are not affected.
- Every player is refused
- PROXY protocol is on, and your server does not expect the header. Turn off PROXY protocol on the Connection tab, or set your server to expect it (Set up your server).
- The badge shows
Online, but Bedrock players cannot join - Your server speaks only the older RakNet protocol, which the check accepts. Players on Bedrock 26.50 and newer join over NetherNet, so update the server to a version that accepts NetherNet connections.
- Bedrock players cannot join a Java server that runs Geyser
- The edge does not carry Bedrock players to an external server through Geyser, and no setting changes that.
- The badge shows
Not checkedafter a change - You changed the edition without changing the address or port, so Coritan cleared the last check. Select Test connection, or wait up to 5 minutes for the next check.
- Save changes is greyed out
- Nothing has changed, the plan is suspended, or the form has a problem. The text beside the button names the problem.
- A server elsewhere is greyed out
- The card reads
Not available on this account.Your account cannot order external servers. Contact support if you expected to. No External Server plans yet- The External Server plan is not in the catalogue for your account. Contact support if you expected it.
- Could not load the plans
- The plans did not load. Select Try again, or reload the page.
Too many requests for this action. Please wait and try again.- You ran more than 20 tests in a minute, or changed the connection more than 30 times in 5 minutes. Wait, then try again (Rate limits).
Related
Section titled Related- How external servers work
- Manage an external server's plan
- Customise the server list entry
- Use your own domain for a join address
- Troubleshoot proxies and join addresses
With the API
Section titled With the APIPlace the order
Section titled Place the orderFind the plan with GET /products/: its module_name is external_server, and each entry in its pricing list is a pricing_id you can order. Check the name first with POST /api/v1/gameproxy/availability (Create a join address). Then place the order with POST /services/order, with the connection in config:
curl -X POST https://api.coritan.com/api/v1/services/order \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"product_id": 31,
"pricing_id": 88,
"idempotency_key": "b7e2c1d4-5f3a-4e8b-9c6d-1a2b3c4d5e6f",
"config": {
"subdomain": "survival-smp",
"display_name": "Survival SMP",
"mode": "minecraft_java",
"upstream_host": "203.0.113.10",
"upstream_port": 25565,
"proxy_protocol": false,
"bedrock_bridge": false,
"location_id": 3
}
}'
| Key | Values | Default | What it sets |
|---|---|---|---|
subdomain |
3–28 characters that follow the name rules | Required | The join address's name under coritan.gg. |
display_name |
Up to 100 characters | The order's hostname, or else the subdomain |
The server's name. |
mode |
minecraft_java or minecraft_bedrock |
minecraft_java |
The edition. |
upstream_host |
A public IP address, or a full hostname of up to 253 characters | Required | Your server's address. |
upstream_port |
1–65535 |
Required | Your server's port. |
proxy_protocol |
true or false |
false |
A PROXY protocol version 2 header on each connection. Java only. |
bedrock_bridge |
true or false |
false |
Geyser on the same port. Java only. |
location_id |
A region's id from GET /client/external-servers/regions |
The first region | The proxy region. |
The order checks only the form of config, and answers 422 with {"detail": {"errors": [...]}} when something is missing or malformed, such as Subdomain is required, Server address is required or Port must be between 1 and 65535. An external server takes no add-ons, so an order with addons answers 422 with External Server does not take add-ons. Order each product on its own. When requires_payment is true, pay invoice_id as Pay an invoice shows (Order a service).
Coritan checks the name, the address and the region when it sets the server up after payment. When one of those checks fails, the service's status becomes failed, and GET /services/{service_ref}/events lists a provisioning_failed event with the reason. Once the server is set up, read it as Read external servers with the API shows.
Update the connection
Section titled Update the connectionChange the connection with PATCH /client/external-servers/{service_id}. Send only the fields you want to change:
curl -X PATCH https://api.coritan.com/api/v1/client/external-servers/1203 \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"upstream_host": "play.example.com", "upstream_port": 25566}'
| Field | Values | What it changes |
|---|---|---|
display_name |
1–100 characters | The server's name. |
mode |
minecraft_java or minecraft_bedrock |
The edition. When PROXY protocol is on, send "proxy_protocol": false with minecraft_bedrock. |
upstream_host |
A public IP address, or a full hostname of up to 253 characters | Your server's address. |
upstream_port |
1–65535 |
Your server's port. |
proxy_protocol |
true or false |
The PROXY protocol header. Java only. |
real_ip |
true or false |
The player's address in the Java handshake while PROXY protocol is off. |
bedrock_bridge |
true or false |
Geyser on the same port. Coritan keeps it off for Bedrock. |
location_id |
A region's id |
The proxy region. It must have an edge available. |
A field you leave out, or send as null, keeps its value, and a body with no fields changes nothing. The call answers with the external server, in the shape Read external servers with the API describes. When the address or port changed, the answer's probe already holds the new check.
| Status | detail |
Cause |
|---|---|---|
404 |
External server not found |
The external server is not on your account. |
409 |
This external server is suspended |
The plan is suspended. |
422 |
{"errors": ["That region has no proxy edges available right now"]} |
Coritan refused the change. errors holds one message, such as a message from Troubleshooting, Name is required, or This external server has no join address yet before setup has finished. |
422 |
A list of fields in detail |
A value is out of range, such as a port above 65535 or a name longer than 100 characters. |
429 |
"error": "rate_limited" |
More than 30 changes to the server in 5 minutes. |
The API also refuses PROXY protocol on a Bedrock server, with PROXY protocol is not available for Bedrock servers; the proxy speaks RakNet to them and cannot prepend a header.
Run a test
Section titled Run a testCheck your server now with POST /client/external-servers/{service_id}/test:
curl -X POST https://api.coritan.com/api/v1/client/external-servers/1203/test \
-H "Authorization: Bearer $CORITAN_TOKEN"
{
"probe": {
"ok": true,
"latency_ms": 18,
"players_online": 12,
"players_max": 100,
"version_name": "Paper 1.21.8",
"motd": "Survival SMP",
"error": null,
"checked_at": "2026-09-26T10:15:03+00:00",
"transport": null
},
"state": "online"
}
state is online when your server answered, and offline when it did not, with the reason in error. For Bedrock, transport says which protocol answered: nethernet, or raknet for a server that speaks only RakNet, which players on Bedrock 26.50 and newer cannot join. It is null for Java. Coritan keeps the result as the last check, without transport.
A server that has no join address yet answers 404 with This external server has no join address. More than 20 tests a minute from your account answer 429.
API operations on this page
| Method | Path | What it does |
|---|---|---|
POST | /api/v1/services/order | Order a platform service, and any add-ons bought with it |
PATCH | /api/v1/client/external-servers/{service_id} | Change where players are forwarded, how, and through which region |
POST | /api/v1/client/external-servers/{service_id}/test | Status-ping the backend now and record the answer |