curl --request POST \
--url https://api.qa.tech/v1/remote-tunnels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ports": [
{
"localPort": 32768,
"subdomain": "<string>"
}
],
"public": true,
"projectShortId": "<string>"
}
'import requests
url = "https://api.qa.tech/v1/remote-tunnels"
payload = {
"ports": [
{
"localPort": 32768,
"subdomain": "<string>"
}
],
"public": True,
"projectShortId": "<string>"
}
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: 32768, subdomain: '<string>'}],
public: true,
projectShortId: '<string>'
})
};
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' => 32768,
'subdomain' => '<string>'
]
],
'public' => true,
'projectShortId' => '<string>'
]),
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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"runnerId": "<string>",
"hostnames": [
{
"localPort": 123,
"url": "<string>"
}
],
"tunnelToken": "<string>",
"expiresAt": "<string>"
}Create remote tunnel
Create a new remote tunnel that exposes local ports via Cloudflare.
curl --request POST \
--url https://api.qa.tech/v1/remote-tunnels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ports": [
{
"localPort": 32768,
"subdomain": "<string>"
}
],
"public": true,
"projectShortId": "<string>"
}
'import requests
url = "https://api.qa.tech/v1/remote-tunnels"
payload = {
"ports": [
{
"localPort": 32768,
"subdomain": "<string>"
}
],
"public": True,
"projectShortId": "<string>"
}
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: 32768, subdomain: '<string>'}],
public: true,
projectShortId: '<string>'
})
};
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' => 32768,
'subdomain' => '<string>'
]
],
'public' => true,
'projectShortId' => '<string>'
]),
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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\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\": 32768,\n \"subdomain\": \"<string>\"\n }\n ],\n \"public\": true,\n \"projectShortId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"runnerId": "<string>",
"hostnames": [
{
"localPort": 123,
"url": "<string>"
}
],
"tunnelToken": "<string>",
"expiresAt": "<string>"
}Body
Request body to create a new remote tunnel
One or more local ports to expose via the tunnel
Show child attributes
Show child attributes
If true, the tunnel is publicly accessible without Cloudflare Access authentication
Target a specific project by its prefixed short ID (proj-slug_shortId or proj_shortId), as returned by the projects API. Required for organization-scoped API keys; project-scoped keys may only pass their own project's short ID.
^proj(-.+_.+|_.+)$Response
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?