Returning.AIDevelopers
v1

API reference / Gamification / Match Predictions

.md

Publish match prediction

Publish a draft match prediction so the traders it targets can see it and, from predictionStartAt, submit predictions.

Last updated 26 Sep 2026API v1

Method
POST
Path
https://api.returning.ai/v1/match-predictions/{matchPredictionId}/publish
Permission
matchPredictions
Retries
Safe to repeat; a published match returns 200

When to use this

  • A draft is ready and should go live for the traders in its audience.
  • You create matches ahead of time and publish each one when your campaign starts.

Authentication#

Header
Authorization: Bearer <API_KEY>
Permission
matchPredictionsShown in the dashboard as “Match Prediction”

Use a Community API key with matchPredictions, shown in the dashboard as Match Prediction, and keep it on your server. The key decides the community: you only see and change match predictions in that community, and an ID from another community returns 404, the same as an unknown ID. Personal API keys are rejected with 403.

Behaviour#

api.returning.ai doesn't serve this route yet: requests return an empty 404. Ask Returning.AI before you build on it.

Publishing makes the match visible to the traders in viewPermission, and to nobody else. It doesn't notify them. status becomes scheduled, open or locked from the clock, and version goes up by 1. This call has no body.

Before publishing, the draft is checked: the title and team names are set, the times are in order, kickoffAt is in the future, and viewPermission has at least one role or user, each still in your community. All problems come back together in details.

A published match can't go back to draft, and it can't be deleted through the API: it ends when you settle or void it. After publishing, only title, description, externalReference and later times can change.

Request#

Path parameters#

matchPredictionId#stringREQUIRED
The match prediction ID from Create match prediction or List match predictions.

Rulemp_ and 24 hex characters

Eg"mp_66f000000000000000000801"

Headers#

Authorization#stringREQUIRED
Community API key with matchPredictions.

RuleBearer <API_KEY>

X-Request-Id#stringOPTIONAL
Your own ID for this request, returned in meta.requestId. Without it, a req_... ID is generated.
curl --request POST \
  --url https://api.returning.ai/v1/match-predictions/mp_66f000000000000000000801/publish \
  --header 'Authorization: Bearer <API_KEY>'

Response#

A 200 returns the whole match prediction with isPublished true. Publishing a match that is already published returns 200 with its current state and changes nothing.

meta#objectALWAYS
Result details.
status#stringALWAYS
Result of the request.

Rulesuccess

statusCode#integerALWAYS
The HTTP status, repeated.
code#stringALWAYS
Machine-readable result code.

RuleMATCH_PREDICTION_PUBLISHED

requestId#stringALWAYS
Your X-Request-Id if you sent one, otherwise a generated req_... ID. Quote it when you contact support.
message#stringALWAYS
Human-readable summary. Do not branch on it.
data#objectALWAYS
The match prediction after publishing.
id#stringALWAYS
The match prediction ID. Use it in every other call.

Rulemp_ and 24 hex characters

externalReference#string
Your own fixture ID. Left out when not set.
title#stringALWAYS
The match title traders see.
description#string
Longer text for traders. Left out when not set.
teamA#objectALWAYS
The first team.
name#stringALWAYS
Team name.
imageUrl#string
Team logo URL. Left out when not set.
teamB#objectALWAYS
The second team.
name#stringALWAYS
Team name.
imageUrl#string
Team logo URL. Left out when not set.
predictionStartAt#stringALWAYS
When traders can start predicting, in UTC. Milliseconds always read .000.
lockAt#stringALWAYS
When predictions close, in UTC.
kickoffAt#stringALWAYS
When the match starts, in UTC.
scoreBasis#stringALWAYS
Which score you settle on. Settlement uses the score you send either way.

Ruleregulation or extra_time

viewPermission#objectALWAYS
Who can see the match once it is published.
roleIds#string[]ALWAYS
Role IDs. Traders with any of these roles can see it.
userIds#string[]ALWAYS
Platform user IDs, as strings, of traders who can see it.
rewards#objectALWAYS
What winners earn.
correctResult#objectALWAYS
Paid for picking the right result: team A, team B or a draw.
coins#integerALWAYS
Coins.
xp#integerALWAYS
XP.
exactScoreBonus#objectALWAYS
Paid on top of correctResult when the called score is also exact.
coins#integerALWAYS
Coins.
xp#integerALWAYS
XP.
entryCost#objectALWAYS
What a trader pays to predict.
enabled#booleanALWAYS
true when predicting costs coins.
coins#integerALWAYS
Coins per prediction. 0 when enabled is false.
status#stringALWAYS
draft until published. Then scheduled before predictionStartAt, open while traders can predict and locked from lockAt, all worked out from the clock. The rest follow a settle or void.

Ruledraft, scheduled, open, locked, settlement_in_progress, settled, settlement_failed, void_in_progress, voided or void_failed

