Skip to main content
POST

Overview

Not in MVP scope. Outcomes are documented here for later. The first trial does not depend on this call, and nothing in the cycle call needs it.
The Send Outcomes API carries how posts performed after they were placed on a board. Each record is one placement: who chose the post, its counts when it was placed, and cumulative readings on the board copy at 1, 6, 24 and 48 hours. Surf retrains the model from these records.
The 48-hour reading is what makes a post a training label. Send the earlier readings as they become available, and send the same placement_id again to add later ones. That updates the record.
Net counts are the reading minus the count at placement. Readings on the board copy start from the origin post’s values, so views_at_placement must be exact, from the board’s origin_hit.

Cadence & freshness

Refresh

Daily during the dress rehearsal, for operator-placed posts. In the live trial, as they occur or in hourly batches, to be agreed.

All or nothing

If any record fails validation, nothing in the call is stored, and the error lists every failing path.
Hides and deletions. DCinside’s admin does not record when a placed post is hidden, only the hidden_after_exposure label, so send that label and leave hidden_at as null until timed hides are logged through the unpublish path. Deletions come from the deletion table: deleted_by, deleted_at, and deleted_relative, which says whether the deletion came before or after the operator’s decision.
Model-based and operator picks go through the same call. picked_by and score_at_placement let us compare them on the same board. The model’s history features use only Main and Light outcomes that are at least 48 hours old, and they take the post’s original title from the stored candidate record.

Request Attributes

The body is gzip-compressed JSON.
array of objects
required
Up to 1,000 records. Each record is one placement.

Response Attributes

integer
required
Records in the request.
integer
required
Records stored as new placements.
integer
required
Records that matched an existing placement_id and updated it.

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
outcomes
object[]
required

Up to 1,000 records. Each record is one placement.

Maximum array length: 1000

Response

Stored.

received
integer
required

Records in the request.

Required range: x >= 0
Example:

1

created
integer
required

Records stored as new placements.

Required range: x >= 0
Example:

1

updated
integer
required

Records that matched an existing placement_id and updated it.

Required range: x >= 0
Example:

0