Geliştiriciler
Akıllı Futbol'un JSON API'si. Mobil uygulama ve entegrasyonlar web uygulamasıyla aynı kuralları ve yetkileri kullanır.
Başlarken
Uç noktalar https://akilli.futbol/api/v1 altında; istekler ve yanıtlar JSON'dır.
Belgenin tamamı OpenAPI 3.1 biçiminde de var; Postman, Insomnia ya da istemci üreticilere doğrudan verebilirsin.
Uç noktaların özetleri ve notları OpenAPI belgesinden olduğu gibi gelir, bu yüzden İngilizcedir.
108 uç nokta, 16 bölüm.
Kimlik doğrulama
Hesap aç ya da giriş yap: kullanıcı adı ve şifreyle
POST /api/auth/sign-up/usernameya daPOST /api/auth/sign-in/usernameadresine JSON gönder.İstek curl -i -X POST https://akilli.futbol/api/auth/sign-in/username \ -H "content-type: application/json" \ -d '{"username": "deniz", "password": "kale-direği-1905"}'Yanıtın
set-auth-tokenbaşlığındaki imzalı token'ı cihazda güvenli bir yerde sakla. Bearer token olarak yalnızca bu token geçer: gövdedekitokenham oturum token'ıdır ve kabul edilmez.Yanıt HTTP/1.1 200 OK set-auth-token: P4cTUK….9e7wV6…= content-type: application/json { "redirect": false, "token": "P4cTUK…", "user": { "id": "0193…", "username": "deniz", "name": "Deniz", … } }Her istekte
Authorization: Bearer <token>başlığını gönder.İstek curl https://akilli.futbol/api/v1/me \ -H "Authorization: Bearer P4cTUK….9e7wV6…="
Tarayıcıda web oturumunun çerezi de kabul edilir. Yanlış şifre ile olmayan kullanıcı adı aynı hatayı alır (401); askıya alınan hesaplar 403 BANNED_USER alır. Giriş denemeleri hem IP hem kullanıcı adı başına sınırlıdır (429).
Çıkış yapmak için POST /api/auth/sign-out, diğer bütün cihazlardan çıkış için POST /api/auth/revoke-other-sessions gönder; ikisi de gövde istemez. Oturum yalnızca istek 200 dönerse kapanır, bu yüzden yanıt kodunu kontrol et. POST /api/auth/change-password ile şifre değişince bu cihaz dahil bütün oturumlar kapanır ve yanıtın set-auth-token başlığında yeni bir token gelir: eskisinin yerine onu sakla.
Yanıt biçimi
Başarılı yanıtlar sonucu data alanında taşır. Hatalar error alanında bir kod, okunur bir mesaj ve gerektiğinde alan bazında hata kodları (fields) taşır.
{
"data": { … }
}{
"error": {
"code": "INVALID",
"message": "Some fields are invalid",
"fields": { "name": "tooShort" }
}
}Hata kodları
UNAUTHENTICATEDOturum yok ya da token geçersiz: yeniden giriş yap.FORBIDDENBu işlem için yetkin yok.NOT_FOUNDKayıt yok ya da senin göremeyeceğin bir kayıt.CONFLICTİstek mevcut durumla çelişiyor; nedeni fields içinde.INVALIDGövde ya da alanlar geçersiz; her alanın hata kodu fields içinde.RATE_LIMITEDÇok fazla istek: biraz bekleyip tekrar dene.INTERNALSunucuda bir sorun çıktı: biraz sonra tekrar dene.
/api/v1 altında olmayan bir yol da bu biçimde 404 NOT_FOUND döner; bir yolun desteklemediği yöntem ise boş gövdeli 405 alır.
/api/auth altındaki uç noktalar Better Auth'a aittir: yanıtları data sarmalı olmadan gelir, hataları da code ve message alanlarıyla döner.
Hesap ve oturum
Auth etiketi, 7 uç noktaCreate an account and sign in
Oturum gerekmez
The signed session token is in the
set-auth-tokenresponse header: keep it and send it asAuthorization: Bearer <token>. Rate-limited per IP: 20 per 10 minutes (429). 400 INVALID_SIGN_UP with an error code per field inerrors:displayName: displayName;username: username (3–20 characters of a–z, 0–9 and _);password: password (12–128 characters), passwordIsUsername or passwordCommon;adult,privacyNotice,terms: required;form: generic (positions or locale not valid). 400 USERNAME_IS_ALREADY_TAKEN witherrors.username= usernameTaken (reserved names count as taken). 400 VALIDATION_ERROR when a field is missing or has the wrong type. 403 for a sign-up a browser sends from another site.Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
displayNamestringzorunlu2–40 characters
usernamestringzorunlu3–20: a-z, 0-9, _ (stored lower-case)
passwordstringzorunlu12–128 characters; not a common password, not built from the username or name
positionsstring[]isteğe bağlıDeğerler:
"goalkeeper","defender","midfielder","forward"adultbooleanzorunluDeğerler:
trueprivacyNoticebooleanzorunluDeğerler:
truetermsbooleanzorunluDeğerler:
truelocalestringzorunluDeğerler:
"tr","en"
Yanıt gövdesi
userobjectzorunluidstringzorunluusernamestringzorunlu
Sign in
Oturum gerekmez
The signed session token is in the
set-auth-tokenresponse header: keep it and send it asAuthorization: Bearer <token>. 401 INVALID_USERNAME_OR_PASSWORD for any wrong name or password; 403 BANNED_USER; 429 TOO_MANY_ATTEMPTS after repeated wrong passwords for the username, from any address, or 429 without a code past the per-IP limit (3 per 10 seconds).Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
usernamestringzorunlupasswordstringzorunlurememberMebooleanisteğe bağlı
Yanıt gövdesi
redirectbooleanzorunluAlways false
tokenstringzorunluThe raw session token. It is refused as a bearer token: use the set-auth-token header. The signed session token is in the
set-auth-tokenresponse header: keep it and send it asAuthorization: Bearer <token>.userobjectzorunluidstringzorunluusernamestringzorunluLower-case; the profile address, /p/{username}
displayUsernamestringzorunlunamestringzorunluThe display name
emailstringzorunluNot an address: a random placeholder Better Auth needs (accounts have no email). Ignore it
emailVerifiedbooleanzorunluimagestring | nullzorunlurolestring | nullzorunlu"admin" or "user"
bannedboolean | nullzorunlubanReasonstring | nullzorunlubanExpiresstring | nullzorunlucreatedAtstringzorunluupdatedAtstringzorunlu
Check whether a username is free
Oturum gerekmez
What the sign-up form asks as you type. Reserved names (staff words, the brand, app routes such as destek or developers) and names in use answer
available: false, as sign-up would refuse them. 422 USERNAME_TOO_SHORT, USERNAME_TOO_LONG or INVALID_USERNAME (3–20 characters of a–z, 0–9 and _). Rate-limited per IP: 30 per minute (429).Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
usernamestringzorunluAs typed: it is checked after the same normalising as sign-up (Turkish letters folded, lower-cased)
Yanıt gövdesi
availablebooleanzorunlu
Sign out (ends this session)
Oturum gerekir
The session ends only when this answers 200
{ success: true }; after any other answer the token may still work. Forget the stored token either way.Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
Alan yok.
Yanıt gövdesi
successbooleanzorunlu
The current session and user
Oturum gerekir
Answers 200 with
null, not 401, when there is no valid session.Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
Yanıt gövdesi
sessionobjectzorunluidstringzorunluuserIdstringzorunlutokenstringzorunluThe raw session token. It is refused as a bearer token: use the set-auth-token header. The signed session token is in the
set-auth-tokenresponse header: keep it and send it asAuthorization: Bearer <token>.expiresAtstringzorunluISO 8601. A session lasts 7 days and is extended, at most once a day, while it is used
createdAtstringzorunluupdatedAtstringzorunluipAddressstring | nullzorunluuserAgentstring | nullzorunluimpersonatedBystring | nullzorunlu
userobjectzorunluidstringzorunluusernamestringzorunluLower-case; the profile address, /p/{username}
displayUsernamestringzorunlunamestringzorunluThe display name
emailstringzorunluNot an address: a random placeholder Better Auth needs (accounts have no email). Ignore it
emailVerifiedbooleanzorunluimagestring | nullzorunlurolestring | nullzorunlu"admin" or "user"
bannedboolean | nullzorunlubanReasonstring | nullzorunlubanExpiresstring | nullzorunlucreatedAtstringzorunluupdatedAtstringzorunlu
Change the password
Oturum gerekir
Signs every session out, this one included, and starts a new one: replace the stored token with the new
set-auth-tokenresponse header (a browser gets a new cookie). Every other device has to sign in again. ArevokeOtherSessionsfield is ignored. 400 INVALID_PASSWORD (the current password is wrong), PASSWORD_TOO_SHORT, PASSWORD_TOO_LONG, PASSWORD_IS_USERNAME or PASSWORD_TOO_COMMON (a common word or a password built from the username or name); 401 without a valid session.Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
currentPasswordstringzorunlunewPasswordstringzorunlu12–128 characters; not the username, nothing common or built from the username or name
Yanıt gövdesi
tokenstringzorunluThe raw session token. It is refused as a bearer token: use the set-auth-token header. The signed session token is in the
set-auth-tokenresponse header: keep it and send it asAuthorization: Bearer <token>.userobjectzorunluidstringzorunluusernamestringzorunluLower-case; the profile address, /p/{username}
displayUsernamestringzorunlunamestringzorunluThe display name
emailstringzorunluNot an address: a random placeholder Better Auth needs (accounts have no email). Ignore it
emailVerifiedbooleanzorunluimagestring | nullzorunlurolestring | nullzorunlu"admin" or "user"
bannedboolean | nullzorunlubanReasonstring | nullzorunlubanExpiresstring | nullzorunlucreatedAtstringzorunluupdatedAtstringzorunlu
Sign out every other device
Oturum gerekir
This device stays signed in. The other sessions end only when this answers 200
{ status: true }; after any other answer they may still work, so try again.Better Auth uç noktası: yanıtı data sarmalı olmadan gelir.
Alanları gösterAlanları gizle
İstek gövdesi
Alan yok.
Yanıt gövdesi
statusbooleanzorunlu
Hesabım
Me etiketi, 5 uç nokta- GET
/api/ v1/ me Your profile settings
Oturum gerekir
Alanları gösterAlanları gizle
Yanıttaki data
idstringzorunluThe player id
userIdstringzorunluusernamestringzorunluFixed: the profile address, /p/{username}
handlestringzorunludisplayNamestringzorunlupositionsstring[]zorunluDeğerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluYour profile photo (PUT /api/v1/me/photo), or null
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
visibilitystringzorunluWho sees your stats, teams and match history. public: everyone; teammates: people who share a team with you or a match you took part in; private: nobody else
Değerler:
"public","teammates","private"rolestring | nullzorunlu"admin" or "user"
activeSessionsintegerzorunluSigned-in devices, this one included
- PATCH
/api/ v1/ me Change your display name, positions or visibility
Oturum gerekir
422 INVALID with
fields.displayName= required | tooShort | tooLong | invalid, orfields.username= immutable when a different username is sent (the username never changes). Change the password at /api/auth/change-password; sign out other devices at /api/auth/revoke-other-sessions.Alanları gösterAlanları gizle
İstek gövdesi
displayNamestringisteğe bağlıen az 1 karakter
positionsstring[]isteğe bağlıDeğerler:
"goalkeeper","defender","midfielder","forward"visibilitystringisteğe bağlıDeğerler:
"public","teammates","private"
Yanıttaki data
idstringzorunluThe player id
userIdstringzorunluusernamestringzorunluFixed: the profile address, /p/{username}
handlestringzorunludisplayNamestringzorunlupositionsstring[]zorunluDeğerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluYour profile photo (PUT /api/v1/me/photo), or null
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
visibilitystringzorunluWho sees your stats, teams and match history. public: everyone; teammates: people who share a team with you or a match you took part in; private: nobody else
Değerler:
"public","teammates","private"rolestring | nullzorunlu"admin" or "user"
activeSessionsintegerzorunluSigned-in devices, this one included
Your profile photo
Oturum gerekir
Alanları gösterAlanları gizle
Yanıttaki data
photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Upload or replace your profile photo
Oturum gerekir
Send the photo as the body (
Content-Type: image/jpeg,image/pngorimage/webp), or asmultipart/form-datawith the file in thephotofield. Up to 10 MB, at least 256 px on its shorter side. The server turns it upright by its EXIF orientation, cuts the largest centred square (crop it yourself first to choose), and stores WebP copies without any metadata: location, camera and time are dropped. The photo is seen by whoever may see your stats (your visibility), and never used to recognise anyone in match videos. 422 INVALID withfields.file= required | type | tooBig | dimensions.Alanları gösterAlanları gizle
Yanıttaki data
photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
- DELETE
/api/ v1/ me/ photo Remove your profile photo
Oturum gerekir
Your initials show again. Fine without a photo.
Alanları gösterAlanları gizle
Yanıttaki data
photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Takımlar
Teams etiketi, 9 uç noktaTeams the caller plays for (archived teams left out)
Oturum gerekir
Alanları gösterAlanları gizle
Yanıttaki data
Tür:
object[]Her öğenin alanları:
idstring (uuid)zorunluslugstringzorunluURL slug, e.g. kartallar-7k2m
namestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb, lower-case
kitAwayHexstring | nullzorunlu#rrggbb, lower-case
crestobject | nullzorunluCustom crest, or null to use the team name and kit colours
shapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
rolestringzorunluThe caller's role in the team
Değerler:
"captain","co_captain","member"memberCountintegerzorunlu
- POST
/api/ v1/ teams Start a team. The caller becomes captain and a 6-letter invite code is issued. Name and city are stored NFKC-normalised with single spaces. An optional crest has a shape, two distinct #rrggbb colours, one Unicode letter, a pattern (default plain) and a detail (default none). Field errors: name required/tooShort/tooLong/invalid (hidden or text-direction characters)/staffWord (reads as staff: “Akıllı Futbol”, “Admin”, “Destek”…), city tooLong/invalid, kitHomeHex required/invalid, kitAwayHex invalid/sameAsHome, crest.shape/primary/secondary/letter/pattern/detail invalid (equal colours: crest.secondary=differentColour).
Oturum gerekir
Alanları gösterAlanları gizle
İstek gövdesi
namestringzorunlu2–40 karakter
citystring | nullisteğe bağlıen çok 60 karakter
kitHomeHexstringzorunlukitAwayHexstring | nullisteğe bağlıcrestobject | nullisteğe bağlıshapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
Yanıttaki data
idstring (uuid)zorunluslugstringzorunlunamestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb, lower-case
kitAwayHexstring | nullzorunlu#rrggbb, lower-case
crestobject | nullzorunlushapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
archivedAtstring (date-time) | nullzorunlucreatedAtstring (date-time)zorunlumemberCountintegerzorunluviewerobjectzorunlurolestring | nullzorunluNull for an admin who is not a member
Değerler:
"captain","co_captain","member"canEditbooleanzorunlucanRotateCodebooleanzorunlucanArchivebooleanzorunlumustHandOverbooleanzorunluThe caller is the last captain: leaving needs a new captain first
onlyMemberbooleanzorunluLeaving would archive the team
codestring | nullzorunluThe live 6-letter invite code; null once archived
inviteUrlstring (uri) | nullzorunluThe link to share (a short /j/<code> link that opens the join page)
membersobject[]zorunluCaptains first, then co-captains, then players
playerIdstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"positionsstring[]zorunluFollows the member's visibility, as on their profile: empty when it is private, unless it is your own or you are an admin
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluFollows the member's visibility, like the positions
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
rolestringzorunluDeğerler:
"captain","co_captain","member"numberinteger | nullzorunlujoinedAtstring (date-time)zorunluisViewerbooleanzorunlucanobjectzorunlurolesstring[]zorunluRoles the caller may give this member
Değerler:
"captain","co_captain","member"removebooleanzorunlu
matchesobjectzorunluUp to 5 each
upcomingobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
recentobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
A team: roster, the caller's permissions, the invite code and matches. 404 unless the caller is a member or an admin.
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunlu
Yanıttaki data
idstring (uuid)zorunluslugstringzorunlunamestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb, lower-case
kitAwayHexstring | nullzorunlu#rrggbb, lower-case
crestobject | nullzorunlushapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
archivedAtstring (date-time) | nullzorunlucreatedAtstring (date-time)zorunlumemberCountintegerzorunluviewerobjectzorunlurolestring | nullzorunluNull for an admin who is not a member
Değerler:
"captain","co_captain","member"canEditbooleanzorunlucanRotateCodebooleanzorunlucanArchivebooleanzorunlumustHandOverbooleanzorunluThe caller is the last captain: leaving needs a new captain first
onlyMemberbooleanzorunluLeaving would archive the team
codestring | nullzorunluThe live 6-letter invite code; null once archived
inviteUrlstring (uri) | nullzorunluThe link to share (a short /j/<code> link that opens the join page)
membersobject[]zorunluCaptains first, then co-captains, then players
playerIdstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"positionsstring[]zorunluFollows the member's visibility, as on their profile: empty when it is private, unless it is your own or you are an admin
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluFollows the member's visibility, like the positions
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
rolestringzorunluDeğerler:
"captain","co_captain","member"numberinteger | nullzorunlujoinedAtstring (date-time)zorunluisViewerbooleanzorunlucanobjectzorunlurolesstring[]zorunluRoles the caller may give this member
Değerler:
"captain","co_captain","member"removebooleanzorunlu
matchesobjectzorunluUp to 5 each
upcomingobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
recentobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
- PATCH
/api/ v1/ teams/ {slug} Edit name, city, kits and crest (captains and co-captains). Only the top-level fields sent change; send the whole crest to replace it. Null clears city, kitAwayHex or crest. A crest has a shape, two distinct #rrggbb colours, one Unicode letter, a pattern (default plain) and a detail (default none). Crest errors use crest.shape/primary/secondary/letter/pattern/detail; equal colours give crest.secondary=differentColour. The slug never changes.
Oturum gerekir
403 fields.form=managersOnly for members who are not captains or co-captains; 409 fields.form=archived once the team is archived.
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunlu
İstek gövdesi
namestringisteğe bağlı2–40 karakter
citystring | nullisteğe bağlıen çok 60 karakter
kitHomeHexstringisteğe bağlıkitAwayHexstring | nullisteğe bağlıcrestobject | nullisteğe bağlıshapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
Yanıttaki data
idstring (uuid)zorunluslugstringzorunlunamestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb, lower-case
kitAwayHexstring | nullzorunlu#rrggbb, lower-case
crestobject | nullzorunlushapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
archivedAtstring (date-time) | nullzorunlucreatedAtstring (date-time)zorunlumemberCountintegerzorunluviewerobjectzorunlurolestring | nullzorunluNull for an admin who is not a member
Değerler:
"captain","co_captain","member"canEditbooleanzorunlucanRotateCodebooleanzorunlucanArchivebooleanzorunlumustHandOverbooleanzorunluThe caller is the last captain: leaving needs a new captain first
onlyMemberbooleanzorunluLeaving would archive the team
codestring | nullzorunluThe live 6-letter invite code; null once archived
inviteUrlstring (uri) | nullzorunluThe link to share (a short /j/<code> link that opens the join page)
membersobject[]zorunluCaptains first, then co-captains, then players
playerIdstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"positionsstring[]zorunluFollows the member's visibility, as on their profile: empty when it is private, unless it is your own or you are an admin
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluFollows the member's visibility, like the positions
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
rolestringzorunluDeğerler:
"captain","co_captain","member"numberinteger | nullzorunlujoinedAtstring (date-time)zorunluisViewerbooleanzorunlucanobjectzorunlurolesstring[]zorunluRoles the caller may give this member
Değerler:
"captain","co_captain","member"removebooleanzorunlu
matchesobjectzorunluUp to 5 each
upcomingobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
recentobject[]zorunluidstring (uuid)zorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"titlestring | nullzorunluvenueobject | nullzorunlunamestringzorunluverifiedbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluoursbooleanzorunluThis team plays on this side
Replace the invite code (captains and co-captains); the old code stops working at once
Oturum gerekir
403 fields.form=managersOnly for members who are not captains or co-captains; 409 fields.form=archived once the team is archived.
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunlu
Yanıttaki data
codestringzorunluinviteUrlstring (uri)zorunlu
Change a member's role. Captains and co-captains manage players and co-captains; only captains make or change captains (403 fields.form=captainOnly). The last captain cannot step down (409 fields.form=lastCaptain). A player who is not (or no longer) on the team: 404 fields.form=memberGone.
Oturum gerekir
403 fields.form=managersOnly for members who are not captains or co-captains; 409 fields.form=archived once the team is archived.
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunluplayerIdstringzorunlu
İstek gövdesi
rolestringzorunluDeğerler:
"captain","co_captain","member"
Yanıttaki data
playerIdstring (uuid)zorunlurolestringzorunluDeğerler:
"captain","co_captain","member"
Remove a member (same rules as roles; 404 fields.form=memberGone when they are not on the team). Removing yourself is leaving.
Oturum gerekir
403 fields.form=managersOnly for members who are not captains or co-captains; 409 fields.form=archived once the team is archived.
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunluplayerIdstringzorunlu
Yanıttaki data
archivedbooleanzorunlu
Leave the team. The last captain must make someone else captain first (409 fields.form=handOver); the last member leaving archives the team.
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunlu
Yanıttaki data
archivedbooleanzorunluThe team is archived after this
Archive the team (captains only): it leaves everyone's list and its code stops working; matches and stats stay
Oturum gerekir
403 fields.form=captainOnly for co-captains and players.
Alanları gösterAlanları gizle
Yol parametreleri
slugstringzorunlu
Yanıttaki data
archivedAtstring (date-time)zorunlu
Davet kodları
Invites etiketi, 2 uç noktaWhat a six-letter code opens: a team or a match
Oturum gerekmez
Codes are case-insensitive; dashes and spaces are ignored. Signed out, the preview has counts but no names. The code a match had when it was cancelled, and the code a team had when it was closed, keep opening the preview (
state: cancelled,archived: true) so the link explains itself; codes replaced before that arerevoked. 404 NOT_FOUND withfields.code:invalid(not six code letters),unknownorrevoked(replaced by a newer code). 429 RATE_LIMITED after 20 wrong codes in 15 minutes (per account; signed out, per address, or in one count shared by every caller whose address cannot be trusted); malformed codes are not counted.Alanları gösterAlanları gizle
Yol parametreleri
codestringzorunlu
Yanıttaki data
kindstringzorunluDeğerler:
"team","match"codestringzorunluThe canonical code: six capital letters
teamobjectisteğe bağlıidstringzorunluslugstringzorunlunamestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb
kitAwayHexstring | nullzorunlumemberCountintegerzorunlucaptainobject | nullzorunluNull when signed out
idstringzorunludisplayNamestringzorunluhandlestring | nullzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
archivedbooleanzorunluClosed teams take no new members
viewerobjectzorunlusignedInbooleanzorunlumemberbooleanzorunlurolestring | nullzorunluDeğerler:
"captain","co_captain","member"canJoinbooleanzorunlu
matchobjectisteğe bağlıidstringzorunlukindstringzorunluDeğerler:
"fixture","pickup"statusstringzorunluDeğerler:
"planned","played","cancelled"statestringzorunluAnswers are taken while open: not cancelled, not played and no score in yet. Kick-off does not close a match, so people can still join one they played.
Değerler:
"open","cancelled","finished"titlestring | nullzorunlustartsAtstringzorunluISO 8601
durationMinintegerzorunluvenueobject | nullzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunlu
pitchobject | nullzorunlunamestringzorunluindoorbooleanzorunlu
sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunluteamobject | nullzorunluslugstringzorunlunamestringzorunlu
comingobjectzorunluYes answers per side (none: no side yet) and the number of maybes
AintegerzorunluBintegerzorunlunoneintegerzorunlutotalintegerzorunlumaybeintegerzorunlu
playersobject[]zorunluWho said yes or maybe; empty when signed out
idstringzorunludisplayNamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"yes","maybe"youbooleanzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
organizerobject | nullzorunluNull when signed out
displayNamestringzorunlu
Use a code: join the team, or answer the match invitation
Oturum gerekir
A team code makes you a member (again is a no-op:
alreadyMember); closed teams answer 409 withfields.team = archived. A match code records your answer and puts you on your team's side; cancelled matches and matches with a score answer 409 withfields.match = cancelled | finished. 404 NOT_FOUND withfields.code:invalid(not six code letters),unknownorrevoked(replaced by a newer code). 429 RATE_LIMITED after 20 wrong codes in 15 minutes (per account; signed out, per address, or in one count shared by every caller whose address cannot be trusted); malformed codes are not counted.Alanları gösterAlanları gizle
Yol parametreleri
codestringzorunlu
İstek gövdesi
rsvpstringisteğe bağlıMatch codes only; defaults to yes. Ignored for team codes.
Değerler:
"yes","maybe","no"
Yanıttaki data
kindstringzorunluDeğerler:
"team","match"teamobjectisteğe bağlıidstringzorunluslugstringzorunlunamestringzorunlu
rolestringisteğe bağlıDeğerler:
"captain","co_captain","member"alreadyMemberbooleanisteğe bağlımatchobjectisteğe bağlıidstringzorunlu
participantobjectisteğe bağlırsvpstringzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluThe side of the person's team, when they are in one
Değerler:
"A","B"respondedAtstring | nullzorunlu
Maçlar
Matches etiketi, 11 uç noktaMy matches: upcoming (soonest first) and past (latest first)
Oturum gerekir
At most 60 upcoming matches and the 40 latest past ones, with no further pages yet.
Alanları gösterAlanları gizle
Yanıttaki data
upcomingobject[]zorunluidstringzorunlutitlestring | nullzorunlukindstringzorunluDeğerler:
"pickup","fixture"statusstringzorunluDeğerler:
"planned","played","cancelled"startsAtstringzorunluISO 8601 (UTC)
durationMinnumberzorunluscoreStatestringzorunluDeğerler:
"none","entered","confirmed"venueobject | nullzorunlunamestringzorunludistrictstring | nullzorunlucitystring | nullzorunluverifiedbooleanzorunlu
pitchobject | nullzorunlunamestringzorunlu
sidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
comingnumberzorunluHow many said "yes"
meobjectzorunlursvpstring | nullzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluDeğerler:
"A","B"isOrganizerbooleanzorunlu
canRespondbooleanzorunlu
pastobject[]zorunluidstringzorunlutitlestring | nullzorunlukindstringzorunluDeğerler:
"pickup","fixture"statusstringzorunluDeğerler:
"planned","played","cancelled"startsAtstringzorunluISO 8601 (UTC)
durationMinnumberzorunluscoreStatestringzorunluDeğerler:
"none","entered","confirmed"venueobject | nullzorunlunamestringzorunludistrictstring | nullzorunlucitystring | nullzorunluverifiedbooleanzorunlu
pitchobject | nullzorunlunamestringzorunlu
sidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
comingnumberzorunluHow many said "yes"
meobjectzorunlursvpstring | nullzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluDeğerler:
"A","B"isOrganizerbooleanzorunlu
canRespondbooleanzorunlu
- POST
/api/ v1/ matches Create a match
Oturum gerekir
You come ("yes") on side A, or on B when you belong to side B's team only. Teams playing a side and invited teams get every member invited, on their team's side. 422
fieldscodes:required,invalid(also hidden or text-direction characters in the title, a side's label or the notes),staffWord(the title or a side's label reads as staff: “Akıllı Futbol”, “Admin”, “Destek”…),tooLong,notMember(a team you are not in),sameTeam,noOfficialCamera;reservationId=invalid(not your confirmed booking),unavailable(it has a match, or its time passed) ormismatch(the venue, pitch, start or length you sent differ). 429fields.form = tooManyMatches: 20 new matches a day per person.Alanları gösterAlanları gizle
İstek gövdesi
titlestring | nullisteğe bağlıUp to 60 characters
kindstringisteğe bağlıpickup (default): sides picked among friends; fixture: two teams
Değerler:
"pickup","fixture"datestringisteğe bağlıKick-off date on an Istanbul clock, YYYY-MM-DD (with
time)timestringisteğe bağlıKick-off on an Istanbul clock, HH:MM (with
date)startsAtstringisteğe bağlıInstead of date + time: an ISO 8601 instant with an offset
durationMinnumberisteğe bağlıDefault 60
Değerler:
60,90,120venueIdstring | nullisteğe bağlıpitchIdstring | nullisteğe bağlıA pitch of the venue (sets the venue when venueId is left out)
recordingstringisteğe bağlıofficial only on a pitch with an official camera
Değerler:
"upload","official"sidesobjectisteğe bağlıDefault labels "Turuncular" and "Maviler"
Aobjectzorunlulabelstringzorunlu1–30 characters, e.g. "Turuncular"
teamIdstring | nullisteğe bağlıOne of your teams playing this side; its members are invited on this side
bibHexstring | nullisteğe bağlıThe bib colour as #rrggbb, or null for no bibs
Bobjectzorunlulabelstringzorunlu1–30 characters, e.g. "Turuncular"
teamIdstring | nullisteğe bağlıOne of your teams playing this side; its members are invited on this side
bibHexstring | nullisteğe bağlıThe bib colour as #rrggbb, or null for no bibs
invitedTeamIdsstring[]isteğe bağlıYour teams whose members all get an invitation
notesstring | nullisteğe bağlıUp to 500 characters
reservationIdstringisteğe bağlıOne of your confirmed bookings (GET /api/v1/reservations) that has no match yet: the match takes its venue, pitch, start and length and is linked to it (ADR-005)
Yanıttaki data
idstringzorunlucodestringzorunluinviteUrlstring (uri)zorunluThe link to share for the code, as for teams: a short /j/<code> link that opens the join page.
A match with its sides, people, place and code
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstringzorunlutitlestring | nullzorunlukindstringzorunluDeğerler:
"pickup","fixture"statusstringzorunluDeğerler:
"planned","played","cancelled"startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunlurecordingstringzorunluDeğerler:
"upload","official"scoreStatestringzorunluDeğerler:
"none","entered","confirmed"notesstring | nullzorunlucancelledAtstring | nullzorunluorganizerobjectzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlu
venueobject | nullzorunluidstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluslugstring | nullzorunluThe venue's public booking page is /venues/<slug> while its pitch admin login is on; null otherwise
pitchobject | nullzorunluidstringzorunlunamestringzorunluindoorbooleanzorunluofficialCamerabooleanzorunlu
cameraobject | nullzorunluSet when the match waits for the pitch's official camera
idstringzorunlulabelstringzorunluofficialbooleanzorunlu
sidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
participantsobject[]zorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"respondedAtstring | nullzorunluattendedbooleanzorunluisOrganizerbooleanzorunlupositionsstring[]zorunluWhere the person likes to play, as on their profile; empty when they gave none or their visibility hides it from you, and for guests
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
teamsobject[]zorunluteamIdstringzorunlunamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"membersnumberzorunlu
codestring | nullzorunluThe live 6-letter join code; null once the match is cancelled
inviteUrlstring (uri) | nullzorunluThe link to share for the code, as for teams: a short /j/<code> link that opens the join page. Null with the code
hasVideobooleanzorunlukickedOffbooleanzorunluendedbooleanzorunluKick-off plus the duration has passed
viewerobjectzorunluplayerIdstringzorunluYour player id, to find yourself in participants
canManagebooleanzorunluisOrganizerbooleanzorunluisAdminbooleanzorunlursvpstring | nullzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluDeğerler:
"A","B"canRespondbooleanzorunlu
- PATCH
/api/ v1/ matches/ {id} Change a match (managers)
Oturum gerekir
Answers are kept. A team newly set on a side gets its members invited there, and a team moved to the other side takes its people along. Once the score is in, the details can still be corrected but a side's team cannot change (409
fields.form = scored). A match with a booking at its venue moves the booking with it: 409fields.form = bookingSlotTakenwhen the new time or pitch is not free on the venue's grid,bookingVenuewhen the match would leave the booking's venue (cancel the booking first). Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
titlestring | nullisteğe bağlıUp to 60 characters
kindstringisteğe bağlıpickup (default): sides picked among friends; fixture: two teams
Değerler:
"pickup","fixture"datestringisteğe bağlıKick-off date on an Istanbul clock, YYYY-MM-DD (with
time)timestringisteğe bağlıKick-off on an Istanbul clock, HH:MM (with
date)startsAtstringisteğe bağlıInstead of date + time: an ISO 8601 instant with an offset
durationMinnumberisteğe bağlıDefault 60
Değerler:
60,90,120venueIdstring | nullisteğe bağlıpitchIdstring | nullisteğe bağlıA pitch of the venue (sets the venue when venueId is left out)
recordingstringisteğe bağlıofficial only on a pitch with an official camera
Değerler:
"upload","official"notesstring | nullisteğe bağlıUp to 500 characters
sidesobjectisteğe bağlıOnly the fields you send change; a newly set team gets its members invited
Aobjectisteğe bağlılabelstringisteğe bağlı1–30 characters, e.g. "Turuncular"
teamIdstring | nullisteğe bağlıOne of your teams playing this side; its members are invited on this side
bibHexstring | nullisteğe bağlıThe bib colour as #rrggbb, or null for no bibs
Bobjectisteğe bağlılabelstringisteğe bağlı1–30 characters, e.g. "Turuncular"
teamIdstring | nullisteğe bağlıOne of your teams playing this side; its members are invited on this side
bibHexstring | nullisteğe bağlıThe bib colour as #rrggbb, or null for no bibs
Yanıttaki data
idstringzorunlutitlestring | nullzorunlukindstringzorunluDeğerler:
"pickup","fixture"statusstringzorunluDeğerler:
"planned","played","cancelled"startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunlurecordingstringzorunluDeğerler:
"upload","official"scoreStatestringzorunluDeğerler:
"none","entered","confirmed"notesstring | nullzorunlucancelledAtstring | nullzorunluorganizerobjectzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlu
venueobject | nullzorunluidstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluslugstring | nullzorunluThe venue's public booking page is /venues/<slug> while its pitch admin login is on; null otherwise
pitchobject | nullzorunluidstringzorunlunamestringzorunluindoorbooleanzorunluofficialCamerabooleanzorunlu
cameraobject | nullzorunluSet when the match waits for the pitch's official camera
idstringzorunlulabelstringzorunluofficialbooleanzorunlu
sidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
bibHexstring | nullzorunluteamIdstring | nullzorunluteamNamestring | nullzorunlu
participantsobject[]zorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"respondedAtstring | nullzorunluattendedbooleanzorunluisOrganizerbooleanzorunlupositionsstring[]zorunluWhere the person likes to play, as on their profile; empty when they gave none or their visibility hides it from you, and for guests
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
teamsobject[]zorunluteamIdstringzorunlunamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"membersnumberzorunlu
codestring | nullzorunluThe live 6-letter join code; null once the match is cancelled
inviteUrlstring (uri) | nullzorunluThe link to share for the code, as for teams: a short /j/<code> link that opens the join page. Null with the code
hasVideobooleanzorunlukickedOffbooleanzorunluendedbooleanzorunluKick-off plus the duration has passed
viewerobjectzorunluplayerIdstringzorunluYour player id, to find yourself in participants
canManagebooleanzorunluisOrganizerbooleanzorunluisAdminbooleanzorunlursvpstring | nullzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluDeğerler:
"A","B"canRespondbooleanzorunlu
Cancel a match (managers)
Oturum gerekir
The code stops working, and the bookings linked to the match that have not started are cancelled with it (their answer reads
@matchCancelled). 409fields.form = scoredonce the score is in. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstringzorunlustatusstringzorunluDeğerler:
"cancelled"
Renew the match's join code (managers)
Oturum gerekir
The old code stops working at once; share the new one again. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409
fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
codestringzorunlu6 letters A–Z without I and O
inviteUrlstring (uri)zorunluThe link to share for the code, as for teams: a short /j/<code> link that opens the join page.
Answer an invitation
Oturum gerekir
For invited people and members of invited teams (who join on their team's side). 409
fields.form=cancelledorscored. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
answerstringzorunluDeğerler:
"yes","maybe","no"
Yanıttaki data
rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"sidestring | nullzorunluDeğerler:
"A","B"
Invite one of your teams (managers)
Oturum gerekir
Every member not yet in the match is invited. A team playing a side is invited on that side (422
fields.side = teamPlaysSidefor the other one); otherwise members without a side, or still on the team's earlier side, takeside. 422fields.teamId = notMemberfor a team you are not in. Once the score is in, who played and on which side is changed with the score: 409fields.form = scored. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
teamIdstringzorunlusidestring | nullisteğe bağlıDeğerler:
"A","B"
Yanıttaki data
invitednumberzorunlumembersnumberzorunlu
Invite a person by username, or add a guest by name (managers)
Oturum gerekir
A guest is a player without an account, counted as coming; the name follows the same rules as a display name (422
fields.guestName=required,tooShort,tooLongorinvalid). 422fields.username = notFound; 409fields.username = already. Once the score is in, who played and on which side is changed with the score: 409fields.form = scored. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
usernamestringisteğe bağlısidestring | nullisteğe bağlıDeğerler:
"A","B"guestNamestringisteğe bağlı2–40 characters
Yanıttaki data
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"respondedAtstring | nullzorunluattendedbooleanzorunluisOrganizerbooleanzorunlupositionsstring[]zorunluWhere the person likes to play, as on their profile; empty when they gave none or their visibility hides it from you, and for guests
Değerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Move a player to a side, or answer for a guest (managers)
Oturum gerekir
403 when
rsvpis sent for a registered player (people answer for themselves); 422fields.rsvp = invalidfor any other value. Once the score is in, who played and on which side is changed with the score: 409fields.form = scored. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluplayerIdstringzorunlu
İstek gövdesi
sidestring | nullisteğe bağlıDeğerler:
"A","B"rsvpstringisteğe bağlıGuests only
Değerler:
"yes","maybe","no"
Yanıttaki data
playerIdstringzorunlusidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"
Take a player off the match (managers)
Oturum gerekir
409
fields.form=organizer(the organiser stays). Once the score is in, who played and on which side is changed with the score: 409fields.form = scored. Errors: 401 signed out; 404 the match does not exist or you are not part of it; 403 you may see it but not change it (organiser, side captains and admins manage); 409fields.form = cancelledonce cancelled; 422 withfields.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluplayerIdstringzorunlu
Yanıttaki data
playerIdstringzorunluremovedbooleanzorunluDeğerler:
true
Tesisler
Venues etiketi, 6 uç noktaSearch venues
Oturum gerekir
Verified venues first, then by name; at most 12. An empty
qlists venues the same way.Alanları gösterAlanları gizle
Sorgu parametreleri
qstringisteğe bağlıWords that must all appear in the name, district or city; Turkish letters optional ("kadikoy" finds "Kadıköy")
Yanıttaki data
Tür:
object[]Her öğenin alanları:
idstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluChecked by an admin (a partner venue); show the verified mark
pitchesobject[]zorunluidstringzorunlunamestringzorunlue.g. "1. Saha"
indoorbooleanzorunluofficialCamerabooleanzorunluThe pitch has the venue's own recorder: a match here can wait for its recording
- POST
/api/ v1/ venues Add a venue
Oturum gerekir
New venues are unverified until an admin checks them. When a venue with the same name, city and district is already listed (ignoring case and Turkish letters), that venue comes back instead of a copy. 422 with
fields(required,tooShort,tooLong,invalidfor hidden characters,staffWordwhen the name reads as staff: “Akıllı Futbol”, “Resmi”…). 429 RATE_LIMITED after 20 new venues in 24 hours (admins are not limited).Alanları gösterAlanları gizle
İstek gövdesi
namestringzorunlu2–80 characters
citystringzorunlu2–40 characters
districtstring | nullisteğe bağlıUp to 40 characters
addressstring | nullisteğe bağlıUp to 160 characters
pitchNamestring | nullisteğe bağlıA first pitch, e.g. "1. Saha"
indoorbooleanisteğe bağlıWhether that first pitch is indoors
Yanıttaki data
idstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluChecked by an admin (a partner venue); show the verified mark
pitchesobject[]zorunluidstringzorunlunamestringzorunlue.g. "1. Saha"
indoorbooleanzorunluofficialCamerabooleanzorunluThe pitch has the venue's own recorder: a match here can wait for its recording
Venues of your latest matches, then venues you added (at most five)
Oturum gerekir
Alanları gösterAlanları gizle
Yanıttaki data
Tür:
object[]Her öğenin alanları:
idstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluChecked by an admin (a partner venue); show the verified mark
pitchesobject[]zorunluidstringzorunlunamestringzorunlue.g. "1. Saha"
indoorbooleanzorunluofficialCamerabooleanzorunluThe pitch has the venue's own recorder: a match here can wait for its recording
A venue with its pitches
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluChecked by an admin (a partner venue); show the verified mark
pitchesobject[]zorunluidstringzorunlunamestringzorunlue.g. "1. Saha"
indoorbooleanzorunluofficialCamerabooleanzorunluThe pitch has the venue's own recorder: a match here can wait for its recording
Add a pitch to a venue
Oturum gerekir
Admins, or the person who added the venue while it is unverified (403 otherwise). 409
fields.name = takenfor a duplicate name.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
namestringzorunlu1–40 characters, unique within the venue
indoorbooleanisteğe bağlı
Yanıttaki data
idstringzorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunluChecked by an admin (a partner venue); show the verified mark
pitchesobject[]zorunluidstringzorunlunamestringzorunlue.g. "1. Saha"
indoorbooleanzorunluofficialCamerabooleanzorunluThe pitch has the venue's own recorder: a match here can wait for its recording
A venue's logo
Oturum gerekmez
Public, no sign-in. Take the path from the venue's
logofield rather than building it: the version names one picture for good, so the answer is cached for a year (Cache-Control: public, max-age=31536000, immutable). A replaced or removed logo's version answers 404 NOT_FOUND. A PNG, JPEG or WebP of at most 1024 pixels a side, its type read from the file's bytes when it was uploaded; sent withX-Content-Type-Options: nosniff,Content-Security-Policy: default-src 'none'andCross-Origin-Resource-Policy: same-site.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluversionstringzorunlu
Rezervasyon
Bookings etiketi, 5 uç noktaA venue's public page
Oturum gerekmez
Works signed out. 404 unless the venue has a login that is switched on (only those venues have a page).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstringzorunluslugstringzorunluThe page's address: /venues/<slug>
namestringzorunluverifiedbooleanzorunluChecked by an admin; show the verified mark
districtstring | nullzorunlucitystring | nullzorunluaddressstring | nullzorunludescriptionstring | nullzorunluPlain text, line breaks kept
logostring | nullzorunluA path to the logo (immutable, cache it), or null
directionsobjectzorunluDriving directions: to the coordinates when known, else a search for the name and address
googlestring (uri)zorunluapplestring (uri)zorunlu
whatsappobject | nullzorunluOnly when the venue shows it
digitsstringzorunluInternational, without +
linkstring (uri)zorunluhttps://wa.me/<digits>
reservationsEnabledbooleanzorunluThe venue takes requests in the app; otherwise point people to WhatsApp
autoConfirmbooleanzorunluRequests from people who already had a booking confirmed here are confirmed at once, while they hold fewer than 2 coming bookings and requests here
slotMinutesnumberzorunluStart times every 30 or 60 minutes from opening
Değerler:
30,60openingHoursobjectzorunluIstanbul clock; null: closed
monobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
tueobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
wedobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
thuobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
friobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
satobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
sunobject | nullzorunluopenstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
todaystringzorunluThe venue day open now (YYYY-MM-DD): the first day to offer. A venue day is named by the date it opens: Friday 10:00–02:00 holds Saturday 01:00
pitchesobject[]zorunluidstringzorunlunamestringzorunluindoorbooleanzorunlu
Free times on a venue day, per pitch
Oturum gerekmez
States only, never who or why: confirmed bookings and blocked time make a time
taken; requests the venue has not answered make itrequested(still askable). With a bearer token the lead time is the person's own. 422fields.date = outOfRange.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Sorgu parametreleri
datestringisteğe bağlıThe venue day, YYYY-MM-DD (default: the venue day open now); from yesterday up to 31 days ahead
durationMinstringisteğe bağlı60 (default), 90 or 120
Yanıttaki data
datestringzorunludurationMinnumberzorunluslotMinutesnumberzorunluhoursobject | nullzorunluThat venue day's hours; null when closed
openstringzorunlu"10:00"
closestringzorunlu"01:00"; at or before
openmeans after midnight
leadMinutesnumberzorunluHow long before its start a time can still be asked for: 150 minutes, or 30 for someone the venue confirms at once
pitchesobject[]zorunluidstringzorunlunamestringzorunluslotsobject[]zorunlutimestringzorunluIstanbul wall clock, "21:00"
datestringzorunluThe calendar date the time falls on (the next date after midnight)
startsAtstringzorunluISO 8601 (UTC)
nextDaybooleanzorunluAfter the venue day's midnight: show it as "Friday night 01:00 (Saturday 9 November)"
statestringzorunlurequested: someone asked and the venue has not answered; it can still be asked for
Değerler:
"free","requested","taken","soon","tooFar"
Ask a venue for a booking
Oturum gerekir
The booking waits for the venue (
pending) and lapses 2 hours before its start if not answered; it isconfirmedat once where the venue auto-confirms and you already had a booking confirmed there. 404 for a venue without a page (no login, or switched off). 409fields.form:bookingsOff(the venue takes no requests now; use its WhatsApp),alreadyAsked,tooManyOpen(2 requests already waiting at this venue);fields.time = taken. 422fields:pitchId.invalid,teamId.notMember,phone.invalid,matchId(invalid,booked,otherTime,otherPlace),time(closed,offGrid,soon,tooFar). 429 RATE_LIMITED after 6 requests in an hour (refused requests do not count).Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
pitchIdstringzorunludatestringzorunluThe venue day, YYYY-MM-DD
timestringzorunluOne of that day's start times (a slot's
time), HH:MMdurationMinnumberzorunluDeğerler:
60,90,120teamIdstring | nullisteğe bağlıOne of your teams: side A of the match made on confirmation
notestring | nullisteğe bağlıUp to 300 characters, for the venue
phonestring | nullisteğe bağlıShared with this venue only and erased 30 days after the start (or when the booking is declined, cancelled or lapses). "0532 123 45 67", "+90…"
wantsMatchbooleanisteğe bağlıDefault true: when the venue confirms, your match is made (this venue, pitch and time, your team on side A) and linked
matchIdstring | nullisteğe bağlıInstead: one of your own matches at exactly this time with no booking yet, to link
Yanıttaki data
idstringzorunluvenueobjectzorunluidstringzorunlunamestringzorunluverifiedbooleanzorunluslugstring | nullzorunluNull once the venue's page is gone
pitchobjectzorunluidstringzorunlunamestringzorunlu
startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunluvenueDatestringzorunluThe venue day it belongs to
nextDaybooleanzorunlustatusstringzorunlulapsed: the venue did not answer by 2 hours before the start
Değerler:
"pending","confirmed","declined","cancelled","lapsed"answerstring | nullzorunluThe venue's words, or the app's own answer: "@taken" (another booking got the time), "@blocked" (the venue closed it), "@loginOff" (the venue stopped taking bookings), "@matchCancelled" (the match it was made for was called off)
cancelledBystring | nullzorunluDeğerler:
"person","venue"teamobject | nullzorunluidstringzorunlunamestringzorunlu
matchobject | nullzorunluThe match made from (or linked to) the booking, while it is not cancelled
idstringzorunlu
wantsMatchbooleanzorunlucanCancelbooleanzorunlucanMakeMatchbooleanzorunluConfirmed, not started and without a match: POST /api/v1/matches with its time, place and
reservationId
Your bookings
Oturum gerekir
upcoming: coming bookings whatever their answer (until they start; a confirmed one until it ends), soonest first.past: those of the last 30 days, latest first.Alanları gösterAlanları gizle
Yanıttaki data
upcomingobject[]zorunluidstringzorunluvenueobjectzorunluidstringzorunlunamestringzorunluverifiedbooleanzorunluslugstring | nullzorunluNull once the venue's page is gone
pitchobjectzorunluidstringzorunlunamestringzorunlu
startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunluvenueDatestringzorunluThe venue day it belongs to
nextDaybooleanzorunlustatusstringzorunlulapsed: the venue did not answer by 2 hours before the start
Değerler:
"pending","confirmed","declined","cancelled","lapsed"answerstring | nullzorunluThe venue's words, or the app's own answer: "@taken" (another booking got the time), "@blocked" (the venue closed it), "@loginOff" (the venue stopped taking bookings), "@matchCancelled" (the match it was made for was called off)
cancelledBystring | nullzorunluDeğerler:
"person","venue"teamobject | nullzorunluidstringzorunlunamestringzorunlu
matchobject | nullzorunluThe match made from (or linked to) the booking, while it is not cancelled
idstringzorunlu
wantsMatchbooleanzorunlucanCancelbooleanzorunlucanMakeMatchbooleanzorunluConfirmed, not started and without a match: POST /api/v1/matches with its time, place and
reservationId
pastobject[]zorunluidstringzorunluvenueobjectzorunluidstringzorunlunamestringzorunluverifiedbooleanzorunluslugstring | nullzorunluNull once the venue's page is gone
pitchobjectzorunluidstringzorunlunamestringzorunlu
startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunluvenueDatestringzorunluThe venue day it belongs to
nextDaybooleanzorunlustatusstringzorunlulapsed: the venue did not answer by 2 hours before the start
Değerler:
"pending","confirmed","declined","cancelled","lapsed"answerstring | nullzorunluThe venue's words, or the app's own answer: "@taken" (another booking got the time), "@blocked" (the venue closed it), "@loginOff" (the venue stopped taking bookings), "@matchCancelled" (the match it was made for was called off)
cancelledBystring | nullzorunluDeğerler:
"person","venue"teamobject | nullzorunluidstringzorunlunamestringzorunlu
matchobject | nullzorunluThe match made from (or linked to) the booking, while it is not cancelled
idstringzorunlu
wantsMatchbooleanzorunlucanCancelbooleanzorunlucanMakeMatchbooleanzorunluConfirmed, not started and without a match: POST /api/v1/matches with its time, place and
reservationId
Cancel one of your bookings
Oturum gerekir
Waiting or confirmed, before it starts; the time is free again. 404 for someone else's booking; 409
fields.form:notActive,started.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstringzorunluvenueobjectzorunluidstringzorunlunamestringzorunluverifiedbooleanzorunluslugstring | nullzorunluNull once the venue's page is gone
pitchobjectzorunluidstringzorunlunamestringzorunlu
startsAtstringzorunluendsAtstringzorunludurationMinnumberzorunluvenueDatestringzorunluThe venue day it belongs to
nextDaybooleanzorunlustatusstringzorunlulapsed: the venue did not answer by 2 hours before the start
Değerler:
"pending","confirmed","declined","cancelled","lapsed"answerstring | nullzorunluThe venue's words, or the app's own answer: "@taken" (another booking got the time), "@blocked" (the venue closed it), "@loginOff" (the venue stopped taking bookings), "@matchCancelled" (the match it was made for was called off)
cancelledBystring | nullzorunluDeğerler:
"person","venue"teamobject | nullzorunluidstringzorunlunamestringzorunlu
matchobject | nullzorunluThe match made from (or linked to) the booking, while it is not cancelled
idstringzorunlu
wantsMatchbooleanzorunlucanCancelbooleanzorunlucanMakeMatchbooleanzorunluConfirmed, not started and without a match: POST /api/v1/matches with its time, place and
reservationId
Skor
Score etiketi, 5 uç noktaThe score card: goals, who played and the reported scorers
Oturum gerekir
For everyone who can see the match. Errors: 401 signed out; 404 the match does not exist or you are not part of it.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"scoreStatestringzorunluDeğerler:
"none","entered","confirmed"recordingstringzorunluofficial: the pitch's camera records the match; nobody needs to upload
Değerler:
"upload","official"startsAtstringzorunluISO 8601 (UTC)
kickedOffbooleanzorunlusidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
ownGoalsobjectzorunluPer side, how many of that side's goals the other side put into its own net. They count for nobody's goals (profiles and stats count reported scorers only). Null when not given, and until the score is entered
Anumber | nullzorunluBnumber | nullzorunlu
peopleobject[]zorunluEveryone in the match, by name
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"attendedbooleanzorunluPlayed in the match
goalsReportednumber | nullzorunluSelf-reported goals; null when not reported
isOrganizerbooleanzorunlumarkablebooleanzorunluYou may mark them as played now: guests, people who said yes or maybe or played already, members of a team in the match, and people who share a team or a match with you (a public profile alone does not count). Always false when you cannot enter the score
photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
scorersobjectzorunluWhether each side's scorers were reported: a player of the side has a count, or its own goals were given
AbooleanzorunluBbooleanzorunlu
hasVideobooleanzorunlulastChangeobject | nullzorunluatstringzorunlubystring | nullzorunluWho saved it; null for the Akıllı Futbol team
editedbooleanzorunluA correction rather than the first entry
versionstring | nullzorunluIdentifies the last save (null before the first); send it back as
basedOnwith PUTviewerobjectzorunluplayerIdstringzorunluisAdminbooleanzorunlucanManagebooleanzorunluOrganiser, side captains and admins
canEditbooleanzorunluMay enter or correct the score now
blockedBystring | nullzorunluWhy a manager cannot enter the score now
Değerler:
"cancelled","beforeKickoff"attendedbooleanzorunlucanUploadbooleanzorunluMay upload the match video
Enter or correct the score and who played (managers)
Oturum gerekir
The organiser, the side captains and admins; from kick-off (admins at any time), never for a cancelled match. One transaction writes the goals and own goals, marks the match played, sets everyone's attendance and side (people not listed did not play) and adds new guests and players. The first save is audited as
score.set, corrections asscore.editwith before and after (goals, own goals and who played). Man-of-the-match votes from or for someone who no longer played are dropped. Reported goals are optional per side. When any player of a side has a count or the side'sownGoalsis given, the side's counts plus its own goals must add up to its goals (the players without a count are stored as 0). Example: 3–2 where one of A's goals was an own goal by B:ownGoals: { A: 1 }and A's players' counts add up to 2. Playing a match opens a teammates-only profile to the others who played, so only people withmarkabletrue (or a username GET …/score/lookup accepts) can be marked as played; anyone else answers yes themselves before the score is in, or comes as a guest. Each username counts against the same limit as the lookups (60 per 10 minutes). 403 for people who may see the match but not manage it. 409fields.form=cancelled,beforeKickofforchanged(someone saved since yourbasedOn). 422fields:scorers.A/scorers.B=mismatch(the side's counts plus own goals do not add up to its goals, own goals beyond its goals included);attendance.N=invalid(not exactly one of playerId, username, guestName);attendance.N.playerId=invalid(not an id),notInMatch,duplicateornotConnected;attendance.N.username=notFound,duplicateornotConnected;attendance.N.guestName=required,tooShort,tooLongorinvalid;goals.A,goals.B,ownGoals.A,ownGoals.B,attendance.N.goals=invalid(0–99);ownGoals=invalid(not an object);basedOn=invalid. 429 too many usernames. Errors: 401 signed out; 404 the match does not exist or you are not part of it.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
goalsobjectzorunluAintegerzorunlu0 ile 99 arası
Bintegerzorunlu0 ile 99 arası
ownGoalsobject | nullisteğe bağlıPer side, how many of that side's goals the other side put into its own net. They count for nobody's goals (profiles and stats count reported scorers only). Leave a side out (or null) when not given; 0 is given and checks the side's scorers like a count does
Ainteger | nullisteğe bağlı0 ile 99 arası
Binteger | nullisteğe bağlı0 ile 99 arası
attendanceobject[]zorunluEveryone who played, each with exactly one of playerId, username or guestName. Anyone in the match who is not listed did not play
playerIdstringisteğe bağlıSomeone already in the match (see
people)usernamestringisteğe bağlıA registered player by username; joins the match if not in it yet
guestNamestringisteğe bağlıSomeone without an account: a new guest player, 2–40 characters
sidestringzorunluDeğerler:
"A","B"goalsinteger | nullisteğe bağlıSelf-reported goals; leave out (or null) when not reported
0 ile 99 arası
basedOnstring | nullisteğe bağlıThe card's
versionyou started from (null for a new score). When sent, the save is refused with 409changedif someone saved the score since; leave it out to save regardless
Yanıttaki data
matchIdstringzorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"scoreStatestringzorunluDeğerler:
"none","entered","confirmed"recordingstringzorunluofficial: the pitch's camera records the match; nobody needs to upload
Değerler:
"upload","official"startsAtstringzorunluISO 8601 (UTC)
kickedOffbooleanzorunlusidesobjectzorunluAobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
BobjectzorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsnumber | nullzorunluNull until the score is entered
ownGoalsobjectzorunluPer side, how many of that side's goals the other side put into its own net. They count for nobody's goals (profiles and stats count reported scorers only). Null when not given, and until the score is entered
Anumber | nullzorunluBnumber | nullzorunlu
peopleobject[]zorunluEveryone in the match, by name
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"rsvpstringzorunluDeğerler:
"invited","yes","maybe","no"attendedbooleanzorunluPlayed in the match
goalsReportednumber | nullzorunluSelf-reported goals; null when not reported
isOrganizerbooleanzorunlumarkablebooleanzorunluYou may mark them as played now: guests, people who said yes or maybe or played already, members of a team in the match, and people who share a team or a match with you (a public profile alone does not count). Always false when you cannot enter the score
photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
scorersobjectzorunluWhether each side's scorers were reported: a player of the side has a count, or its own goals were given
AbooleanzorunluBbooleanzorunlu
hasVideobooleanzorunlulastChangeobject | nullzorunluatstringzorunlubystring | nullzorunluWho saved it; null for the Akıllı Futbol team
editedbooleanzorunluA correction rather than the first entry
versionstring | nullzorunluIdentifies the last save (null before the first); send it back as
basedOnwith PUTviewerobjectzorunluplayerIdstringzorunluisAdminbooleanzorunlucanManagebooleanzorunluOrganiser, side captains and admins
canEditbooleanzorunluMay enter or correct the score now
blockedBystring | nullzorunluWhy a manager cannot enter the score now
Değerler:
"cancelled","beforeKickoff"attendedbooleanzorunlucanUploadbooleanzorunluMay upload the match video
Look up a registered player by username, before adding them to the score card (managers)
Oturum gerekir
What the score page asks before it lists someone as played: who the username belongs to, and whether they are in the match already and on which side. Managers only, while the score can be entered (from kick-off; admins at any time; never for a cancelled match). Each lookup counts against the limit of 60 per 10 minutes shared with the usernames sent with PUT. 403 for people who may see the match but not manage it. 409
fields.form=cancelledorbeforeKickoff. 422fields.username=required,tooLong,notFound(no registered player has it) ornotConnected(they have not said they are coming and you share no team or match: they answer yes themselves first, or come as a guest). 429 too many lookups. Errors: 401 signed out; 404 the match does not exist or you are not part of it.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Sorgu parametreleri
usernamestringzorunluAs typed: a leading @, surrounding spaces and letter case do not matter
Yanıttaki data
playerIdstringzorunludisplayNamestringzorunluhandlestringzorunluinMatchbooleanzorunluAlready in the match (invited, answered or played): send their playerId or username with PUT
sidestring | nullzorunluTheir side in the match, when they have one
Değerler:
"A","B"
Man of the match: the tally, the leader and your vote
Oturum gerekir
Votes are anonymous: you see the counts and your own vote. Errors: 401 signed out; 404 the match does not exist or you are not part of it.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunluavailablebooleanzorunluThe score is in and the match was not cancelled
openbooleanzorunluVotes can be cast or changed now
closesAtstringzorunluKick-off plus 7 days (ISO 8601)
totalVotesnumberzorunlucandidatesobject[]zorunluEveryone who played: most votes first, then by name
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlukindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
leadersobject[]zorunluThe most voted; several on a tie, none before the first vote
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlukindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
viewerobjectzorunluplayerIdstringzorunluattendedbooleanzorunlucanVotebooleanzorunluvotestring | nullzorunluThe playerId you voted for
Vote for the man of the match (people who played)
Oturum gerekir
One vote each; voting again changes it. Open once the score is in, until 7 days after kick-off. 403
fields.form = notAttendedwhen you did not play. 409fields.form=noScore,closedorcancelled. 422fields.playerId=selfornotAttended. Errors: 401 signed out; 404 the match does not exist or you are not part of it.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
playerIdstringzorunluSomeone else who played
Yanıttaki data
matchIdstringzorunluavailablebooleanzorunluThe score is in and the match was not cancelled
openbooleanzorunluVotes can be cast or changed now
closesAtstringzorunluKick-off plus 7 days (ISO 8601)
totalVotesnumberzorunlucandidatesobject[]zorunluEveryone who played: most votes first, then by name
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlukindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
leadersobject[]zorunluThe most voted; several on a tie, none before the first vote
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlukindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
viewerobjectzorunluplayerIdstringzorunluattendedbooleanzorunlucanVotebooleanzorunluvotestring | nullzorunluThe playerId you voted for
Video
13 uç noktaStart or resume the match video upload
Oturum gerekir
The video goes straight to the bucket in parts; no bytes pass through this API. 1. POST here with the file's name, size, type and fingerprint (name:size:lastModified). 2. POST …/parts with the part numbers still missing (at most 100 per call) and PUT each 64 MiB slice of the file to its URL; keep the ETag response header. Each link is signed for its part's exact length (the last part holds the rest), so send exactly that slice. Retry failed parts; sign again when the links expire. 3. POST …/complete with every { partNumber, etag }. The analysis starts (status INGESTING). To resume after the app restarts, POST here again with the same fingerprint: the same upload comes back with
uploadedParts. Errors: 404 NOT_FOUND for people outside the match (as if it did not exist); 409 CONFLICT with fields.form scoreFirst (enter the score first), matchCancelled or venueDelivering (the venue is sending the recording); 403 FORBIDDEN with fields.form uploadNotAllowed (only people who played), officialRecording (the venue or an admin delivers the official recording) or replaceNotAllowed (the match has a video; only the organiser, side captains and admins replace it); 422 INVALID with fields.size tooLarge (over 8 GiB), fields.contentType notVideo, or fields.fileName notVideo (an extension other than a video container's, such as .m3u8).Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
fileNamestringzorunluThe picked file's name, e.g. mac.mp4. An extension other than a video container's (such as .m3u8) is refused
1–255 karakter
sizeintegerzorunluBytes; at most 8 GiB
contentTypestringzorunluThe file's MIME type; must be video/*
fingerprintstringzorunluname:size:lastModified of the file. Starting again with the same fingerprint resumes the unfinished upload
1–512 karakter
Yanıttaki data
uploadIdstringzorunlukeystringzorunluThe object key in the bucket
partSizenumberzorunluBytes per part (64 MiB); the last part holds the rest
partCountnumberzorunluuploadedPartsobject[]zorunluParts the bucket already has (after a resume): upload only the others
partNumbernumberzorunluetagstringzorunlusizenumberzorunlu
resumedbooleanzorunluTrue when this continues an unfinished upload of the same file
Cancel an unfinished upload
Oturum gerekir
Only the person who started it. Drops its parts from the bucket, or its file when a completion had finished it. 409 uploadCompleted once it is complete. 403 fields.form notYourUpload for anyone but the person who started the upload (and admins).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
Yanıttaki data
uploadIdstringzorunlustatusstringzorunluDeğerler:
"aborted","failed"
Presigned URLs for upload parts
Oturum gerekir
Links are valid for an hour and accept exactly their part's bytes. 409 uploadClosed when the upload was cancelled or completed. The upload rules are checked again, so a cancelled match (409 matchCancelled) or someone else's video landing first (403 replaceNotAllowed) stops the upload: cancel it with DELETE. 403 fields.form notYourUpload for anyone but the person who started the upload (and admins).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
İstek gövdesi
partNumbersinteger[]zorunlu1-based part numbers, at most 100 per call
Yanıttaki data
partsobject[]zorunlupartNumbernumberzorunluurlstringzorunluPUT the part's bytes here, then read the ETag response header
expiresAtstringzorunluISO time; sign again after it
Finish the upload and start the analysis
Oturum gerekir
Checks the parts and the stored size, then creates the video, the analysis and its first job in one step. Calling it again returns the same result. 409 with fields.form partsMissing, partMismatch or sizeMismatch: upload the missing parts (resume) and complete again. 403 replaceNotAllowed when someone else's video became the match's first: this upload is then closed and its file deleted. 403 fields.form notYourUpload for anyone but the person who started the upload (and admins).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
İstek gövdesi
partsobject[]zorunlupartNumberintegerzorunlu1 ile 10000 arası
etagstringzorunluThe ETag header of the part's PUT response
1–200 karakter
Yanıttaki data
uploadIdstringzorunluvideoAssetIdstring | nullzorunluanalysisIdstring | nullzorunlustatusstring | nullzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"replacedbooleanzorunluTrue when this video replaced the match's previous one and its analysis; the previous video's files are deleted, and links issued for it stop working
The match's video and analysis status
Oturum gerekir
For anyone involved in the match (404 for everyone else). Stages: INGESTING → NEEDS_PREP (managers mark the pitch) → TRACKING → NEEDS_LABELS (who is who) → COMPUTING → PUBLISHED, or FAILED. Poll every few seconds while the status is INGESTING, TRACKING or COMPUTING.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Sorgu parametreleri
uploadedBytesbooleanisteğe bağlıtrue to fill pendingUpload.uploadedBytes (how much of your unfinished upload the bucket holds). It asks the bucket, so leave it out when polling the analysis
Yanıttaki data
matchIdstringzorunlumatchStatusstringzorunluDeğerler:
"planned","played","cancelled"scoreStatestringzorunluUploads open once the score is entered
Değerler:
"none","entered","confirmed"recordingstringzorunluofficial: the pitch's camera records the match and the venue (or an admin) delivers the video
Değerler:
"upload","official"analysisobject | nullzorunluidstringzorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"progressnumberzorunlu0..1 within the current stage
errorstring | nullzorunlufailedStagestring | nullzorunluThe stage that failed, when status is FAILED
Değerler:
"ingest","track","stats"updatedAtstringzorunlu
videoobject | nullzorunluidstringzorunlureadybooleanzorunluThe playable copy exists: GET /video gives a link
fileNamestringzorunlusizeBytesnumberzorunluuploadedBystringzorunluThe person who uploaded it, or the venue that delivered it (byVenue)
byVenuebooleanzorunluThe venue delivered it from its pitch admin panel (ADR-005)
uploadedAtstring | nullzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
pendingUploadobject | nullzorunluThe caller's own unfinished upload; start again with the same fingerprint to resume it
uploadIdstringzorunlufileNamestringzorunlusizeBytesnumberzorunlufingerprintstringzorunlustartedAtstringzorunluuploadedBytesnumber | nullzorunluBytes the bucket holds; null unless asked with ?uploadedBytes=true (or when the bucket no longer knows the upload)
venueDeliveryobject | nullzorunluThe venue's part in this match's recording, when it has a pitch admin panel
venueNamestringzorunlustatestringzorunludelivering: the venue is uploading the recording now; possible: its official camera records this pitch and it can send the recording
Değerler:
"delivering","possible"
canobjectzorunluuploadbooleanzorunluMay start the first upload now
replacebooleanzorunluMay upload a new video over the existing one
managebooleanzorunluOrganiser, side captains and admins: prep, labels, retry
watchbooleanzorunlurejectbooleanzorunluManagers may send back a recording the venue delivered ("Bu bizim maçımız değil") until labelling starts: POST …/video/reject
Retry the failed stage
Oturum gerekir
Organiser, side captains and admins (403 retryNotAllowed for other people in the match, 404 outside it). The job's payload is rebuilt from the analysis, never copied from the failed job. 409 notFailed unless the status is FAILED; 409 alreadyQueued.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
analysisIdstringzorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"kindstringzorunluDeğerler:
"ingest","track","stats"
A link to watch the match video
Oturum gerekir
For people who attended and managers (403 watchNotAllowed for other people in the match, 404 outside it); 404 notReady until the playable copy exists. Every link issued is written to the audit log.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
urlstringzorunluA presigned GET link to the 720p copy, valid for 2 hours; supports range requests
expiresAtstringzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
Send back a recording the venue delivered
Oturum gerekir
"Bu bizim maçımız değil" (ADR-005): for the organiser, side captains and admins (403 rejectNotAllowed for other people in the match, 404 outside it), until labelling starts. The video, its analysis and files are deleted, and the match waits for the venue's recording again. Audited as video.reject. 409 with fields.form noVideo, notVenueDelivery (people uploaded it) or labellingStarted.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunluanalysisIdstringzorunluuploadIdstringzorunlu
Who is who on the video, and the goals
Oturum gerekir
For people who attended and the organiser, side captains and admins (403 watchNotAllowed for others in the match, 404 for everyone else). Never cached: labels and goal decisions change it. A new processing run may reuse numeric track ids. Match this response's generation to the replay or camera metadata, and request files with ?generation=<generation>. A 409 replayChanged means reload both names and metadata before drawing new positions. Draw it with the layer files (GET /layer/index.json, then /layer/chunk_<n>.json, see the Kim kim? tag): each box
[trackId, x0, y0, x1, y1]is in the index's width × height pixels, so scale it to the displayed video (with its letterboxing). A foot marker goes at the box's bottom centre in the side's colour (orange for A, blue for B), withtracks[trackId].nameabove it once labelled; goalkeepers (keeper, or the index'skeepers) get a marker of their own. The ball is a frame'sb([x, y, 1 when estimated]);o(or the index's possessionspells) is who has it. The index'spassesgo from passer to receiver between theirstartandendframes (completedfalse: the ball was lost; null: not known, one of the two teams is unknown). The frame on screen is round(mediaTime × fps). Show each confirmed goal's banner for a few seconds from its frame.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunluanalysisIdstring | nullzorunlugenerationstring | nullzorunluCommitted tracking run; must match replay/camera metadata. Pass it as the generation query to layer files, and reload names plus metadata on 409 replayChanged
statusstring | nullzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"readybooleanzorunluCommitted tracking exists (including the previous saved result during a rerun); false before the first result
fpsnumber | nullzorunluThe video's frame rate: the frame on screen is round(mediaTime × fps)
durationSnumber | nullzorunlukickoffSnumberzorunluKick-off in seconds into the video; minutes count from it
sidesobjectzorunluThe sides' labels
AstringzorunluBstringzorunlu
finalScoreobjectzorunluThe score entered after the match; null per side before it is entered
Anumber | nullzorunluBnumber | nullzorunlu
canobjectzorunlumanagebooleanzorunluOrganiser, side captains and admins: they also get the candidates
tracksmap<string, object>zorunluTrack id of the layer (the tracklet's ordinal) -> who it is. Tracks with nothing known are left out: draw them without a side
playersmap<string, object>zorunluPlayer id -> full and short name and side in the match, for the players the tracks name
hiddennumber[]zorunluTrack ids labelled not a player (referees, spectators): leave them out
goalsobject[]zorunluConfirmed goals in video order: show a banner at each and mark them on the timeline
idstringzorunluatSnumberzorunluSeconds into the match video
framenumber | nullzorunluThe proxy's frame: frame = round(mediaTime × fps)
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"ownGoalbooleanzorunluscorerobject | nullzorunluWho scored; for an own goal the opponent who put it in; null when nobody was listed on that side
playerIdstringzorunlunamestringzorunlu
assistobject | nullzorunluplayerIdstringzorunlunamestringzorunlu
scoreobjectzorunluThe score right after this goal
AnumberzorunluBnumberzorunlu
candidatesobject[]zorunluFor managers: goals the analysis found that wait for "Bu gol mü?" (POST /goals/{goalId}); empty for everyone else
idstringzorunluatSnumberzorunluframenumber | nullzorunluminutenumberzorunlu
Saved top-down replay and camera recordings
Oturum gerekir
For people who attended and match managers; 403 watchNotAllowed for other people in the match, 404 outside it. Playback reads saved results and never starts processing. index is null and ready false until the worker has committed a replay. Camera ids are recording ids within this analysis. Names are read separately from GET /overlay, which applies player visibility. Coordinates are pitch metres in the calibration's fixed orientation, never mirrored at half-time.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstring (uuid)zorunluanalysisIdstring (uuid) | nullzorunlugenerationstring | nullzorunludemoAliasesbooleanzorunlureadybooleanzorunluindexobject | nullzorunluversionnumberzorunluDeğerler:
1fpsnumberzorunlustrideintegerzorunlustart_frameintegerzorunluen az 0
end_frameintegerzorunluen az 0
chunk_framesintegerzorunluchunksinteger[]zorunlupitchobjectzorunlulength_mnumberzorunluwidth_mnumberzorunlumeasuredbooleanzorunlu
camerasobject[]zorunlugenerationstring | nullzorunluidstring (uuid)zorunluordinalintegerzorunlulabelstringzorunluoffsetSnumberzorunluMaster time = camera video time + offsetS; camera layer frames use this camera's fps
fpsnumber | nullzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlureadybooleanzorunluThe playable video exists
layerReadybooleanzorunluThe camera's saved position layer exists
calibrationQualitystring | nullzorunluDeğerler:
"GOOD","WEAK"calibrationRmsPxnumber | nullzorunlu
A saved top-down replay file
Oturum gerekir
For people who attended and match managers; 403 watchNotAllowed for other people in the match, 404 outside it. Playback reads saved results and never starts processing. name is index.json or chunk_<n>.json from index.chunks. Master frames use index.fps; p entries are [globalTrackOrdinal,xMetres,yMetres], b is [xMetres,yMetres,interpolated0or1] when seen. Missing observations stay missing. Use /overlay for current names and hidden track ids. Private ETag revalidation; 404 notReady for missing files. A missing or stale generation returns 409 replayChanged: refresh metadata and identity mapping together.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlunamestringzorunlu
Sorgu parametreleri
generationstringzorunluCommitted run from GET /replay; must match /overlay.generation before drawing names
Watch one synchronized camera recording
Oturum gerekir
For people who attended and match managers; 403 watchNotAllowed for other people in the match, 404 outside it. Playback reads saved results and never starts processing. Returns a two-hour presigned link and records its issue in the audit log. 404 when the camera is not part of this match's analysis.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlucameraIdstringzorunlu
Yanıttaki data
urlstring (uri)zorunluexpiresAtstringzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
One camera's saved position layer
Oturum gerekir
For people who attended and match managers; 403 watchNotAllowed for other people in the match, 404 outside it. Playback reads saved results and never starts processing. name is index.json or chunk_<n>.json. Uses the LayerIndex/LayerChunk format and camera-local frames, but track ids are the analysis's global ordinals, shared with /overlay and /replay. Private ETag revalidation.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlucameraIdstringzorunlunamestringzorunlu
Sorgu parametreleri
generationstringzorunluCommitted run from the camera metadata; stale/missing returns 409 replayChanged
Saha işaretleme
Prep etiketi, 2 uç noktaWhat marking the pitch needs
Oturum gerekir
For the organiser, side captains and admins (403 FORBIDDEN with fields.form prepNotAllowed for other people in the match, 404 outside it). Every call issues new links and writes them to the audit log. Landmark ids: corner_0_0 (top-left on the frame), corner_L_0, corner_L_W, corner_0_W, halfway_0, halfway_W, centre_spot, goal_0_post_a/b, goal_L_post_a/b, and with a penalty area box_0_* and box_L_*. x = 0 is the left goal, y = 0 the far touchline. With
prefill.sourcecamera andprefill.qualityGOOD or WEAK, show the camera's lines over the new frame and ask whether they still fit: if so, POST the prefilled clicks and lambda as they are (one tap). Links are issued only while the pitch can be marked (can.saveorcan.redo); otherwiseimageandvideoare null.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunlumatchCancelledbooleanzorunluanalysisobject | nullzorunluidstringzorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"updatedAtstringzorunlu
readybooleanzorunluThe median frame exists, so the pitch can be marked
imageobject | nullzorunluThe empty-pitch frame clicks are made on; click coordinates are its pixels
urlstringzorunluA presigned GET link to median.jpg, valid for 2 hours
widthnumberzorunluheightnumberzorunluexpiresAtstringzorunlu
videoobject | nullzorunluFor finding kick-off, half-time and the end
urlstringzorunluA presigned GET link to the 720p copy (range requests work)
durationSnumber | nullzorunlufpsnumber | nullzorunluexpiresAtstringzorunlu
pitchobjectzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlumeasuredbooleanzorunlupenaltyAreaobject | nullzorunluwidthMnumberzorunludepthMnumberzorunlu
sourcestringzorunluWhere the sizes come from: this match's saved prep, the venue's pitch, the camera's last calibration, or 40 x 25 m defaults
Değerler:
"analysis","pitch","camera","default"pitchNamestring | nullzorunlu
landmarksobject[]zorunluidstringzorunluDeğerler:
"corner_0_0","corner_L_0","corner_L_W","corner_0_W","halfway_0","halfway_W","centre_spot","goal_0_post_a","goal_0_post_b","goal_L_post_a","goal_L_post_b","box_0_line_a","box_0_front_a","box_0_front_b","box_0_line_b","box_L_line_a","box_L_front_a","box_L_front_b","box_L_line_b"pitchany[]zorunluMetres: x along the length from the left goal, y across from the far touchline
cameraobject | nullzorunluThe camera a save writes to; null until a pitch without one gets its first
idstringzorunlulabelstringzorunluofficialbooleanzorunlu
prefillobject | nullzorunluClicks to start from; none from a camera calibrated on a video of another shape
sourcestringzorunlu"analysis": this match was marked already; "camera": the camera's last calibration, so ask whether the lines still fit
Değerler:
"analysis","camera"calibrationIdstringzorunluclicksobject[]zorunluidstringzorunluDeğerler:
"corner_0_0","corner_L_0","corner_L_W","corner_0_W","halfway_0","halfway_W","centre_spot","goal_0_post_a","goal_0_post_b","goal_L_post_a","goal_L_post_b","box_0_line_a","box_0_front_a","box_0_front_b","box_0_line_b","box_L_line_a","box_L_front_a","box_L_front_b","box_L_line_b"imageany[]zorunlu
lambdanumberzorunlurmsPxnumber | nullzorunluHow far off these clicks are on this frame with the pitch sizes above and the saved lens term; null when they give no fit
qualitystring | nullzorunluThe same fit's gate: ask whether the lines still fit only for GOOD or WEAK; otherwise let the person mark the pitch, starting from these clicks
Değerler:
"GOOD","WEAK","REJECT"savedAtstringzorunlucameraLabelstring | nullzorunlu
windowobject | nullzorunluThe saved match window, if any
kickoffSnumberzorunluhalftimeSnumber | nullzorunluendSnumberzorunluaDefendsstringzorunluDeğerler:
"near","far"switchedEndsbooleanzorunlu
areasany[][][]zorunluThe venue's areas to ignore on this frame (pixels of
image), from its camera set-up: draw them read-only. Saving carries them into the match's calibration; the worker drops people outside the lines and ball runs that stay inside themneedsScorebooleanzorunluThe match has no score yet: marking the pitch waits for it (a venue may deliver the recording first).
can.saveandcan.redoare false until thencanobjectzorunlusavebooleanzorunluThe analysis waits for prep (NEEDS_PREP) and the score is in
redobooleanzorunluTracking started already: saving again needs redo: true and starts tracking over
Save the pitch marking and start tracking
Oturum gerekir
The server fits the camera again (the same code as the web preview) and, in one transaction, stores the calibration on the match's camera (a pitch without one gets "Kamera 1"), makes it the camera's active calibration, stores the window, moves the analysis to TRACKING and queues tracking. 422 INVALID with fields.clicks: tooFew (fewer than 6 different landmarks), collinear, oneHalf (all in one half), noFit, rejected (more than 4 px off on average), unknownLandmark (box_* needs a penalty area), duplicate or outsideImage; fields like pitch.widthM (outOfRange, widerThanLong, goalTooWide, penaltyWidth, penaltyDepth) and window.endS (required, outOfVideo, beforeKickoff, outsideMatch). 409 CONFLICT with fields.form scoreFirst (enter the score first: labelling and stats need the roster and the goals), noVideo, notReady (still ingesting), matchCancelled, alreadyPrepared (tracking started; send redo: true to start over, which cancels the running stage) or alreadyQueued. For an official-camera match whose camera the venue set up, the venue's calibration is the one-tap prefill, and its areas to ignore move into this match's frame through both fits.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
clicksobject[]zorunluAt least 6 different landmarks, in both halves of the pitch
idstringzorunluThe landmark, e.g. corner_0_0 (x = 0 is the left goal on the frame, y = 0 the far touchline)
Değerler:
"corner_0_0","corner_L_0","corner_L_W","corner_0_W","halfway_0","halfway_W","centre_spot","goal_0_post_a","goal_0_post_b","goal_L_post_a","goal_L_post_b","box_0_line_a","box_0_front_a","box_0_front_b","box_0_line_b","box_L_line_a","box_L_front_a","box_L_front_b","box_L_line_b"imageany[]zorunluWhere it is on the median frame, in its pixels: [x, y] from the top-left corner
lambdanumber | nullisteğe bağlıThe lens term; leave it out to search the best one (the browser preview does the same)
-0.6 ile 0.6 arası
pitchobjectzorunlulengthMnumberzorunluGoal line to goal line, 15-110 m
widthMnumberzorunluTouchline to touchline, 10-75 m, not more than the length
goalWidthMnumberzorunluBetween the posts, 1-7.32 m
measuredbooleanisteğe bağlıThe sizes were tape-measured
Varsayılan:
falsepenaltyAreaobject | nullisteğe bağlıOnly when the pitch has penalty areas marked; enables the box_* landmarks
Varsayılan:
nullwidthMnumberzorunluAcross the pitch; wider than the goal
depthMnumberzorunluFrom the goal line
windowobjectzorunlukickoffSnumberzorunluKick-off, in seconds of the video
halftimeSnumber | nullisteğe bağlıStart of the break; null when there was none
Varsayılan:
nullendSnumberzorunluThe final whistle, in seconds of the video
aDefendsstringzorunluThe goal side A defends in the first half: "near" is x = 0 (the left goal on the frame), "far" is x = length
Değerler:
"near","far"switchedEndsbooleanisteğe bağlıThe sides switched ends at half-time (needs halftimeS)
Varsayılan:
false
redobooleanisteğe bağlıMark the pitch again after tracking started: cancels the running stage and tracks again
Yanıttaki data
analysisIdstringzorunlustatusstringzorunluTRACKING
Değerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"calibrationIdstringzorunlucameraIdstring | nullzorunlujobIdstringzorunlurmsPxnumberzorunluReprojection error in 1080p-equivalent pixels
qualitystringzorunluGOOD up to 2 px; WEAK up to 4 px (heatmaps only)
Değerler:
"GOOD","WEAK"lambdanumberzorunluredobooleanzorunlu
Kim kim?
6 uç noktaWho is who: the roster and the tracked people
Oturum gerekir
For people who attended and the organiser, side captains and admins (403 watchNotAllowed for others in the match, 404 for everyone else). Every tracklet is one person the tracker followed for a while. Draw them over the video with the layer files (GET /layer/index.json, then /layer/chunk_<n>.json): a box's track id is the tracklet's ordinal. A fast way to label: the roll call first (rollCall), then accept the safe suggestions, then review the rest one at a time, lowest margin first (the order the app's Kontrol step uses: margin, then p, then the longer tracklet, then the earlier one).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
matchIdstringzorunluanalysisIdstring | nullzorunlustatusstring | nullzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"readybooleanzorunluThe tracker's results are in; false before tracking finished (tracklets is empty)
sidesobjectzorunluThe sides' labels
AstringzorunluBstringzorunlu
videoobjectzorunlufpsnumber | nullzorunluframeCountnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunludurationSnumber | nullzorunlureadybooleanzorunluGET /video gives a link to the proxy
canobjectzorunlumanagebooleanzorunlulabelbooleanzorunluMay change labels now
versionnumberzorunluThe number of decisions so far
changedSincePublishbooleanzorunluLabels, or the score card (who played, on which side, the goals), changed after the stats were worked out: finish again to update them. A score save clears labels that name someone who no longer played
rosterFromRsvpbooleanzorunluAttendance was not entered; the roster is the people who said yes
safeMarginnumberzorunluThe margin accept-suggestions uses by default
rosterobject[]zorunluThe players who attended: side A, side B, then without a side
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
kindstringzorunluDeğerler:
"registered","guest"sidestring | nullzorunluDeğerler:
"A","B"keeperbooleanzorunluPlays in goal (positions include goalkeeper)
trackletsobject[]zorunluidstringzorunluordinalnumberzorunluThe tracker's id: the track id in the video layer's boxes
startFramenumberzorunluFrames of the proxy video: frame = round(mediaTime × video.fps)
endFramenumberzorunluInclusive
sideGuessstring | nullzorunluThe side its shirt colour matched
Değerler:
"A","B"sideConfnumber | nullzorunlukeeperGuessbooleanzorunluinsideRationumberzorunluShare of the time inside the pitch
labelstringzorunluDeğerler:
"unlabeled","player","not_player","mixed"playerIdstring | nullzorunlusourcestring | nullzorunlu"user" or "suggestion" once labelled
suggestionobject | nullzorunluFor people who may label, on unlabelled tracklets
playerIdstringzorunlupnumberzorunluThe player's probability, 0..1 (shown as "Ali? %82")
marginnumberzorunlup minus the runner-up's probability (another player or nobody on the roster)
stripbooleanzorunluA crop strip exists: GET /tracklets/{trackletId}/strip
matchWindowobject | nullzorunluKick-off to the final whistle in frames (the span of the per-player timelines); null before tracking
startFramenumberzorunluendFramenumberzorunluhalftimeFramenumber | nullzorunlu
rollCallobject[]zorunluRoll call (Yoklama), for people who may label: a frame soon after kick-off where the number of people on the pitch is closest to the number of players and they stand well apart (and one after half-time when the ends were switched). Label each box's tracklet with POST /labels; continuity then carries the labels on to the suggestions. Empty without a video layer
periodnumberzorunlu1 after kick-off; 2 after half-time, only when the sides switched ends
Değerler:
1,2framenumberzorunluShow this frame paused: seek to (frame + 0.5) / video.fps
widthnumberzorunluheightnumberzorunlupeopleobject[]zorunluEvery box on the frame
numbernumberzorunluThe box's number on the frame, 1… from left to right
trackletIdstringzorunluordinalnumberzorunluboxany[]zorunlu[x0, y0, x1, y1] in the layer's pixel space (width x height)
A tracklet's crop strip
Oturum gerekir
For people who attended and the organiser, side captains and admins (403 watchNotAllowed for others in the match, 404 for everyone else). A 240 x 64 WebP: five 48 x 64 crops of the person over the tracklet's life, oldest first, for telling people apart. Strips are pictures of people: the answer may be kept by the viewer's own client (private, one hour) but never by a shared cache, and other sites may not embed it (Cross-Origin-Resource-Policy: same-origin); send If-None-Match with the ETag to get 304 while unchanged. 404 noStrip when the tracker left none (tracklet.strip is false), 404 trackletNotFound for a tracklet of another match.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlutrackletIdstringzorunlu
Sorgu parametreleri
loadstringisteğe bağlıAny id (8-64 letters, digits, - or _) shared by every strip one screen shows: access is audited once per load (without it, once every two hours)
Label a tracklet
Oturum gerekir
For the organiser, side captains and admins (403 labelNotAllowed for others in the match, 404 for everyone else). Labels change while the analysis is NEEDS_LABELS or PUBLISHED (then finish again to update the stats), or FAILED in the stats stage (failedStage stats: fix labels, then finish again); 409 labelsLocked while the stats are worked out or after another stage failed, 409 notReady before tracking finished. label player needs playerId, a player who attended (422 notInRoster otherwise); not_player is a referee, coach or spectator; mixed is two people merged into one track; unlabeled clears the label. With unlabeled and a playerId (rejecting a suggestion) the tracklet is unlabelled afterwards, its label cleared if it had one, and that player is no longer suggested for it until its label changes. Every change appends a decision to the tracklet's history; the same label again changes nothing. The answer carries the suggestions that changed and the version it started from.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
trackletIdstring (uuid)zorunlulabelstringzorunluDeğerler:
"player","not_player","mixed","unlabeled"playerIdstring (uuid) | nullisteğe bağlıThe player for label player; with label unlabeled, a player this tracklet is not (rejects that suggestion)
sourcestringisteğe bağlı"suggestion" when the person accepted the suggestion shown for this tracklet
Değerler:
"user","suggestion"onlyIfUnlabeledbooleanisteğe bağlıRefuse a conflicting existing label instead of replacing it; an identical label is still a no-op
Yanıttaki data
trackletobjectzorunluidstringzorunlulabelstringzorunluDeğerler:
"unlabeled","player","not_player","mixed"playerIdstring | nullzorunlusourcestring | nullzorunlu
previousVersionnumberzorunluThe version this change started from; when it differs from yours, someone else labelled too: GET /tracklets again
versionnumberzorunlusuggestionsobject[]zorunluThe suggestions that changed, and always the labelled tracklet's own (null when it has none)
trackletIdstringzorunlusuggestionobject | nullzorunluNull where the suggestion went away
playerIdstringzorunlupnumberzorunluThe player's probability, 0..1 (shown as "Ali? %82")
marginnumberzorunlup minus the runner-up's probability (another player or nobody on the roster)
Accept every safe suggestion
Oturum gerekir
For the organiser, side captains and admins (403 labelNotAllowed for others in the match, 404 for everyone else). Labels change while the analysis is NEEDS_LABELS or PUBLISHED (then finish again to update the stats), or FAILED in the stats stage (failedStage stats: fix labels, then finish again); 409 labelsLocked while the stats are worked out or after another stage failed, 409 notReady before tracking finished. Labels each tracklet whose suggestion has at least minMargin (default 0.5) as that player, one decision each, all in one step. The body may be left out.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
minMarginnumberisteğe bağlıAccept suggestions with at least this margin; default 0.5
0.3 ile 1 arası
Yanıttaki data
acceptednumberzorunlutrackletsobject[]zorunluidstringzorunlulabelstringzorunluDeğerler:
"unlabeled","player","not_player","mixed"playerIdstring | nullzorunlusourcestring | nullzorunlu
previousVersionnumberzorunluversionnumberzorunlusuggestionsobject[]zorunlutrackletIdstringzorunlusuggestionobject | nullzorunluNull where the suggestion went away
playerIdstringzorunlupnumberzorunluThe player's probability, 0..1 (shown as "Ali? %82")
marginnumberzorunlup minus the runner-up's probability (another player or nobody on the roster)
Finish labelling and work out the stats
Oturum gerekir
For the organiser, side captains and admins (403 labelNotAllowed for others in the match, 404 for everyone else). Labels change while the analysis is NEEDS_LABELS or PUBLISHED (then finish again to update the stats), or FAILED in the stats stage (failedStage stats: fix labels, then finish again); 409 labelsLocked while the stats are worked out or after another stage failed, 409 notReady before tracking finished. Moves the analysis to COMPUTING and queues the stats job in one step; poll GET /analysis until PUBLISHED. 409 nothingLabelled when no tracklet is a player yet; 409 playersMissing when attended players have no tracklet (the roster entries without one): send allowMissing true to go ahead. The body may be left out.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
allowMissingbooleanisteğe bağlıGo ahead although some attended players have no tracklet
Yanıttaki data
analysisIdstringzorunlustatusstringzorunluDeğerler:
"COMPUTING"jobIdstringzorunlulabelledPlayersnumberzorunlumissingPlayersnumberzorunluAttended players without a tracklet (allowed with allowMissing)
A video layer file
Oturum gerekir
For people who attended and the organiser, side captains and admins (403 watchNotAllowed for others in the match, 404 for everyone else). name is index.json or chunk_<n>.json; the format is LayerIndex and LayerChunk in packages/contracts/src/pipeline.ts: index.json gives fps, stride, width and height (the boxes' pixel space) and the chunk numbers; chunk n holds frames [n × chunk_frames, (n + 1) × chunk_frames) as { frames: { "<frame>": { p: [[trackId, x0, y0, x1, y1], …], b?: [x, y, interpolated], o?: trackId } } }. The JSON is returned as is (no { data } envelope). The files are rewritten when the pitch is marked again, so keep them with their ETag and send If-None-Match: 304 while unchanged. 404 notReady before tracking finished or for a chunk that does not exist.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlunamestringzorunlu
Sorgu parametreleri
generationstringisteğe bağlıOptional committed worker run from GET /replay. When supplied, reads the immutable layer for that run and returns 409 replayChanged if stale; use with an overlay bearing the same generation.
Maç raporu
Report etiketi, 5 uç noktaThe match report
Oturum gerekir
Until the video analysis is published,
readyis false and the body says where the video stands (anyone involved in the match). Once published: highlights, confirmed goals, the man-of-the-match tally with the analysis's suggestion, heatmaps, passes and per-player numbers. For people who played (attended) and the match's managers. Others involved in the match get 403 FORBIDDEN with fields.form reportNotAllowed once the report is published; people outside the match get 404. Each player's numbers follow their visibility setting (visible) and their tier. Play the highlights with GET …/highlights.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
readybooleanzorunluDeğerler:
false,truematchIdstringzorunlumatchStatusstringisteğe bağlıDeğerler:
"planned","played","cancelled"scoreStatestringisteğe bağlıDeğerler:
"none","entered","confirmed"recordingstringisteğe bağlıDeğerler:
"upload","official"analysisobject | nullisteğe bağlıNull until a video came in
idstringzorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"progressnumberzorunlu0..1 within the current stage
canobjectzorunlumanagebooleanzorunluuploadbooleanzorunluMay upload the match video
analysisIdstringisteğe bağlıpublishedAtstring | nullisteğe bağlıkickoffSnumberisteğe bağlıKick-off in seconds into the video
pitchobjectisteğe bağlıMetres
lengthnumberzorunluwidthnumberzorunlu
sidesobjectisteğe bağlıAobjectzorunlulabelstringzorunlugoalsnumber | nullzorunluThe entered score; null until then
Bobjectzorunlulabelstringzorunlugoalsnumber | nullzorunlu
videoobjectisteğe bağlıreadybooleanzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
highlightsobject[]isteğe bağlıidstringzorunlukindstringzorunluDeğerler:
"goal","chance","save"startSnumberzorunluPlay the match video from here …
endSnumberzorunlu… to here (seconds)
minutenumberzorunlusidestring | nullzorunluDeğerler:
"A","B"goalobject | nullzorunluGoal highlights: scorer and assist once a manager confirmed the goal; rejected candidates are left out
idstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed"ownGoalbooleanzorunluscorerobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
goalsobject[]isteğe bağlıConfirmed goals in match order
idstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluassistobject[]zorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
reviewobjectisteğe bağlıcandidatesnumberzorunluGoal candidates waiting for a manager's decision
tallyobjectzorunluConfirmed goals per side
AnumberzorunluBnumberzorunlu
mismatchbooleanzorunluThe score is in and the confirmed goals do not add up to it
motmobjectisteğe bağlıtotalVotesnumberzorunluvotesobject[]zorunluplayerIdstringzorunludisplayNamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunlu
leadersobject[]zorunluThe most voted; several on a tie
playerIdstringzorunludisplayNamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"votesnumberzorunlu
suggestedobject | nullzorunluThe analysis's pick: the highest rating you may see
playerIdstringzorunludisplayNamestringzorunlusidestring | nullzorunluDeğerler:
"A","B"ratingnumberzorunluphotoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
myVotestring | nullzorunluThe player you voted for, while that vote counts (votes are cast with POST /api/v1/matches/{id}/motm)
playersobject[]isteğe bağlıplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunlusidestring | nullzorunluDeğerler:
"A","B"isMebooleanzorunluvisiblebooleanzorunluFalse when the player's visibility setting hides their numbers from you; then every number is null
photoobject | nullzorunluTheir profile photo, under the same rule as the numbers
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
tierstring | nullzorunluA: full numbers; B (partial): minutes and the heatmap; C (not enough data): nothing
Değerler:
"A","B","C"minutesnumber | nullzorunludistanceMnumber | nullzorunluEstimated, tier A at a believable pace (40–140 m/min) only
metersPerMinnumber | nullzorunluratingnumber | nullzorunlu0–10, tier A
touchesnumber | nullzorunlupassesnumber | nullzorunlupassesCompletednumber | nullzorunlucompletionnumber | nullzorunluCompleted passes as a share of passes, 0..1
shotsnumber | nullzorunlugoalsnumberzorunluConfirmed goals; own goals count for nobody
assistsnumberzorunluavgobject | nullzorunluAverage position on a unit pitch, attacking left to right (tier A)
unumberzorunluvnumberzorunlu
heatmapobject | nullzorunluSeconds per cell, row-major: grid[row * cols + col]. Columns run along the length from the subject's own goal to the goal it attacks (the subject attacks left to right); rows run across, from the far touchline. The ball grid uses side A's direction. Blur with sigma ≈ 1.5 m when drawing.
colsnumberzorunlurowsnumberzorunlugridnumber[]zorunlu
heatmapsobjectisteğe bağlısidesobjectzorunluEach side's grid is the sum of its players' grids, over the players whose numbers you may see (
visible); null when there are noneAobject | nullzorunluSeconds per cell, row-major: grid[row * cols + col]. Columns run along the length from the subject's own goal to the goal it attacks (the subject attacks left to right); rows run across, from the far touchline. The ball grid uses side A's direction. Blur with sigma ≈ 1.5 m when drawing.
colsnumberzorunlurowsnumberzorunlugridnumber[]zorunlu
Bobject | nullzorunluSeconds per cell, row-major: grid[row * cols + col]. Columns run along the length from the subject's own goal to the goal it attacks (the subject attacks left to right); rows run across, from the far touchline. The ball grid uses side A's direction. Blur with sigma ≈ 1.5 m when drawing.
colsnumberzorunlurowsnumberzorunlugridnumber[]zorunlu
ballobject | nullzorunluSeconds per cell, row-major: grid[row * cols + col]. Columns run along the length from the subject's own goal to the goal it attacks (the subject attacks left to right); rows run across, from the far touchline. The ball grid uses side A's direction. Blur with sigma ≈ 1.5 m when drawing.
colsnumberzorunlurowsnumberzorunlugridnumber[]zorunlu
totalsobjectisteğe bağlıAobjectzorunluOver the side's players whose full numbers you see
playersnumberzorunlupassesnumberzorunlupassesCompletednumberzorunlucompletionnumber | nullzorunlutouchesnumberzorunlushotsnumberzorunlu
BobjectzorunluOver the side's players whose full numbers you see
playersnumberzorunlupassesnumberzorunlupassesCompletednumberzorunlucompletionnumber | nullzorunlutouchesnumberzorunlushotsnumberzorunlu
Highlights and a link to play them
Oturum gerekir
Play each highlight from
startStoendSof the linked video, one after another. Empty until the analysis is published. For people who played and managers (403 watchNotAllowed for others in the match, 404 outside it). Every link issued is written to the audit log; links last 2 hours.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
highlightsobject[]zorunluidstringzorunlukindstringzorunluDeğerler:
"goal","chance","save"startSnumberzorunluPlay the match video from here …
endSnumberzorunlu… to here (seconds)
minutenumberzorunlusidestring | nullzorunluDeğerler:
"A","B"goalobject | nullzorunluGoal highlights: scorer and assist once a manager confirmed the goal; rejected candidates are left out
idstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed"ownGoalbooleanzorunluscorerobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
videoobject | nullzorunluurlstringzorunluA presigned GET link to the 720p match video, valid for 2 hours; supports range requests
expiresAtstringzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
Goal candidates and goals
Oturum gerekir
The analysis leaves one candidate per goal of the score, with a best guess for the scorer and the assist. Managers confirm or reject them (POST …/goals/{goalId}) and add missed goals (POST here). Play a goal's
clipfrom the match video (GET /api/v1/matches/{id}/video). For people who played (attended) and the match's managers. Others involved in the match get 403 FORBIDDEN with fields.form goalsNotAllowed once the report is published; people outside the match get 404.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
readybooleanzorunluDeğerler:
false,truematchIdstringzorunlumatchStatusstringisteğe bağlıDeğerler:
"planned","played","cancelled"scoreStatestringisteğe bağlıDeğerler:
"none","entered","confirmed"recordingstringisteğe bağlıDeğerler:
"upload","official"analysisobject | nullisteğe bağlıNull until a video came in
idstringzorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"progressnumberzorunlu0..1 within the current stage
canobjectzorunlumanagebooleanzorunluuploadbooleanzorunluMay upload the match video
analysisIdstringisteğe bağlısidesobjectisteğe bağlıAobjectzorunlulabelstringzorunlugoalsnumber | nullzorunluThe entered score; null until then
Bobjectzorunlulabelstringzorunlugoalsnumber | nullzorunlu
kickoffSnumberisteğe bağlıvideoobjectisteğe bağlıreadybooleanzorunludurationSnumber | nullzorunluwidthnumber | nullzorunluheightnumber | nullzorunlu
candidatesobject[]isteğe bağlıidstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluassistobject[]zorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
confirmedobject[]isteğe bağlıidstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluassistobject[]zorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
rejectedobject[]isteğe bağlıidstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluassistobject[]zorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
rosterobjectisteğe bağlıWho can be credited on each side: people who played there and players the analysis identified there
Aobject[]zorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
sidestringzorunluDeğerler:
"A","B"
Bobject[]zorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
sidestringzorunluDeğerler:
"A","B"
tallyobjectisteğe bağlıAnumberzorunluBnumberzorunlu
mismatchbooleanisteğe bağlı
Add a goal the video missed
Oturum gerekir
Organiser, side captains and admins (403 decideNotAllowed). The goal is confirmed at once (source user) and gets a highlight. 409 notPublished until the analysis is published. 422 INVALID with fields: at (required, invalid, afterEnd: past the end of the video), side (required), scorerId (required, notOnSide, notOpponent for own goals), assistId (notOnSide, sameAsScorer, ownGoal).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
atnumber | stringzorunluWhen the ball went in, in the match video: seconds as a number, or what people type: "mm:ss" ("23:15"), "h:mm:ss", or whole minutes ("23")
sidestringzorunluThe side credited with the goal
Değerler:
"A","B"scorerIdstring | nullisteğe bağlıMust have played for the credited side (for an own goal: for the other side; see
roster). Null only when nobody is listed on that side, e.g. an opponent team that is not on Akıllı Futbol: the goal then counts for the side and for nobodyassistIdstring | nullisteğe bağlıPlayed for that side; leave out or null for no assist
ownGoalbooleanisteğe bağlı
Yanıttaki data
idstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluplayerIdstringzorunlupnumberzorunlu
assistobject[]zorunluplayerIdstringzorunlupnumberzorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
Answer “Bu gol mü?”
Oturum gerekir
Organiser, side captains and admins (403 decideNotAllowed). confirm credits the goal (left-out fields keep the analysis's guess), reject drops it; a decided goal can be decided again to correct it. Players' goals and assists are recounted at once. 404 with fields.form goalGone when a new analysis replaced the candidate. 422 INVALID with fields: side (required), scorerId (required, notOnSide, notOpponent), assistId (notOnSide, sameAsScorer, ownGoal).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlugoalIdstringzorunlu
İstek gövdesi
decisionstringzorunluDeğerler:
"confirm","reject"sidestringisteğe bağlıThe side credited with the goal; left out: the candidate's side
Değerler:
"A","B"scorerIdstring | nullisteğe bağlıLeft out: the analysis's best guess. Must have played for the credited side (for an own goal: for the other side; see
roster). Null only when nobody is listed on that side, e.g. an opponent team that is not on Akıllı Futbol: the goal then counts for the side and for nobodyassistIdstring | nullisteğe bağlıLeft out: the analysis's best guess; null: no assist. Must have played for the credited side; none for own goals
ownGoalbooleanisteğe bağlı
Yanıttaki data
idstringzorunlustatusstringzorunluDeğerler:
"candidate","confirmed","rejected"sourcestringzorunluauto: found in the video; user: added by hand
Değerler:
"auto","user"sidestring | nullzorunluThe side credited with the goal (an own goal counts for the side that did not put it in)
Değerler:
"A","B"atSnumberzorunluSeconds into the match video
minutenumberzorunluMatch minute from kick-off: 0:00–0:59 is the 1st
clipobjectzorunluThe stretch of video to play: 8 s before the goal to 4 s after
startSnumberzorunluendSnumberzorunlu
ownGoalbooleanzorunluscorerobject | nullzorunluFor candidates the analysis's best guess; for decided goals who scored (null when nobody was listed on that side)
playerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
assistobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
confidencenumber | nullzorunluThe analysis's confidence in a candidate, 0..1
optionsobjectzorunluEveryone the analysis considered, best first
scorerobject[]zorunluplayerIdstringzorunlupnumberzorunlu
assistobject[]zorunluplayerIdstringzorunlupnumberzorunlu
decidedByobject | nullzorunluplayerIdstringzorunludisplayNamestringzorunluhandlestring | nullzorunluNull for guests
decidedAtstring | nullzorunlu
Profiller
Profiles etiketi, 4 uç noktaA player's profile
Oturum gerekmez
Everyone sees the name and the handle. Positions, teams, career numbers, the heatmap and the match history follow the player's visibility: public to everyone; teammates to people who share a team with them, or a match they took part in (answered yes or maybe, or played); private to nobody else. When they are hidden the response is
{ visible: false, … }with the name and the handle only. 404 NOT_FOUND for an unknown handle; 429 RATE_LIMITED after 30 unknown handles in 15 minutes (per account; signed out, per address, or in one count shared by every caller whose address cannot be trusted), for known handles too until the window ends.Alanları gösterAlanları gizle
Yol parametreleri
handlestringzorunlu
Yanıttaki data
visiblebooleanzorunluDeğerler:
true,falseisMebooleanzorunluDeğerler:
falseplayerobjectzorunluidstringzorunluhandlestringzorunludisplayNamestringzorunlupositionsstring[]zorunluDeğerler:
"goalkeeper","defender","midfielder","forward"visibilitystringzorunluDeğerler:
"public","teammates","private"photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
teamsobject[]isteğe bağlıslugstringzorunlunamestringzorunlukitHexstring | nullzorunlurolestringzorunluDeğerler:
"captain","co_captain","member"canOpenbooleanzorunluWhether you may open the team (GET /api/v1/teams/{slug}): members and admins only
careerobjectisteğe bağlımatchesintegerzorunluMatches they played (attendance, or found in a published video analysis); cancelled ones do not count
winsintegerzorunludrawsintegerzorunlulossesintegerzorunlugoalsintegerzorunluPer match: the confirmed goals once the match has any (own goals left out); until then the goals they reported with the score
assistsintegerzorunluAssists on confirmed goals
motmintegerzorunluMatches where nobody got more man-of-the-match votes
heatmapobject | nullisteğe bağlıThe sum of their match heatmaps
colsintegerzorunlurowsintegerzorunlugridnumber[]zorunluSeconds per cell, row by row; cols run along the pitch's length and the player attacks left to right
matchesintegerzorunlu
attributesobject | nullisteğe bağlıNull before their first analysed match with full numbers (tier A)
matchesintegerzorunluThe analysed matches (tier A) behind the scores: the latest 10 at most
scoresobjectzorunlupaceinteger | nullzorunluFrom their top speed per match (the median)
1 ile 99 arası
shootinginteger | nullzorunluGoals per match (counted twice) and shots per ten minutes
1 ile 99 arası
passinginteger | nullzorunluPass accuracy (counted twice) and passes per ten minutes
1 ile 99 arası
involvementinteger | nullzorunluTouches per ten minutes
1 ile 99 arası
staminainteger | nullzorunluMetres per minute, at a believable pace
1 ile 99 arası
basisobjectzorunlugoalsPerMatchnumberzorunlushotsPer10number | nullzorunlupassAccuracynumber | nullzorunlu0–1
passesPer10number | nullzorunlutouchesPer10number | nullzorunlumetersPerMininteger | nullzorunluEstimated
averagesobject | nullisteğe bağlıNull before their first analysed match with full numbers (tier A)
matchesintegerzorunluEvery analysed match with full numbers (tier A)
ratingnumber | nullzorunluAverage match rating, 0–10
bestRatingnumber | nullzorunluminutesintegerzorunludistanceKmnumber | nullzorunluEstimated, over matches at a believable pace
passesnumber | nullzorunlupassAccuracynumber | nullzorunlu0–1
touchesnumber | nullzorunlushotsnumber | nullzorunlu
historyobject[]isteğe bağlıThe latest 30 matches, newest first
matchIdstringzorunlustartsAtstringzorunluISO 8601
titlestring | nullzorunlusidestring | nullzorunluThe side they played on
Değerler:
"A","B"sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunlu
resultstring | nullzorunluDeğerler:
"win","draw","loss"goalsintegerzorunluTheir goals: the confirmed ones once the match has any, until then the ones reported with the score
assistsintegerzorunluTheir assists on confirmed goals
motmbooleanzorunluMan of the match (most votes; shared tops count)
statobject | nullzorunlutierstringzorunluA: full stats; B: partial (minutes and heatmap); C: not enough data
Değerler:
"A","B","C"minutesinteger | nullzorunludistanceMinteger | nullzorunluEstimated; tier A at a believable pace only
ratingnumber | nullzorunluThe analysis's match rating, 0–10 to one decimal; tier A only
touchesinteger | nullzorunluTier A only
passesinteger | nullzorunluTier A only
passesCompletedinteger | nullzorunluTier A only
shotsinteger | nullzorunluTier A only
heatmapobject | nullzorunluA coarse 16×10 grid for small drawings
colsintegerzorunlurowsintegerzorunlugridnumber[]zorunluSeconds per cell, row by row; cols run along the pitch's length and the player attacks left to right
canOpenbooleanzorunluWhether you may open this match (GET its report); seeing a profile does not open its matches
A profile photo
Oturum gerekmez
A square WebP copy. Use the paths a player's
photogives you; a new upload gets a new id. 404 NOT_FOUND for an unknown id and for a photo you may not see (the player's visibility), alike. 422 INVALID for another size.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Sorgu parametreleri
sizestringisteğe bağlı
A player's card
Oturum gerekmez
The numbers on the player card: the same visibility as the profile (403 FORBIDDEN when the profile is hidden from you). 404 NOT_FOUND and 429 RATE_LIMITED as for GET /api/v1/players/{handle}.
Alanları gösterAlanları gizle
Yol parametreleri
handlestringzorunlu
Yanıttaki data
handlestringzorunludisplayNamestringzorunlupositionsstring[]zorunluDeğerler:
"goalkeeper","defender","midfielder","forward"photoobject | nullzorunluSquare WebP copies of the player's profile photo: paths on this host (GET /api/v1/photos/{id}). Present only when you may see the player (their visibility, as for their stats); null shows their initials instead
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
overallinteger | nullzorunlu1–99: ten times the average match rating (0–10, from the video analysis) of the latest 10 rated matches; null before the first
ratedMatchesintegerzorunluHow many matches the overall averages
matchesintegerzorunlugoalsintegerzorunluassistsintegerzorunlumotmintegerzorunluMan of the match awards
winRatenumber | nullzorunluWins as a share of matches with a result, 0–1
distanceKmnumber | nullzorunluEstimated kilometres per analysed match (tier A, at a believable pace)
passAccuracynumber | nullzorunluCompleted passes as a share of passes in analysed matches, 0–1
attributesobject | nullzorunluThe profile's attributes (pace, shooting, passing, involvement, stamina), 1–99, worked out from the video; null before the first analysed match with full numbers. With them the card shows these five and the matches instead of the six career numbers
paceinteger | nullzorunlu1 ile 99 arası
shootinginteger | nullzorunlu1 ile 99 arası
passinginteger | nullzorunlu1 ile 99 arası
involvementinteger | nullzorunlu1 ile 99 arası
staminainteger | nullzorunlu1 ile 99 arası
heatmapobject | nullzorunluThe career heatmap: seconds per cell, cols along the length, attacking left to right
colsintegerzorunlurowsintegerzorunlugridnumber[]zorunlu
teamobject | nullzorunluThe team on the card's badge: their first team by name
namestringzorunlukitHexstring | nullzorunlu
A player's card as a PNG
Oturum gerekmez
1080 × 1920 PNG, the size WhatsApp status and Instagram stories fill, with the card clear of the top and bottom 250 px. Same visibility as the profile (403 FORBIDDEN when hidden from you).
download=1answers withContent-Disposition: attachment. The answer carries an ETag; send it back in If-None-Match for a 304 while the card is unchanged. 429 RATE_LIMITED past 60 images in 10 minutes per person (signed out, per address).Alanları gösterAlanları gizle
Yol parametreleri
handlestringzorunlu
Sorgu parametreleri
localestringisteğe bağlıdownloadstringisteğe bağlı
Ana sayfa
Feed etiketi, 1 uç nokta- GET
/api/ v1/ feed The home screen: invitations, the next match, to-dos, recent results and teams
Oturum gerekir
Everything the home screen shows, computed for the caller with the same rules as the match pages. Answer an invitation with POST /api/v1/matches/{id}/rsvp; each to-do names its match, and what to open follows from
kind. The lists are capped, with no further pages: at most 20 invitations, to-dos from your 30 latest matches with work left, the last 5 results (GET /api/v1/matches lists more). Errors: 401 signed out.Alanları gösterAlanları gizle
Yanıttaki data
greetingobjectzorunluperiodstringzorunluThe part of the day in Istanbul: 05–12 morning, 12–18 afternoon, 18–24 evening, 00–05 night
Değerler:
"morning","afternoon","evening","night"namestringzorunluYour display name
isNewbooleanzorunluNo teams and no matches yet: show a welcome with create a team, create a match and join with a code
invitationsobject[]zorunluOpen matches waiting for your answer (POST /api/v1/matches/{id}/rsvp), soonest first; at most 20
idstring (uuid)zorunluThe match id, for GET /api/v1/matches/{id}
titlestring | nullzorunluNull when untitled: name it by its sides, "A – B"
startsAtstring (date-time)zorunluISO 8601 (UTC)
sidesobjectzorunluSide A wears orange in the apps, side B blue
Aobjectzorunlulabelstringzorunlu
Bobjectzorunlulabelstringzorunlu
venueobject | nullzorunlunamestringzorunluverifiedbooleanzorunluChecked by an admin: show the verified badge
pitchobject | nullzorunlunamestringzorunlu
endsAtstring (date-time)zorunluISO 8601 (UTC)
organizerobjectzorunludisplayNamestringzorunlu
teamobject | nullzorunluYour team, when it was invited as a whole
namestringzorunlu
sidestring | nullzorunluThe side you would play on, when known
Değerler:
"A","B"comingintegerzorunluHow many said "yes"
nextMatchobject | nullzorunluThe soonest match you said "yes" or "maybe" to that is not over
idstring (uuid)zorunluThe match id, for GET /api/v1/matches/{id}
titlestring | nullzorunluNull when untitled: name it by its sides, "A – B"
startsAtstring (date-time)zorunluISO 8601 (UTC)
sidesobjectzorunluSide A wears orange in the apps, side B blue
Aobjectzorunlulabelstringzorunlu
Bobjectzorunlulabelstringzorunlu
venueobject | nullzorunlunamestringzorunluverifiedbooleanzorunluChecked by an admin: show the verified badge
pitchobject | nullzorunlunamestringzorunlu
endsAtstring (date-time)zorunluISO 8601 (UTC)
kickedOffbooleanzorunluThe match is being played now
comingintegerzorunluHow many said "yes"
maybeintegerzorunluHow many said "maybe"
meobjectzorunlursvpstringzorunluDeğerler:
"yes","maybe"sidestring | nullzorunluDeğerler:
"A","B"
todosobject[]zorunluOne per pending action: the latest match first, in pipeline order within a match; from your 30 latest matches with work left
kindstringzorunluscore: enter the score (organiser, side captains, admins; after kick-off). upload: upload the video (people who may upload, once the score is in, until a video arrives, unless the pitch's official camera records it). prep: mark the pitch (managers; analysis NEEDS_PREP). labels: say who is who (managers; NEEDS_LABELS). goals: confirm goal candidates (managers; once the analysis is PUBLISHED). vote: vote for the man of the match (people who played, when someone else played too; until seven days after kick-off, see voteUntil)
Değerler:
"score","upload","prep","labels","goals","vote"matchobjectzorunluidstring (uuid)zorunluThe match id, for GET /api/v1/matches/{id}
titlestring | nullzorunluNull when untitled: name it by its sides, "A – B"
startsAtstring (date-time)zorunluISO 8601 (UTC)
sidesobjectzorunluSide A wears orange in the apps, side B blue
Aobjectzorunlulabelstringzorunlu
Bobjectzorunlulabelstringzorunlu
candidatesinteger | nullzorunlugoals: how many candidates wait for a decision; null for other kinds
voteUntilstring (date-time) | nullzorunluvote: when voting closes (kick-off plus seven days); null for other kinds
recentobject[]zorunluThe last 5 matches you played that have a score, newest first
idstring (uuid)zorunlutitlestring | nullzorunlustartsAtstring (date-time)zorunluISO 8601 (UTC)
sidesobjectzorunluAobjectzorunlulabelstringzorunlugoalsintegerzorunlu
Bobjectzorunlulabelstringzorunlugoalsintegerzorunlu
sidestring | nullzorunluThe side you played on, when known
Değerler:
"A","B"resultstring | nullzorunluFor your side; null when your side is unknown
Değerler:
"win","draw","loss"ratingnumber | nullzorunlu0–10 with one decimal, from the published video analysis; null without one
teamsobject[]zorunluYour active teams, alphabetical
idstring (uuid)zorunluslugstringzorunluFor GET /api/v1/teams/{slug}
namestringzorunlucitystring | nullzorunlukitHomeHexstringzorunlu#rrggbb, lower-case
kitAwayHexstring | nullzorunlu#rrggbb, lower-case
crestobject | nullzorunlushapestringzorunluDeğerler:
"shield","round","rounded","diamond","hexagon","pennant","arched","oval","crest","octagon","ticket","star"primarystringzorunlusecondarystringzorunluletterstringzorunlupatternstringisteğe bağlıDeğerler:
"plain","split","stripes","sash","chevron","hoops"Varsayılan:"plain"detailstringisteğe bağlıDeğerler:
"none","star","ball","crown","laurel","wings"Varsayılan:"none"
rolestringzorunluYour role in the team
Değerler:
"captain","co_captain","member"memberCountintegerzorunlu
Halı saha paneli
Pitch admin etiketi, 4 uç noktaStart or resume delivering a match's recording
Oturum gerekir
The venue's recording goes straight to the bucket in parts, as people's uploads do (POST /api/v1/matches/{id}/uploads). 1. POST here with the file's name, size, type and fingerprint (name:size:lastModified). The match becomes an official-camera match on its pitch's official camera, audited as venue.video.start. 2. POST …/parts with the part numbers still missing and PUT each 64 MiB slice to its URL; keep the ETag response header. 3. POST …/complete with every { partNumber, etag }: the analysis starts (INGESTING), audited as video.upload by the venue's login. Starting again with the same fingerprint resumes the venue's unfinished upload. Once a venue's upload has started, people's new uploads to the match are refused (409 venueDelivering). 404 NOT_FOUND for a match that is not at the venue. 409 CONFLICT with fields.form matchCancelled, videoExists (the match has its video), uploadInProgress (someone else is uploading it), beforeKickoff (the recording is sent after kick-off) or noOfficialCamera (the match's pitch has no official camera). The score does not have to be in. 422 INVALID with fields.size tooLarge (over 8 GiB), fields.contentType notVideo or fields.fileName notVideo. Web only: signed in with the pitch admin panel's own session cookie (the akillifutbol-venue cookies set by /api/venue-auth/sign-in/username). Bearer tokens and people's sessions are not accepted (401). A login that has not finished its first sign-in's steps gets 403 with fields.form setup.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
fileNamestringzorunluThe picked file's name, e.g. mac.mp4. An extension other than a video container's (such as .m3u8) is refused
1–255 karakter
sizeintegerzorunluBytes; at most 8 GiB
contentTypestringzorunluThe file's MIME type; must be video/*
fingerprintstringzorunluname:size:lastModified of the file. Starting again with the same fingerprint resumes the unfinished upload
1–512 karakter
Yanıttaki data
uploadIdstringzorunlukeystringzorunluThe object key in the bucket
partSizenumberzorunluBytes per part (64 MiB); the last part holds the rest
partCountnumberzorunluuploadedPartsobject[]zorunluParts the bucket already has (after a resume): upload only the others
partNumbernumberzorunluetagstringzorunlusizenumberzorunlu
resumedbooleanzorunluTrue when this continues the venue's unfinished upload of the same file
Cancel the venue's unfinished delivery
Oturum gerekir
Drops its parts from the bucket. 409 uploadCompleted once it is complete (withdraw it from the panel instead, until labelling starts). Only the venue's own upload: anyone else's is not found (404). Web only: signed in with the pitch admin panel's own session cookie (the akillifutbol-venue cookies set by /api/venue-auth/sign-in/username). Bearer tokens and people's sessions are not accepted (401). A login that has not finished its first sign-in's steps gets 403 with fields.form setup.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
Yanıttaki data
uploadIdstringzorunlustatusstringzorunluDeğerler:
"aborted","failed"
Presigned URLs for parts of the venue's delivery
Oturum gerekir
Links are valid for an hour and accept exactly their part's bytes. 409 uploadClosed when the upload was cancelled or completed. The rules are checked again: 404 NOT_FOUND for a match that is not at the venue. 409 CONFLICT with fields.form matchCancelled, videoExists (the match has its video), uploadInProgress (someone else is uploading it), beforeKickoff (the recording is sent after kick-off) or noOfficialCamera (the match's pitch has no official camera). The score does not have to be in. Only the venue's own upload: anyone else's is not found (404). Web only: signed in with the pitch admin panel's own session cookie (the akillifutbol-venue cookies set by /api/venue-auth/sign-in/username). Bearer tokens and people's sessions are not accepted (401). A login that has not finished its first sign-in's steps gets 403 with fields.form setup.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
İstek gövdesi
partNumbersinteger[]zorunlu1-based part numbers, at most 100 per call
Yanıttaki data
partsobject[]zorunlupartNumbernumberzorunluurlstringzorunluPUT the part's bytes here, then read the ETag response header
expiresAtstringzorunluISO time; sign again after it
Finish the venue's delivery and start the analysis
Oturum gerekir
Checks the parts and the stored size, then creates the video, the analysis and its first job in one step; calling it again returns the same result. 409 partsMissing, partMismatch or sizeMismatch: upload the missing parts and complete again. 409 videoExists when another video became the match's first: this upload is then closed and its file deleted. Only the venue's own upload: anyone else's is not found (404). Web only: signed in with the pitch admin panel's own session cookie (the akillifutbol-venue cookies set by /api/venue-auth/sign-in/username). Bearer tokens and people's sessions are not accepted (401). A login that has not finished its first sign-in's steps gets 403 with fields.form setup.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunluuploadIdstringzorunlu
İstek gövdesi
partsobject[]zorunlupartNumberintegerzorunlu1 ile 10000 arası
etagstringzorunluThe ETag header of the part's PUT response
1–200 karakter
Yanıttaki data
uploadIdstringzorunluvideoAssetIdstring | nullzorunluanalysisIdstring | nullzorunlustatusstring | nullzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"replacedbooleanzorunluAlways false: a venue never replaces a match's video
Yönetim
Admin etiketi, 23 uç noktaHeadline numbers: people, teams, this week's matches, analyses by status
Oturum gerekir
Alanları gösterAlanları gizle
Yanıttaki data
peopleintegerzorunluadminsintegerzorunlubannedintegerzorunluteamsintegerzorunluNot archived
matchesThisWeekintegerzorunluMonday to Sunday in Turkish time, cancelled matches left out
weekobjectzorunlustartstring (date-time)zorunluendstring (date-time)zorunlu
venuesintegerzorunluunverifiedVenuesintegerzorunluanalysesmap<string, integer>zorunluawaitingRecordingsintegerzorunluMatches waiting for the pitch's official recording (see GET /api/v1/admin/official-recordings)
recentAuditobject[]zorunluidstring (uuid)zorunluactionstringzorunlue.g. admin.ban, admin.venue.verify
targetTypestringzorunlutargetIdstring | nullzorunlutargetobject | nullzorunluThe person, team, match or venue the entry is about, if it still exists
kindstringzorunluDeğerler:
"person","team","match","venue"namestringzorunluusernamestring | nullisteğe bağlıuserIdstring (uuid) | nullisteğe bağlıslugstringisteğe bağlısidesstring[]isteğe bağlı
dataanyzorunluDetails of the change; never secrets
createdAtstring (date-time)zorunluactorIdstring (uuid) | nullzorunluNull for the system
actorobject | nullzorunluidstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluuserIdstring (uuid) | nullzorunlu
Find people by username or name
Oturum gerekir
Alanları gösterAlanları gizle
Sorgu parametreleri
qstringisteğe bağlıPart of a username (a leading @ is ignored; Turkish letters match their plain forms) or a name; empty lists the newest accounts. An exact username comes first.
filterstringisteğe bağlıadmins or banned
limitintegeristeğe bağlı1–100, default 30
Yanıttaki data
Tür:
object[]Her öğenin alanları:
idstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluThe player's display name
rolestringzorunluDeğerler:
"admin","user"bannedbooleanzorunlubanReasonstring | nullzorunlucreatedAtstring (date-time)zorunluplayerIdstring (uuid) | nullzorunluphotoobject | nullzorunluTheir profile photo; admins see every photo
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
One person with their activity and recent audit entries
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluThe player's display name
rolestringzorunluDeğerler:
"admin","user"bannedbooleanzorunlubanReasonstring | nullzorunlucreatedAtstring (date-time)zorunluplayerIdstring (uuid) | nullzorunluphotoobject | nullzorunluTheir profile photo; admins see every photo
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
sessionsintegerzorunluOpen sessions
teamsintegerzorunlumatchesintegerzorunluauditobject[]zorunluThe 20 newest entries by or about the person
idstring (uuid)zorunluactionstringzorunlue.g. admin.ban, admin.venue.verify
targetTypestringzorunlutargetIdstring | nullzorunlutargetobject | nullzorunluThe person, team, match or venue the entry is about, if it still exists
kindstringzorunluDeğerler:
"person","team","match","venue"namestringzorunluusernamestring | nullisteğe bağlıuserIdstring (uuid) | nullisteğe bağlıslugstringisteğe bağlısidesstring[]isteğe bağlı
dataanyzorunluDetails of the change; never secrets
createdAtstring (date-time)zorunluactorIdstring (uuid) | nullzorunluNull for the system
actorobject | nullzorunluidstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluuserIdstring (uuid) | nullzorunlu
Make someone an admin or take it away
Oturum gerekir
409 CONFLICT with fields.form = "self" on your own account.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
rolestringzorunlu"admin" gives full access; "user" takes it away
Değerler:
"admin","user"
Yanıttaki data
idstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluThe player's display name
rolestringzorunluDeğerler:
"admin","user"bannedbooleanzorunlubanReasonstring | nullzorunlucreatedAtstring (date-time)zorunluplayerIdstring (uuid) | nullzorunluphotoobject | nullzorunluTheir profile photo; admins see every photo
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Ban someone and end all their sessions
Oturum gerekir
Sign-in then answers 403 BANNED_USER. 409 CONFLICT with fields.form = "self" on your own account.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
reasonstringzorunluShown to admins; 3–300 characters
3–300 karakter
Yanıttaki data
idstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluThe player's display name
rolestringzorunluDeğerler:
"admin","user"bannedbooleanzorunlubanReasonstring | nullzorunlucreatedAtstring (date-time)zorunluplayerIdstring (uuid) | nullzorunluphotoobject | nullzorunluTheir profile photo; admins see every photo
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Lift a ban
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluThe player's display name
rolestringzorunluDeğerler:
"admin","user"bannedbooleanzorunlubanReasonstring | nullzorunlucreatedAtstring (date-time)zorunluplayerIdstring (uuid) | nullzorunluphotoobject | nullzorunluTheir profile photo; admins see every photo
smallstringzorunlu128 px
mediumstringzorunlu512 px
largestringzorunlu1024 px
Set a temporary password and end all their sessions
Oturum gerekir
Pass the password on to the person; they can change it after signing in. 409 CONFLICT with fields.form = "self" on your own account.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
passwordstringzorunluShown once, e.g. kavo-tesu-ribe-mena; only its hash is stored
Venues, verified first
Oturum gerekir
Verified venues first, then by name; at most 200, with no further pages: narrow the list with
q.Alanları gösterAlanları gizle
Sorgu parametreleri
qstringisteğe bağlıPart of a name, city or district
Yanıttaki data
Tür:
object[]Her öğenin alanları:
idstring (uuid)zorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunlucreatedAtstring (date-time)zorunlumatchesintegerzorunlupitchesintegerzorunlucamerasintegerzorunluofficialCamerasintegerzorunlu
Add a venue
Oturum gerekir
Alanları gösterAlanları gizle
İstek gövdesi
namestringzorunlu2–80 karakter
citystring | nullisteğe bağlıen çok 60 karakter
districtstring | nullisteğe bağlıen çok 60 karakter
addressstring | nullisteğe bağlıen çok 200 karakter
verifiedbooleanisteğe bağlıVarsayılan:
false
Yanıttaki data
idstring (uuid)zorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunlucreatedAtstring (date-time)zorunlumatchesintegerzorunlucreatedByobject | nullzorunluidstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunlu
pitchesobject[]zorunluidstring (uuid)zorunlunamestringzorunluindoorbooleanzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlugoalHeightMnumberzorunlumeasuredbooleanzorunluFalse while the sizes are defaults
createdAtstring (date-time)zorunlumatchesintegerzorunlucamerasobject[]zorunluidstring (uuid)zorunlulabelstringzorunluofficialbooleanzorunluThe venue's own recorder; at most one per pitch
activeCalibrationIdstring (uuid) | nullzorunlucreatedAtstring (date-time)zorunlu
One venue with its pitches and cameras
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
idstring (uuid)zorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunlucreatedAtstring (date-time)zorunlumatchesintegerzorunlucreatedByobject | nullzorunluidstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunlu
pitchesobject[]zorunluidstring (uuid)zorunlunamestringzorunluindoorbooleanzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlugoalHeightMnumberzorunlumeasuredbooleanzorunluFalse while the sizes are defaults
createdAtstring (date-time)zorunlumatchesintegerzorunlucamerasobject[]zorunluidstring (uuid)zorunlulabelstringzorunluofficialbooleanzorunluThe venue's own recorder; at most one per pitch
activeCalibrationIdstring (uuid) | nullzorunlucreatedAtstring (date-time)zorunlu
Edit a venue, verify it or take the verification away
Oturum gerekir
Send only the fields to change; an empty string or null clears city, district or address.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
namestringisteğe bağlı2–80 karakter
citystring | nullisteğe bağlıen çok 60 karakter
districtstring | nullisteğe bağlıen çok 60 karakter
addressstring | nullisteğe bağlıen çok 200 karakter
verifiedbooleanisteğe bağlı
Yanıttaki data
idstring (uuid)zorunlunamestringzorunlucitystring | nullzorunludistrictstring | nullzorunluaddressstring | nullzorunluverifiedbooleanzorunlucreatedAtstring (date-time)zorunlumatchesintegerzorunlucreatedByobject | nullzorunluidstring (uuid)zorunludisplayNamestringzorunluhandlestring | nullzorunlu
pitchesobject[]zorunluidstring (uuid)zorunlunamestringzorunluindoorbooleanzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlugoalHeightMnumberzorunlumeasuredbooleanzorunluFalse while the sizes are defaults
createdAtstring (date-time)zorunlumatchesintegerzorunlucamerasobject[]zorunluidstring (uuid)zorunlulabelstringzorunluofficialbooleanzorunluThe venue's own recorder; at most one per pitch
activeCalibrationIdstring (uuid) | nullzorunlucreatedAtstring (date-time)zorunlu
Add a pitch to a venue
Oturum gerekir
Sizes are in metres. 409 CONFLICT with fields.name = "taken" when the venue has a pitch with that name; 422 with fields.widthM = "widerThanLong".
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
namestringzorunlu1–40 karakter
indoorbooleanisteğe bağlıVarsayılan:
falselengthMnumberisteğe bağlı15 ile 110 arasıVarsayılan:
40widthMnumberisteğe bağlı10 ile 75 arasıVarsayılan:
25goalWidthMnumberisteğe bağlı1 ile 7.32 arasıVarsayılan:
3goalHeightMnumberisteğe bağlı1 ile 2.44 arasıVarsayılan:
2measuredbooleanisteğe bağlıVarsayılan:
false
Yanıttaki data
idstring (uuid)zorunlunamestringzorunluindoorbooleanzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlugoalHeightMnumberzorunlumeasuredbooleanzorunluFalse while the sizes are defaults
createdAtstring (date-time)zorunluvenueIdstring (uuid)zorunlu
The venue's pitch admin login, set-up checklist, booking health and recent changes
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
loginobject | nullzorunluusernamestringzorunluThe pitch ID ("Saha ID"), e.g. saha_k7m3qp
enabledbooleanzorunluFalse while switched off: sign-in is refused
readybooleanzorunluThe venue set its own password and accepted the venue terms at its first sign-in
createdAtstring (date-time)zorunlulastSignInAtstring (date-time) | nullzorunluThe newest open session's start
publicPathstring | nullzorunluThe venue's public page (/venues/<slug>) while its login is on
checklistobject[]zorunluPitches added, an official camera on every pitch, location and opening hours set, the login on and its first sign-in done
itemstringzorunluDeğerler:
"pitches","officialCameras","location","hours","login"donebooleanzorunlu
healthobjectzorunlureservationsEnabledbooleanzorunluopenRequestsintegerzorunluBooking requests waiting for an answer that have not lapsed (a request lapses two hours before its start)
oldestPendingAtstring (date-time) | nullzorunluWhen the longest-waiting of them was asked
lastSignInAtstring (date-time) | nullzorunlu
auditobject[]zorunluThe newest entries about the venue or by its login
idstring (uuid)zorunluactionstringzorunlue.g. admin.ban, admin.venue.verify
targetTypestringzorunlutargetIdstring | nullzorunlutargetobject | nullzorunluThe person, team, match or venue the entry is about, if it still exists
kindstringzorunluDeğerler:
"person","team","match","venue"namestringzorunluusernamestring | nullisteğe bağlıuserIdstring (uuid) | nullisteğe bağlıslugstringisteğe bağlısidesstring[]isteğe bağlı
dataanyzorunluDetails of the change; never secrets
createdAtstring (date-time)zorunluactorIdstring (uuid) | nullzorunluNull for the system
actorobject | nullzorunluidstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluuserIdstring (uuid) | nullzorunlu
Make the venue's pitch admin login
Oturum gerekir
Generates the pitch ID and a password, returned once (
Cache-Control: no-store); pass them on to the venue with the panel's address. The venue gets its public address now if it has none. 409 CONFLICT with fields.form = "loginExists": a venue has one login.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
usernamestringzorunluThe pitch ID
passwordstringzorunluShown once, e.g. kavo-tesu-ribe-mena; only its hash is stored. It works for the first sign-in, where the venue sets its own
panelUrlstringzorunluThe panel's address, where the venue signs in
publicUrlstring | nullzorunluThe venue's public page
Switch the venue's login off or on
Oturum gerekir
Off is a ban: sign-in is refused and every session ends; the venue's bookings are switched off and its open requests declined with the answer "@loginOff". On again leaves bookings off until the venue switches them on. 404 when the venue has no login.
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
enabledbooleanzorunlu
Yanıttaki data
usernamestringzorunluThe pitch ID ("Saha ID"), e.g. saha_k7m3qp
enabledbooleanzorunluFalse while switched off: sign-in is refused
readybooleanzorunluThe venue set its own password and accepted the venue terms at its first sign-in
createdAtstring (date-time)zorunlulastSignInAtstring (date-time) | nullzorunluThe newest open session's start
Give the venue's login a new password
Oturum gerekir
Returned once (
Cache-Control: no-store). Every session of the login ends, and the venue sets its own password again at its next sign-in. 404 when the venue has no login.Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
usernamestringzorunluThe pitch ID
passwordstringzorunluShown once, e.g. kavo-tesu-ribe-mena; only its hash is stored. It works for the first sign-in, where the venue sets its own
panelUrlstringzorunluThe panel's address, where the venue signs in
publicUrlstring | nullzorunluThe venue's public page
Edit a pitch
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
namestringisteğe bağlı1–40 karakter
indoorbooleanisteğe bağlılengthMnumberisteğe bağlı15 ile 110 arası
widthMnumberisteğe bağlı10 ile 75 arası
goalWidthMnumberisteğe bağlı1 ile 7.32 arası
goalHeightMnumberisteğe bağlı1 ile 2.44 arası
measuredbooleanisteğe bağlı
Yanıttaki data
idstring (uuid)zorunlunamestringzorunluindoorbooleanzorunlulengthMnumberzorunluwidthMnumberzorunlugoalWidthMnumberzorunlugoalHeightMnumberzorunlumeasuredbooleanzorunluFalse while the sizes are defaults
createdAtstring (date-time)zorunluvenueIdstring (uuid)zorunlu
Add a camera to a pitch
Oturum gerekir
Marking a camera official unmarks the pitch's previous official camera. 409 CONFLICT with fields.label = "taken".
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
labelstringzorunlu1–40 karakter
officialbooleanisteğe bağlıVarsayılan:
false
Yanıttaki data
idstring (uuid)zorunlulabelstringzorunluofficialbooleanzorunluThe venue's own recorder; at most one per pitch
activeCalibrationIdstring (uuid) | nullzorunlucreatedAtstring (date-time)zorunlupitchIdstring (uuid)zorunlu
Rename a camera or mark it official
Oturum gerekir
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
İstek gövdesi
labelstringisteğe bağlı1–40 karakter
officialbooleanisteğe bağlı
Yanıttaki data
idstring (uuid)zorunlulabelstringzorunluofficialbooleanzorunluThe venue's own recorder; at most one per pitch
activeCalibrationIdstring (uuid) | nullzorunlucreatedAtstring (date-time)zorunlupitchIdstring (uuid)zorunlu
Analyses with their match, error and jobs, most recently changed first
Oturum gerekir
Alanları gösterAlanları gizle
Sorgu parametreleri
statusstringisteğe bağlıINGESTING, NEEDS_PREP, TRACKING, NEEDS_LABELS, COMPUTING, PUBLISHED, FAILED
limitintegeristeğe bağlı1–100, default 50
Yanıttaki data
analysesobject[]zorunluidstring (uuid)zorunlustatusstringzorunluDeğerler:
"INGESTING","NEEDS_PREP","TRACKING","NEEDS_LABELS","COMPUTING","PUBLISHED","FAILED"progressnumberzorunlu0–1 within the current stage
errorstring | nullzorunlucreatedAtstring (date-time)zorunluupdatedAtstring (date-time)zorunlupublishedAtstring (date-time) | nullzorunlumatchobjectzorunluidstring (uuid)zorunlutitlestring | nullzorunlustartsAtstring (date-time)zorunlustatusstringzorunluDeğerler:
"planned","played","cancelled"sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunlu
jobsobject[]zorunluNewest first
idstring (uuid)zorunlukindstringzorunluDeğerler:
"ingest","track","stats"statusstringzorunluDeğerler:
"queued","running","succeeded","failed"attemptsintegerzorunlumaxAttemptsintegerzorunluprogressnumberzorunluerrorstring | nullzorunlucreatedAtstring (date-time)zorunlufinishedAtstring (date-time) | nullzorunlu
retryKindstring | nullzorunluWhat POST …/retry would queue; null when there is nothing to retry
Değerler:
"ingest","track","stats"
countsmap<string, integer>zorunlu
Matches waiting for the pitch's official recording
Oturum gerekir
Kick-off has passed, the match is not cancelled and no video has arrived. Admins deliver these recordings with the upload endpoints under Video, once the score is in.
Alanları gösterAlanları gizle
Yanıttaki data
matchesobject[]zorunluOldest kick-off first, at most 50
idstring (uuid)zorunlutitlestring | nullzorunlustartsAtstring (date-time)zorunludurationMinintegerzorunluscoreStatestringzorunluThe video can be uploaded once the score is in
Değerler:
"none","entered","confirmed"sidesobject[]zorunlusidestringzorunluDeğerler:
"A","B"labelstringzorunlugoalsinteger | nullzorunlu
venueobject | nullzorunluidstring (uuid)zorunlunamestringzorunluverifiedbooleanzorunlu
pitchobject | nullzorunluidstring (uuid)zorunlunamestringzorunlu
cameraobject | nullzorunluThe pitch's official camera that records the match
idstring (uuid)zorunlulabelstringzorunlu
totalintegerzorunlu
Queue the failed stage again
Oturum gerekir
Queues a new job of the newest job's kind with the same payload and moves the analysis back to that stage. 409 CONFLICT with fields.form = "nothingToRetry" when the newest job has not failed, and with fields.form = "badPayload" when the failed job's payload no longer matches the worker's job contract or names another analysis or video (POST /api/v1/matches/{id}/analysis/retry builds a fresh one).
Alanları gösterAlanları gizle
Yol parametreleri
idstringzorunlu
Yanıttaki data
jobIdstring (uuid)zorunlukindstringzorunluDeğerler:
"ingest","track","stats"
The newest audit log entries
Oturum gerekir
Alanları gösterAlanları gizle
Sorgu parametreleri
actionstringisteğe bağlıOnly this action, e.g. admin.ban
beforestring (uuid)isteğe bağlıThe nextBefore of the previous page
limitintegeristeğe bağlı1–200, default 50
Yanıttaki data
entriesobject[]zorunluidstring (uuid)zorunluactionstringzorunlue.g. admin.ban, admin.venue.verify
targetTypestringzorunlutargetIdstring | nullzorunlutargetobject | nullzorunluThe person, team, match or venue the entry is about, if it still exists
kindstringzorunluDeğerler:
"person","team","match","venue"namestringzorunluusernamestring | nullisteğe bağlıuserIdstring (uuid) | nullisteğe bağlıslugstringisteğe bağlısidesstring[]isteğe bağlı
dataanyzorunluDetails of the change; never secrets
createdAtstring (date-time)zorunluactorIdstring (uuid) | nullzorunluNull for the system
actorobject | nullzorunluidstring (uuid)zorunluusernamestring | nullzorunlunamestringzorunluuserIdstring (uuid) | nullzorunlu
nextBeforestring (uuid) | nullzorunluactionsstring[]zorunluEvery action in the log, for filtering