curl --request GET \
--url "https://rtb.example.com/v1/scores/20260929T0205" \
--header "Authorization: <api-key>"
import requests
response = requests.get(
"https://rtb.example.com/v1/scores/20260929T0205",
headers={"Authorization": "<api-key>"},
)
scores = response.json()
const response = await fetch(
"https://rtb.example.com/v1/scores/20260929T0205",
{ headers: { Authorization: "<api-key>" } },
);
const scores = await response.json();
{
"cycle_id": "20260929T0205",
"cycle_time": "2026-09-29T02:05:00+09:00",
"received_at": "2026-09-29T02:05:03+09:00",
"scored_at": "2026-09-29T02:05:09+09:00",
"model_version": "m0924-1",
"weights_version": "w-1",
"counts": {
"candidates": 1,
"engagement": 2,
"candidate_scores": 1,
"removals": 1,
"scored_now": 1,
"waiting": 1,
"not_scored": 0,
"results": 2
},
"missing_feature_share": 0.11,
"warnings": [],
"results": [
{
"gall_id": "example_gallery",
"post_no": 31899120,
"status": "scored",
"score": 0.62,
"p_views": 0.62,
"p_comments": 0.41,
"p_up": 0.37,
"downvote_share": 0.08,
"scored_at_cycle": "2026-09-29T02:05:00+09:00"
},
{
"gall_id": "example_gallery",
"post_no": 31900001,
"status": "waiting",
"score": null,
"due_cycle": "2026-09-29T02:20:00+09:00"
}
]
}
{
"error": {
"code": "not_found",
"message": "no cycle 20260929T0205"
}
}
Get Cycle Scores
The stored response for a cycle, byte for byte. Use it after a timeout or a lost response.
curl --request GET \
--url "https://rtb.example.com/v1/scores/20260929T0205" \
--header "Authorization: <api-key>"
import requests
response = requests.get(
"https://rtb.example.com/v1/scores/20260929T0205",
headers={"Authorization": "<api-key>"},
)
scores = response.json()
const response = await fetch(
"https://rtb.example.com/v1/scores/20260929T0205",
{ headers: { Authorization: "<api-key>" } },
);
const scores = await response.json();
{
"cycle_id": "20260929T0205",
"cycle_time": "2026-09-29T02:05:00+09:00",
"received_at": "2026-09-29T02:05:03+09:00",
"scored_at": "2026-09-29T02:05:09+09:00",
"model_version": "m0924-1",
"weights_version": "w-1",
"counts": {
"candidates": 1,
"engagement": 2,
"candidate_scores": 1,
"removals": 1,
"scored_now": 1,
"waiting": 1,
"not_scored": 0,
"results": 2
},
"missing_feature_share": 0.11,
"warnings": [],
"results": [
{
"gall_id": "example_gallery",
"post_no": 31899120,
"status": "scored",
"score": 0.62,
"p_views": 0.62,
"p_comments": 0.41,
"p_up": 0.37,
"downvote_share": 0.08,
"scored_at_cycle": "2026-09-29T02:05:00+09:00"
},
{
"gall_id": "example_gallery",
"post_no": 31900001,
"status": "waiting",
"score": null,
"due_cycle": "2026-09-29T02:20:00+09:00"
}
]
}
{
"error": {
"code": "not_found",
"message": "no cycle 20260929T0205"
}
}
Overview
The Get Cycle Scores API returns the response thatPOST /v1/cycles produced for a cycle, byte for byte. It does not score anything and never changes what was stored, so it is safe to call as often as needed.POST /v1/cycles with the same cycle_id and the same body returns the same stored response, so either call works. This one needs no body.When to use it
After a timeout
If scoring moves to polling
202 and the result is polled from this endpoint.Request Attributes
YYYYMMDDTHHMM in KST, for example 20260929T0205. A cycle we never received returns 404 not_found.Response Attributes
The body is the sameCycleResponse object as in Score a Cycle: the envelope with counts and versions, and one row in results for every candidate that was pending in that cycle.curl --request GET \
--url "https://rtb.example.com/v1/scores/20260929T0205" \
--header "Authorization: <api-key>"
import requests
response = requests.get(
"https://rtb.example.com/v1/scores/20260929T0205",
headers={"Authorization": "<api-key>"},
)
scores = response.json()
const response = await fetch(
"https://rtb.example.com/v1/scores/20260929T0205",
{ headers: { Authorization: "<api-key>" } },
);
const scores = await response.json();
{
"cycle_id": "20260929T0205",
"cycle_time": "2026-09-29T02:05:00+09:00",
"received_at": "2026-09-29T02:05:03+09:00",
"scored_at": "2026-09-29T02:05:09+09:00",
"model_version": "m0924-1",
"weights_version": "w-1",
"counts": {
"candidates": 1,
"engagement": 2,
"candidate_scores": 1,
"removals": 1,
"scored_now": 1,
"waiting": 1,
"not_scored": 0,
"results": 2
},
"missing_feature_share": 0.11,
"warnings": [],
"results": [
{
"gall_id": "example_gallery",
"post_no": 31899120,
"status": "scored",
"score": 0.62,
"p_views": 0.62,
"p_comments": 0.41,
"p_up": 0.37,
"downvote_share": 0.08,
"scored_at_cycle": "2026-09-29T02:05:00+09:00"
},
{
"gall_id": "example_gallery",
"post_no": 31900001,
"status": "waiting",
"score": null,
"due_cycle": "2026-09-29T02:20:00+09:00"
}
]
}
{
"error": {
"code": "not_found",
"message": "no cycle 20260929T0205"
}
}
Authorizations
The API key issued for the environment, sent as the whole header value. Two keys are valid during a rotation.
Path Parameters
The cycle id sent in the original call.
^\d{8}T\d{4}$"20260929T0205"
Response
The response stored for this cycle.
Echoed from the request.
^\d{8}T\d{4}$"20260929T0205"
Echoed from the request.
^\d{4}-\d{2}-\d{2}T\d{2}:[0-5][05]:00\+09:00$"2026-09-29T02:05:00+09:00"
Our clock when the call arrived.
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+09:00$"2026-09-29T02:05:03+09:00"
Our clock when scoring finished. The gap from received_at is the scoring time.
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+09:00$"2026-09-29T02:05:09+09:00"
The model that produced the scores. Every score can be traced to it and to weights_version.
"m0924-1"
The publish-score weights in force for this cycle.
"w-1"
Row counts for this cycle.
Show child attributes
Show child attributes
Share of the model's 62 tabular inputs that were missing across the posts scored in this cycle. A jump means bad data upstream.
0 <= x <= 10.11
Extra fields we ignored, and anything else worth a look. Empty when clean.
[]
One row per pending candidate. Scores given earlier are repeated unchanged, so DCinside keeps no score memory of its own. Removed posts are not returned.
Show child attributes
Show child attributes