Skip to main content
POST
/
api
/
v1
/
tracking
/
feedback
{
  "bid_id": "bid_abc123",
  "feedback_type": "positive"
}
// No response body (HTTP 204 No Content)

Authorizations

Content-Type
string
required
Must be application/json

Body

bid_id
string
required
The bidId from the original bid response. Identifies which impression the feedback is for. User, publisher, campaign, and product information is resolved server-side from the impression data.
feedback_type
string
required
User’s feedback signal. Must be "positive" or "negative".
feedback_text
string
Optional free-text feedback from the user (max 1000 characters). Useful for “tell us why” flows on negative feedback.
{
  "bid_id": "bid_abc123",
  "feedback_type": "positive"
}
// No response body (HTTP 204 No Content)

Behavior

  • One feedback per impression — duplicate submissions for the same bid_id return 204 silently (no error, no overwrite).
  • Impression must exist — the bid_id must correspond to a tracked impression. If the impression has expired or was never recorded, the endpoint returns 404.
  • Server-side enrichment — user, publisher, campaign, and product information is resolved automatically from the impression. You only need to send the bid_id.
  • No authentication required — this endpoint is called from the client side (browser or mobile app) and does not require an API key.

Status Codes

Status CodeMeaningScenario
204 No ContentSuccessFeedback recorded (or already recorded for this impression)
404 Not FoundInvalid impressionbid_id doesn’t match a known impression or has expired
422 Unprocessable EntityValidation errorMissing required fields or invalid feedback_type
500 Internal Server ErrorServer errorInternal processing failure

Integration

Add a thumbs up / thumbs down UI next to each ad. When the user taps, fire a single POST request:
// iOS (Swift)
func sendFeedback(bidId: String, type: String) {
    guard let url = URL(string: "https://ssp.thrads.ai/api/v1/tracking/feedback") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try? JSONSerialization.data(withJSONObject: [
        "bid_id": bidId,
        "feedback_type": type
    ])
    URLSession.shared.dataTask(with: request).resume()
}
// Web (JavaScript)
async function sendFeedback(bidId, type) {
  await fetch("https://ssp.thrads.ai/api/v1/tracking/feedback", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      bid_id: bidId,
      feedback_type: type,
    }),
  });
}