isPublished#booleanALWAYS
true once published.
acceptingPredictions#booleanALWAYS
true while the match is open and the time is between predictionStartAt and lockAt.
attemptCount#integerALWAYS
Predictions traders have submitted.
settlement#objectALWAYS
Always null here. Read the match with Get match prediction for its settlement totals.
version#integerALWAYS
The current version. Send it with Patch match prediction. It goes up with every change, including publish, settle and void.
createdAt#stringALWAYS
When the match prediction was created.
updatedAt#stringALWAYS
When it last changed.
{
  "meta": {
    "status": "success",
    "statusCode": 200,
    "code": "MATCH_PREDICTION_PUBLISHED",
    "requestId": "req_66f00000000000000000000000000811"
  },
  "message": "Match prediction published.",
  "data": {
    "id": "mp_66f000000000000000000801",
    "title": "Australia vs New Zealand",
    "teamA": {
      "name": "Australia",
      "imageUrl": "https://cdn.example.com/teams/australia.png"
    },
    "teamB": {
      "name": "New Zealand",
      "imageUrl": "https://cdn.example.com/teams/new-zealand.png"
    },
    "predictionStartAt": "2026-10-01T08:00:00.000Z",
    "lockAt": "2026-10-10T18:55:00.000Z",
    "kickoffAt": "2026-10-10T19:00:00.000Z",
    "scoreBasis": "regulation",
    "viewPermission": {
      "roleIds": ["66f000000000000000000806"],
      "userIds": []
    },
    "rewards": {
      "correctResult": {
        "coins": 100,
        "xp": 50
      },
      "exactScoreBonus": {
        "coins": 200,
        "xp": 100
      }
    },
    "entryCost": {
      "enabled": false,
      "coins": 0
    },
    "status": "scheduled",
    "isPublished": true,
    "acceptingPredictions": false,
    "attemptCount": 0,
    "settlement": null,
    "version": 2,
    "createdAt": "2026-09-27T09:00:00.000Z",
    "updatedAt": "2026-09-28T10:00:00.000Z",
    "externalReference": "provider-fixture-123",
    "description": "Predict the final score."
  }
}

Errors#

Every error carries its code in meta.code and the request's ID in meta.requestId. Validation errors list each problem in details, with a field, code and message. The API key checks (401, 403, 404 COMMUNITY_NOT_FOUND and 500 AUTHENTICATION_FAILED) return detail and solution instead. A 404 with an empty body means the route isn't available on api.returning.ai yet. A 400 or 409 changes nothing.

Fix the request04

404Fix the request
The body is empty: api.returning.ai doesn't serve this route yet. Ask Returning.AI before you build on it.
400MATCH_PREDICTION_VALIDATION_FAILEDFix the request
The draft isn't ready: most often viewPermission is empty (NO_TARGETS), kickoffAt has passed (KICKOFF_MUST_BE_FUTURE), or a role or user in viewPermission is no longer in your community (INVALID_REFERENCE). details lists each problem. Fix it with Patch match prediction; nothing changed.
401AUTHENTICATION_REQUIREDFix the request
The key is missing, invalid or expired. Send Authorization: Bearer <API_KEY> with a current Community API key.
403API_KEY_PERMISSION_DENIEDFix the request
The key lacks matchPredictions, or it is a personal key. Use a Community API key and add Match Prediction in Settings > Integration > API Keys.

Fix the data03

404MATCH_PREDICTION_NOT_FOUNDFix the data
No match prediction in your community has this ID. Check it is the full mp_... ID from Create match prediction or List match predictions.
404COMMUNITY_NOT_FOUNDFix the data
The community this key belongs to no longer exists. Contact Returning.AI support.
409INVALID_LIFECYCLE_TRANSITIONFix the data
The match is already settled or voided, or it was moved out of draft while this request ran. Read it with Get match prediction.

Retry with backoff05

409VERSION_CONFLICTRetry with backoff
The draft changed while it was being checked. Read it again, then publish again.
429RATE_LIMITEDRetry with backoff
Your community is over its rate limit. Wait for the seconds in Retry-After, then retry.
500INTERNAL_ERRORRetry with backoff
The outcome is unclear. Read the match: if isPublished is true, you're done; otherwise publish again.
500AUTHENTICATION_FAILEDRetry with backoff
The key could not be checked. Retry with backoff; nothing changed.
503MATCH_PREDICTION_FROZENRetry with backoff
Returning.AI has paused match prediction requests. Nothing changed. Retry later with backoff.
{
  "meta": {
    "status": "error",
    "statusCode": 404,
    "code": "MATCH_PREDICTION_NOT_FOUND",
    "requestId": "req_66f00000000000000000000000000811"
  },
  "message": "Match prediction not found."
}

Next step#

Settle match predictionPOST/v1/match-predictions/{matchPredictionId}/settlementsAfter kickoff, send the final score to pay the winners.