curl --request GET \
--url https://dcinside-rtb-api.stg.kr.ask.surf/v1/healthimport requests
url = "https://dcinside-rtb-api.stg.kr.ask.surf/v1/health"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dcinside-rtb-api.stg.kr.ask.surf/v1/health', 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://dcinside-rtb-api.stg.kr.ask.surf/v1/health",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://dcinside-rtb-api.stg.kr.ask.surf/v1/health"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dcinside-rtb-api.stg.kr.ask.surf/v1/health")
.asString();require 'uri'
require 'net/http'
url = URI("https://dcinside-rtb-api.stg.kr.ask.surf/v1/health")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "ok",
"time": "2026-09-29T02:05:30+09:00",
"api_version": "1",
"model_version": "m0924-weight0",
"weights_version": "w-1",
"last_cycle_id": "20260929T0205",
"last_cycle_received_at": "2026-09-29T02:05:03+09:00"
}{
"error": {
"code": "unauthorized",
"message": "API key missing or unknown"
}
}{
"error": {
"code": "server_error",
"message": "internal error"
}
}Health
Service information and last received cycle; separate from alert verification
curl --request GET \
--url https://dcinside-rtb-api.stg.kr.ask.surf/v1/healthimport requests
url = "https://dcinside-rtb-api.stg.kr.ask.surf/v1/health"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://dcinside-rtb-api.stg.kr.ask.surf/v1/health', 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://dcinside-rtb-api.stg.kr.ask.surf/v1/health",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://dcinside-rtb-api.stg.kr.ask.surf/v1/health"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://dcinside-rtb-api.stg.kr.ask.surf/v1/health")
.asString();require 'uri'
require 'net/http'
url = URI("https://dcinside-rtb-api.stg.kr.ask.surf/v1/health")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "ok",
"time": "2026-09-29T02:05:30+09:00",
"api_version": "1",
"model_version": "m0924-weight0",
"weights_version": "w-1",
"last_cycle_id": "20260929T0205",
"last_cycle_received_at": "2026-09-29T02:05:03+09:00"
}{
"error": {
"code": "unauthorized",
"message": "API key missing or unknown"
}
}{
"error": {
"code": "server_error",
"message": "internal error"
}
}status: ok checks model/storage readiness; it does not prove that alerts have reached DCinside.
last_cycle_received_at records the first valid receipt even if inference subsequently fails. Identical old-cycle replays never advance it. Invalid requests and changed-body conflicts do not advance it either. The receipt survives API process restarts on the durable volume.
Surf needs an independent alert when no new data has arrived for 15 minutes, including when DCinside’s sender or the API process is down. The watchdog keeps its own durable arrival watermark and alert outbox. Confirm recipients and verify actual notification delivery before starting; collecting an outbox event is not a delivered alert.
The rehearsal failure drill stops sending for 20 minutes and verifies delivery to the intended recipients. Internal /livez and /readyz probes are deployment endpoints and are not client calls.Response
Service state.
ok when the real model and storage are ready and production credentials/durable storage are configured; otherwise degraded. This is not notification-delivery evidence.
ok, degraded "ok"
Our clock.
^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:[Zz]|[+-]\d{2}:\d{2})$"2026-09-29T02:05:30+09:00"
API major version.
"1"
Version of the configured model adapter; check status for successful artifact readiness.
"model0924-downvote0"
Weights in force.
"w0924-downvote0"
Cycle ID with the latest durable first valid receipt, or null before any valid request.
"20260929T0205"
Durable first receipt time, including valid requests whose inference failed. Replays and conflicts do not advance this watermark; it survives process restarts on the durable volume.
^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:[Zz]|[+-]\d{2}:\d{2})$"2026-09-29T02:05:03+09:00"