Skip to main content
POST

Overview

The Score a Cycle API is the one call DCinside makes at every five-minute boundary. The request carries four arrays that mirror tables DCinside already delivers: candidates (the queue), engagement (the engagement series), candidate_scores (the admin candidate-score table) and removals (queue outcomes and deletions). The response has one row per pending candidate, with its status and publish score, inside an envelope of counts and versions.
Pending means a post that was sent in this or an earlier call and is not yet in removals. Send each candidate once. Send engagement for every pending post in every cycle, because the growth features are built from that series.
Use null for a counter you do not know. Never send 0 instead: the model treats a missing value differently from a zero.

Cadence & timing

Cadence

Every five minutes by default, at :00, :05, :10 and so on, Korean time. cycle_time must be on that grid and not in the future. The interval is a setting on DCinside’s side, see Conventions.

Timeout

Scoring runs inside the request. The proposed default is a 60-second timeout, to be settled with DCinside and adjusted from the first rehearsal day. If the response does not arrive, skip the cycle and read it later with GET /v1/scores/{cycle_id}.
A candidate is scored once, at its due cycle, ceil5(max(extracted_at, first call that carries it) + 15 minutes). Until then it comes back as waiting. See How Scoring Works.

Request Attributes

The body is gzip-compressed JSON. Its limits are 16 MB after decompression, 200 candidates and 5,000 rows in each other array.
string
required
Idempotency key: the cycle time in KST as YYYYMMDDTHHMM, for example 20260929T0205. The same id with the same body returns the stored response. The same id with a different body returns 409.
string
required
The five-minute boundary this call belongs to. Scores are taken as of this time, and the model’s hour-of-day and day-of-week inputs are read from it in KST. A value off the grid or in the future gets 422.
array of objects
required
Posts that became candidates since the last successful call. Each post is sent once. May be empty.
array of objects
required
One row for every pending candidate, every cycle. Pending means sent in this or an earlier call and not yet in removals.
array of objects
required
The admin candidate-score table’s row for every pending candidate that has one. May be empty.
array of objects
required
Posts leaving the pending pool since the last successful call. May be empty.

Response Attributes

string
required
Echoed from the request.
string
required
Echoed from the request.
string
required
Our clock when the call arrived.
string
required
Our clock when scoring finished. The gap from received_at is the scoring time.
string
required
The model that produced the scores. Every score can be traced to it and to weights_version.
string
required
The publish-score weights in force for this cycle.
object
required
Row counts for this cycle.
number
required
Share of the model’s 62 tabular inputs that were missing across the posts scored in this cycle. A jump means bad data upstream.
array of strings
required
Extra fields we ignored, and anything else worth a look. Empty when clean.
array of objects
required
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.

Authorizations

Authorization
string
header
required

The API key issued for the environment, sent as the whole header value. Two keys are valid during a rotation.

Headers

Content-Encoding
enum<string>

Send gzip when the body is gzip-compressed. Recommended for this call: a busy cycle is about 0.6 MB of JSON.

Available options:
gzip

Body

application/json
cycle_id
string
required

Idempotency key: the cycle time in KST as YYYYMMDDTHHMM, for example 20260929T0205. The same id with the same body returns the stored response. The same id with a different body returns 409.

Pattern: ^\d{8}T\d{4}$
Example:

"20260929T0205"

cycle_time
string<date-time>
required

The five-minute boundary this call belongs to. Scores are taken as of this time, and the model's hour-of-day and day-of-week inputs are read from it in KST. A value off the grid or in the future gets 422.

Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:[0-5][05]:00\+09:00$
Example:

"2026-09-29T02:05:00+09:00"

candidates
object[]
required

Posts that became candidates since the last successful call. Each post is sent once. May be empty.

Maximum array length: 200
engagement
object[]
required

One row for every pending candidate, every cycle. Pending means sent in this or an earlier call and not yet in removals.

Maximum array length: 5000
candidate_scores
object[]
required

The admin candidate-score table's row for every pending candidate that has one. May be empty.

Maximum array length: 5000
removals
object[]
required

Posts leaving the pending pool since the last successful call. May be empty.

Maximum array length: 5000

Response

The scores for this cycle.

cycle_id
string
required

Echoed from the request.

Pattern: ^\d{8}T\d{4}$
Example:

"20260929T0205"

cycle_time
string<date-time>
required

Echoed from the request.

Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:[0-5][05]:00\+09:00$
Example:

"2026-09-29T02:05:00+09:00"

received_at
string<date-time>
required

Our clock when the call arrived.

Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+09:00$
Example:

"2026-09-29T02:05:03+09:00"

scored_at
string<date-time>
required

Our clock when scoring finished. The gap from received_at is the scoring time.

Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+09:00$
Example:

"2026-09-29T02:05:09+09:00"

model_version
string
required

The model that produced the scores. Every score can be traced to it and to weights_version.

Example:

"m0924-1"

weights_version
string
required

The publish-score weights in force for this cycle.

Example:

"w-1"

counts
object
required

Row counts for this cycle.

missing_feature_share
number
required

Share of the model's 62 tabular inputs that were missing across the posts scored in this cycle. A jump means bad data upstream.

Required range: 0 <= x <= 1
Example:

0.11

warnings
string[]
required

Extra fields we ignored, and anything else worth a look. Empty when clean.

Example:
results
object[]
required

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.