Create match prediction
Create a match prediction as a draft in the community that owns your API key, ready to edit and then publish.
- Method
- POST
- Path
https://api.returning.ai / v1/ match-predictions - Permission
- matchPredictions
- Retries
- Idempotency-Key required; reuse it only for the same body
When to use this
- A fixture is announced and you want a prediction game for it.
- Your sports data feed creates one match prediction per fixture, keyed by your own fixture ID.
- You want to set up the teams, times and rewards now and publish later.
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.
A new match prediction is a draft: traders can't see it until you publish it. Drafts also appear with your other mini-games in the dashboard, where your team can edit or delete them, and match predictions your team creates there are returned by these endpoints too.
Request#
Headers#
matchPredictions.RuleBearer <API_KEY>
Rule1-255 characters
Eg"3f9c2a7e-1b4d-4e8a-9c61-2d5f7a8b9e10"
415.Ruleapplication/json
meta.requestId. Without it, a req_... ID is generated.Body#
Required: title, teamA.name, teamB.name, predictionStartAt, lockAt, kickoffAt, both reward tiers, entryCost and viewPermission. Every other field is optional, and a field that isn't listed here is rejected at any level.
Send times as ISO 8601 in UTC ending in Z, such as 2026-10-10T19:00:00.000Z; an offset such as +08:00 is rejected. predictionStartAt must be at or before lockAt, lockAt at or before kickoffAt, and kickoffAt in the future.
Send your fixture ID as externalReference. It is unique in your community, so a repeated create returns 409 EXTERNAL_REFERENCE_CONFLICT instead of a second match. Role and user IDs in viewPermission must belong to your community.
Rule1-256 characters, trimmed
Eg"Australia vs New Zealand"
RuleUp to 10,000 characters
Eg"Predict the final score."
Rule1-128 characters, trimmed
Eg"provider-fixture-123"
Eg{ ... }
Rule1-128 characters
Eg"Australia"
RuleA URL, up to 2,048 characters
Eg"https://cdn.example.com/teams/australia.png"
Eg{ ... }
Rule1-128 characters
Eg"New Zealand"
RuleA URL, up to 2,048 characters
Eg"https://cdn.example.com/teams/new-zealand.png"
RuleISO 8601 in UTC ending in Z; at or before lockAt
Eg"2026-10-01T08:00:00.000Z"
RuleISO 8601 in UTC ending in Z; at or before kickoffAt
Eg"2026-10-10T18:55:00.000Z"
RuleISO 8601 in UTC ending in Z; in the future
Eg"2026-10-10T19:00:00.000Z"
regulation.Ruleregulation or extra_time
Eg"regulation"
Eg{ ... }
Eg{"coins": 100, "xp": 50}
RuleWhole number, 0-1,000,000
Eg100
RuleWhole number, 0-1,000,000
Eg50
correctResult when the called score is also exact.Eg{"coins": 200, "xp": 100}
RuleWhole number, 0-1,000,000
Eg200
RuleWhole number, 0-1,000,000
Eg100
Eg{"enabled": false, "coins": 0}
true to charge coins for each prediction.Egfalse
RuleWhole number; 0 when enabled is false
Eg0
Eg{"roleIds": ["66f000000000000000000806"], "userIds": []}
RuleRole IDs in your community
Eg["66f000000000000000000806"]
RuleMembers of your community
Eg["3247779"]
curl --request POST \
--url https://api.returning.ai/v1/match-predictions \
--header 'Authorization: Bearer <API_KEY>' \
--header 'Idempotency-Key: 3f9c2a7e-1b4d-4e8a-9c61-2d5f7a8b9e10' \
--header 'Content-Type: application/json' \
--data '{
"title": "Australia vs New Zealand",
"description": "Predict the final score.",
"externalReference": "provider-fixture-123",
"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",
"rewards": {
"correctResult": {
"coins": 100,
"xp": 50
},
"exactScoreBonus": {
"coins": 200,
"xp": 100
}
},
"entryCost": {
"enabled": false,
"coins": 0
},
"viewPermission": {
"roleIds": ["66f000000000000000000806"],
"userIds": []
}
}'
Response#
A 201 returns the whole match prediction, with status draft, isPublished false and version 1. Save data.id for every later call.
Eg{ ... }
Rulesuccess
Rule201
RuleMATCH_PREDICTION_CREATED
X-Request-Id if you sent one, otherwise a generated req_... ID. Quote it when you contact support.Eg"req_66f00000000000000000000000000811"
Eg"Match prediction created."
Eg{ ... }
Rulemp_ and 24 hex characters
Eg"mp_66f000000000000000000801"
.000.Ruleregulation or extra_time
correctResult when the called score is also exact.true when predicting costs coins.0 when enabled is false.draft for a new match prediction.Ruledraft
true once published.true while the match is open and the time is between predictionStartAt and lockAt.null here. Read the match with Get match prediction for its settlement totals.1 for a new match prediction. Send it with your first Patch match prediction.Eg1
{
"meta": {
"status": "success",
"statusCode": 201,
"code": "MATCH_PREDICTION_CREATED",
"requestId": "req_66f00000000000000000000000000811"
},
"message": "Match prediction created.",
"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": "draft",
"isPublished": false,
"acceptingPredictions": false,
"attemptCount": 0,
"settlement": null,
"version": 1,
"createdAt": "2026-09-27T09:00:00.000Z",
"updatedAt": "2026-09-27T09: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.
Fix the request10
MATCH_PREDICTION_VALIDATION_FAILEDFix the requestkickoffAt isn't in the future; or entryCost.coins isn't 0 while entryCost.enabled is false. details lists each problem. A role or user in viewPermission that isn't in your community gives INVALID_REFERENCE, with message Match prediction configuration is invalid. Nothing was saved.READ_ONLY_FIELDFix the requestid, status, version or createdAt. details names it. Remove it.INVALID_JSONFix the requestIDEMPOTENCY_KEY_REQUIREDFix the requestIdempotency-Key header with a unique value.IDEMPOTENCY_KEY_INVALIDFix the requestIdempotency-Key is longer than 255 characters. Use a shorter key, such as a UUID.UNSUPPORTED_MEDIA_TYPEFix the requestContent-Type: application/json.AUTHENTICATION_REQUIREDFix the requestAuthorization: Bearer <API_KEY> with a current Community API key.API_KEY_PERMISSION_DENIEDFix the requestmatchPredictions, or it is a personal key. Use a Community API key and add Match Prediction in Settings > Integration > API Keys.IDEMPOTENCY_KEY_CONFLICTFix the requestIdempotency-Key was already used with a different body, or the first request with it is still running. Use a new key for a new body.Fix the data02
COMMUNITY_NOT_FOUNDFix the dataEXTERNAL_REFERENCE_CONFLICTFix the dataexternalReference. Find it with List match predictions instead of creating it again.Retry with backoff04
RATE_LIMITEDRetry with backoffRetry-After, then retry.INTERNAL_ERRORRetry with backoffexternalReference, and create it again with a new key only if it isn't there.AUTHENTICATION_FAILEDRetry with backoffMATCH_PREDICTION_FROZENRetry with backoff{
"meta": {
"status": "success",
"statusCode": 201,
"code": "MATCH_PREDICTION_CREATED",
"requestId": "req_66f00000000000000000000000000811"
},
"message": "Match prediction created.",
"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": "draft",
"isPublished": false,
"acceptingPredictions": false,
"attemptCount": 0,
"settlement": null,
"version": 1,
"createdAt": "2026-09-27T09:00:00.000Z",
"updatedAt": "2026-09-27T09:00:00.000Z",
"externalReference": "provider-fixture-123",
"description": "Predict the final score."
}
}