Read domain lifecycle and observed DNS/TLS differences
curl --request GET \
--url https://api.kombify.io/v1/techstack/api/v1/monitor/domains \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kombify.io/v1/techstack/api/v1/monitor/domains"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kombify.io/v1/techstack/api/v1/monitor/domains', 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.kombify.io/v1/techstack/api/v1/monitor/domains",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kombify.io/v1/techstack/api/v1/monitor/domains"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kombify.io/v1/techstack/api/v1/monitor/domains")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kombify.io/v1/techstack/api/v1/monitor/domains")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"generated_at": "2023-11-07T05:31:56Z",
"domains": [
{
"id": "<string>",
"stack_id": "<string>",
"server_id": "<string>",
"domain": "<string>",
"registered_domain": "<string>",
"services": [
{
"id": "<string>",
"name": "<string>"
}
],
"registration": {
"state": "known",
"freshness": "fresh",
"source": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"remaining_seconds": 123,
"reason_code": "<string>"
},
"tls": {
"state": "known",
"freshness": "fresh",
"source": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"remaining_seconds": 123,
"reason_code": "<string>",
"subject": "<string>",
"issuer": "<string>",
"fingerprint_sha256": "<string>",
"valid": true
},
"dns": {
"state": "matching",
"freshness": "fresh",
"differences": [
{
"field": "<string>",
"expected": [
"<string>"
],
"observed": [
"<string>"
],
"state": "matching",
"reason_code": "<string>"
}
],
"source": "<string>",
"expected_source": "stack_routing_desired",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"detected_at": "2023-11-07T05:31:56Z",
"reason_code": "<string>"
},
"tls_drift": {
"state": "matching",
"freshness": "fresh",
"differences": [
{
"field": "<string>",
"expected": [
"<string>"
],
"observed": [
"<string>"
],
"state": "matching",
"reason_code": "<string>"
}
],
"source": "<string>",
"expected_source": "stack_routing_desired",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"detected_at": "2023-11-07T05:31:56Z",
"reason_code": "<string>"
},
"conditions": [
{
"id": "<string>",
"kind": "<string>",
"state": "active",
"severity": "warning",
"first_detected_at": "2023-11-07T05:31:56Z",
"last_observed_at": "2023-11-07T05:31:56Z",
"freshness": "fresh",
"episode": 2,
"resolved_at": "2023-11-07T05:31:56Z",
"evidence_ref": "<string>"
}
],
"routing_revision": 123,
"tls_port": 32768,
"tls_disabled": true,
"check_started_at": "2023-11-07T05:31:56Z"
}
]
},
"meta": {
"total": 123,
"page": 123,
"per_page": 123,
"managed_runtime_inventory_complete": true,
"worker_inventory_sha256": "<string>",
"managed_runtime_active_lease_ids": [
"<string>"
],
"managed_runtime_inactive_lease_ids": [
"<string>"
],
"managed_runtime_lease_generation_digests": [
{
"lease_id": "<string>",
"resource_generation_digest": "<string>"
}
],
"managed_runtime_duplicate_lease_ids": [
"<string>"
],
"managed_runtime_attachment_conflict_lease_ids": [
"<string>"
]
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}Metrics
Read domain lifecycle and observed DNS/TLS differences
Owner and tenant scoped, read-only projection of canonical routing, server domains and service endpoints. Registration expiry from RDAP and certificate expiry from the presented public TLS leaf are separate facts with independent sources and observation deadlines. Missing data stays unknown. Expected DNS is never inferred from observed addresses. Proxied origins are explicitly unobservable from recursive public DNS. Conditions persist across failures and stale observations, and resolve only after fresh positive evidence. An unavailable store returns 503.
GET
/
api
/
v1
/
monitor
/
domains
Read domain lifecycle and observed DNS/TLS differences
curl --request GET \
--url https://api.kombify.io/v1/techstack/api/v1/monitor/domains \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kombify.io/v1/techstack/api/v1/monitor/domains"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kombify.io/v1/techstack/api/v1/monitor/domains', 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.kombify.io/v1/techstack/api/v1/monitor/domains",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kombify.io/v1/techstack/api/v1/monitor/domains"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kombify.io/v1/techstack/api/v1/monitor/domains")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kombify.io/v1/techstack/api/v1/monitor/domains")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"generated_at": "2023-11-07T05:31:56Z",
"domains": [
{
"id": "<string>",
"stack_id": "<string>",
"server_id": "<string>",
"domain": "<string>",
"registered_domain": "<string>",
"services": [
{
"id": "<string>",
"name": "<string>"
}
],
"registration": {
"state": "known",
"freshness": "fresh",
"source": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"remaining_seconds": 123,
"reason_code": "<string>"
},
"tls": {
"state": "known",
"freshness": "fresh",
"source": "<string>",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"remaining_seconds": 123,
"reason_code": "<string>",
"subject": "<string>",
"issuer": "<string>",
"fingerprint_sha256": "<string>",
"valid": true
},
"dns": {
"state": "matching",
"freshness": "fresh",
"differences": [
{
"field": "<string>",
"expected": [
"<string>"
],
"observed": [
"<string>"
],
"state": "matching",
"reason_code": "<string>"
}
],
"source": "<string>",
"expected_source": "stack_routing_desired",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"detected_at": "2023-11-07T05:31:56Z",
"reason_code": "<string>"
},
"tls_drift": {
"state": "matching",
"freshness": "fresh",
"differences": [
{
"field": "<string>",
"expected": [
"<string>"
],
"observed": [
"<string>"
],
"state": "matching",
"reason_code": "<string>"
}
],
"source": "<string>",
"expected_source": "stack_routing_desired",
"observed_at": "2023-11-07T05:31:56Z",
"last_attempt_at": "2023-11-07T05:31:56Z",
"fresh_until": "2023-11-07T05:31:56Z",
"detected_at": "2023-11-07T05:31:56Z",
"reason_code": "<string>"
},
"conditions": [
{
"id": "<string>",
"kind": "<string>",
"state": "active",
"severity": "warning",
"first_detected_at": "2023-11-07T05:31:56Z",
"last_observed_at": "2023-11-07T05:31:56Z",
"freshness": "fresh",
"episode": 2,
"resolved_at": "2023-11-07T05:31:56Z",
"evidence_ref": "<string>"
}
],
"routing_revision": 123,
"tls_port": 32768,
"tls_disabled": true,
"check_started_at": "2023-11-07T05:31:56Z"
}
]
},
"meta": {
"total": 123,
"page": 123,
"per_page": 123,
"managed_runtime_inventory_complete": true,
"worker_inventory_sha256": "<string>",
"managed_runtime_active_lease_ids": [
"<string>"
],
"managed_runtime_inactive_lease_ids": [
"<string>"
],
"managed_runtime_lease_generation_digests": [
{
"lease_id": "<string>",
"resource_generation_digest": "<string>"
}
],
"managed_runtime_duplicate_lease_ids": [
"<string>"
],
"managed_runtime_attachment_conflict_lease_ids": [
"<string>"
]
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "<string>",
"details": "<unknown>"
}
}प्राधिकरण
OIDC/JWKS bearer token. Self-hosted defaults to Pocket ID; SaaS uses Auth0 through the edge. PocketBase JWT is legacy migration compatibility only.
क्वेरी पैरामीटर
Maximum string length:
128Maximum string length:
128