{"openapi":"3.0.3","info":{"title":"AffectionPlus public API","version":"1.0.0","description":"Polls and the two-player game \"How well do we know each other?\". No account needed. No personal data required.","contact":{"email":"webmaster@affection.org"},"termsOfService":"https://affectionplus.com/en/terms.html"},"servers":[{"url":"https://api.affection.org"}],"paths":{"/api/sondage":{"get":{"summary":"Results of one poll","parameters":[{"name":"s","in":"query","required":true,"schema":{"type":"string"},"description":"Poll id"},{"name":"l","in":"query","schema":{"type":"string","enum":["fr","en","de","es","it","pt","nl","pl","tr"]},"description":"Language for the per-language counts"},{"name":"p","in":"query","schema":{"type":"string"},"description":"Two-letter country code for the per-country counts"}],"responses":{"200":{"description":"{ ok: true, r: { t: [counts per choice], l: [same language], p: [same country] or null } }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}},"post":{"summary":"Vote in a poll","description":"One vote per token and poll: voting again with the same token replaces the vote. Limit: 120 votes per hour per address.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["s","c","j"],"properties":{"s":{"type":"string","description":"Poll id"},"c":{"type":"integer","description":"Index of the choice"},"l":{"type":"string","description":"Language"},"p":{"type":"string","description":"Two-letter country code (optional)"},"j":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,64}$","description":"Random token that identifies no one"}}}}}},"responses":{"200":{"description":"{ ok: true, r: results }"},"400":{"description":"Error: { ok: false, erreur: <code> }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"429":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}},"/api/sondage/barometre":{"get":{"summary":"Results of all polls","description":"Refreshed every five minutes.","responses":{"200":{"description":"{ ok: true, s: { <poll id>: { t: [counts], l: { <language>: [counts] } } }, maj: <date> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}},"/api/jeu":{"post":{"summary":"Create a two-player game","description":"Limit: 60 creations or joins per hour per address. Games are erased 30 days after creation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"l":{"type":"string","description":"Language"},"prenom":{"type":"string","maxLength":30,"description":"Optional first name"}}}}}},"responses":{"200":{"description":"{ ok: true, code: <6-character invitation code>, j: <secret player token> }"},"400":{"description":"Error: { ok: false, erreur: <code> }"},"429":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}},"get":{"summary":"State of a game, for one of its players","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"}},{"name":"j","in":"query","required":true,"schema":{"type":"string"},"description":"Secret player token"}],"responses":{"200":{"description":"{ ok: true, etat: \"attente\" | \"en_cours\" | \"fini\", l, moi: 0 | 1, joueurs: [{ prenom, fini }], resultats?: { moi: [[...], [...]], devine: [[...], [...]] } }. Answers are returned only when both players have finished."},"403":{"description":"Error: { ok: false, erreur: <code> }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}},"/api/jeu/invitation":{"get":{"summary":"Host first name and free seat for an invitation code","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ ok: true, hote: <first name>, libre: <boolean>, l: <language> }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}},"/api/jeu/rejoindre":{"post":{"summary":"Join a game as the second player","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"prenom":{"type":"string","maxLength":30}}}}}},"responses":{"200":{"description":"{ ok: true, j: <secret player token>, hote: <first name> }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"409":{"description":"The game already has two players"},"429":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}},"/api/jeu/reponses":{"post":{"summary":"Send the answers of a player","description":"moi: answers about yourself; devine: what you think the other player answered. One index per question; the number of choices per question is in https://affectionplus.com/assets/data/jeu2.json.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","j","moi","devine"],"properties":{"code":{"type":"string"},"j":{"type":"string"},"moi":{"type":"array","items":{"type":"integer"}},"devine":{"type":"array","items":{"type":"integer"}}}}}}},"responses":{"200":{"description":"{ ok: true }"},"400":{"description":"Error: { ok: false, erreur: <code> }"},"403":{"description":"Error: { ok: false, erreur: <code> }"},"404":{"description":"Error: { ok: false, erreur: <code> }"},"503":{"description":"Error: { ok: false, erreur: <code> }"}}}}}}