Developer docs

API reference / Domains

Get a custom domain

GEThttps://app.clik.so/api/domains/{id}

In short

Returns one of your workspace's custom domains by its id, with its verification status.

You need

API key
read permission or higher. See Authentication.
Role
Any member (viewer and up) in the key's workspace.
Plan
Any plan, including Free.

Example

curl "https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b" \
  -H "Authorization: Bearer $CLIKSO_API_KEY"
const res = await fetch("https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b", {
  headers: {
    Authorization: `Bearer ${process.env.CLIKSO_API_KEY}`,
  },
});

const data = await res.json();
console.log(res.status, data);

Uses fetch (Node 18+ or the browser). Set CLIKSO_API_KEY first.

import os
import requests

response = requests.get(
    "https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b",
    headers={"Authorization": f"Bearer {os.environ['CLIKSO_API_KEY']}"},
)

print(response.status_code, response.json())

Uses requests. Set CLIKSO_API_KEY first.

<?php

$ch = curl_init('https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('CLIKSO_API_KEY'),
    ],
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

echo $status, PHP_EOL, $response, PHP_EOL;

Uses the curl extension. Set CLIKSO_API_KEY first.

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest("GET", "https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("CLIKSO_API_KEY"))

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode, string(data))
}

Uses net/http. Set CLIKSO_API_KEY first.

require "net/http"

uri = URI('https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b')
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("CLIKSO_API_KEY")}"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts response.code, response.body

Uses Net::HTTP. Set CLIKSO_API_KEY first.

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b"))
            .header("Authorization", "Bearer " + System.getenv("CLIKSO_API_KEY"))
            .GET()
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

Uses java.net.http (Java 15+). Set CLIKSO_API_KEY first.

using System.Net.Http.Headers;

using var client = new HttpClient();
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("CLIKSO_API_KEY"));

using var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());

Uses HttpClient (C# 11+). Set CLIKSO_API_KEY first.

#include <cstdlib>
#include <iostream>
#include <string>
#include <curl/curl.h>

static size_t collect(char* data, size_t size, size_t n, void* out) {
    static_cast<std::string*>(out)->append(data, size * n);
    return size * n;
}

int main() {
    CURL* curl = curl_easy_init();
    if (!curl) return 1;

    const char* key = std::getenv("CLIKSO_API_KEY");
    std::string auth = std::string("Authorization: Bearer ") + (key ? key : "");
    struct curl_slist* headers = curl_slist_append(nullptr, auth.c_str());
    std::string response;

    curl_easy_setopt(curl, CURLOPT_URL, "https://app.clik.so/api/domains/9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, collect);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    CURLcode rc = curl_easy_perform(curl);
    long status = 0;
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);

    if (rc != CURLE_OK) {
        std::cerr << curl_easy_strerror(rc) << std::endl;
        return 1;
    }
    std::cout << status << "\n" << response << std::endl;
    return 0;
}

Uses libcurl. Set CLIKSO_API_KEY first.

Response 200
{
  "status": 200,
  "success": true,
  "message": "Success",
  "data": {
    "id": "9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b",
    "workspace_id": "8a1f2c3d-4b5e-4f60-9a7b-1c2d3e4f5a6b",
    "domain_name": "links.example.com",
    "cloudflare_hostname_id": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
    "verification_details": null,
    "is_verified": true,
    "ssl_status": "active",
    "is_default": false,
    "created_at": "2026-10-02T10:00:00.000Z",
    "updated_at": "2026-10-02T10:20:00.000Z"
  }
}

Other responses: 401 · 404 · 429

Path parameters

  • idstring · uuidrequired

    The custom domain's id.

What you get back

200 with the usual envelope — status, success, message, data. data has these fields:

  • idstring · uuidrequired

    The domain's id. Send it as custom_domain_id to use the domain for a link.

  • workspace_idstring · uuidrequired

    The workspace it belongs to.

  • domain_namestringrequired

    The hostname, like links.example.com.

  • cloudflare_hostname_idstring or null

    Internal id at Clikso's network provider.

  • verification_detailsobject or null

    DNS setup details while the domain is being verified.

  • is_verifiedbooleanrequired

    true when the domain is set up and can be used for links.

  • ssl_statusstringrequired

    State of the domain's HTTPS certificate.

    One of: pending, active, failed

  • is_defaultbooleanrequired

    true for the workspace's default custom domain.

  • created_atstring · date-timerequired

    When the domain was added.

  • updated_atstring · date-timerequired

    When it last changed.

Common errors

401UNAUTHORIZEDThe API key is missing, malformed or unknown.
404NOT_FOUNDNo domain with this id exists in the key's workspace.
429RATE_LIMITEDThe key went over its per-minute request limit.

Every code and what to do about it: Errors.

Good to know

  • API keys can only read domains. Verification and removal happen in the dashboard.