Create remote tunnel
curl --request POST \
--url https://api.qa.tech/v1/remote-tunnels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ports": [
{
"localPort": 123,
"subdomain": "<string>"
}
],
"public": true
}
'import requests
url = "https://api.qa.tech/v1/remote-tunnels"
payload = {
"ports": [
{
"localPort": 123,
"subdomain": "<string>"
}
],
"public": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ports: [{localPort: 123, subdomain: '<string>'}], public: true})
};
fetch('https://api.qa.tech/v1/remote-tunnels', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qa.tech/v1/remote-tunnels",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ports' => [
[
'localPort' => 123,
'subdomain' => '<string>'
]
],
'public' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qa.tech/v1/remote-tunnels"
payload := strings.NewReader("{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qa.tech/v1/remote-tunnels")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/remote-tunnels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}"
response = http.request(request)
puts response.read_body{
"runnerId": "<string>",
"hostnames": [
{
"localPort": 123,
"url": "<string>"
}
],
"tunnelToken": "<string>",
"expiresAt": "<string>"
}Remote Tunnels
Create remote tunnel
Create a new remote tunnel that exposes local ports via Cloudflare. Returns a tunnelToken to start the cloudflared daemon.
POST
/
v1
/
remote-tunnels
Create remote tunnel
curl --request POST \
--url https://api.qa.tech/v1/remote-tunnels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ports": [
{
"localPort": 123,
"subdomain": "<string>"
}
],
"public": true
}
'import requests
url = "https://api.qa.tech/v1/remote-tunnels"
payload = {
"ports": [
{
"localPort": 123,
"subdomain": "<string>"
}
],
"public": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({ports: [{localPort: 123, subdomain: '<string>'}], public: true})
};
fetch('https://api.qa.tech/v1/remote-tunnels', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qa.tech/v1/remote-tunnels",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'ports' => [
[
'localPort' => 123,
'subdomain' => '<string>'
]
],
'public' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qa.tech/v1/remote-tunnels"
payload := strings.NewReader("{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qa.tech/v1/remote-tunnels")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/remote-tunnels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ports\": [\n {\n \"localPort\": 123,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true\n}"
response = http.request(request)
puts response.read_body{
"runnerId": "<string>",
"hostnames": [
{
"localPort": 123,
"url": "<string>"
}
],
"tunnelToken": "<string>",
"expiresAt": "<string>"
}Body
application/json
Response
200 - application/json
The request has succeeded.
Response after successfully creating a remote tunnel
Our identifier for this runner, used in subsequent API calls
Public hostnames mapped to local ports
Show child attributes
Show child attributes
cloudflared token to start the tunnel daemon
ISO timestamp when this tunnel will expire
Was this page helpful?