{"success":true,"events":[{"event":"tennis.match.started","game":"tennis","kind":"lifecycle","description":"A tennis match went live. data is the match as /tennis/matches/live returns it.","whenFires":"A match goes live (first point played). Once per match.","status":"active","statusNote":"Sent during the last 7 days.","typicalFrequency":"about 4 per day across all matches","last7Days":27,"lastSentAt":"2026-11-08T22:06:42.173Z","latency":{"p50Ms":128,"p95Ms":282,"deliveries":29,"basis":"From the moment Cito recorded the event to the moment a customer endpoint answered, recent deliveries."},"minimumPlan":"pro","plans":["PRO","BUSINESS","ENTERPRISE","ONE_GAME_STARTER (own game)","BASIC"],"filters":["matchId","tour","tournamentId","playerId"],"filtersNote":"A filter on a field this event does not carry stops every delivery of it, so only filter on the fields listed here.","payloadBytes":{"average":1503,"max":1558,"sampledRows":25},"notes":"The envelope match_id equals data.id.","fields":[{"name":"best_of","types":["number"],"presentPct":100},{"name":"canonical_id","types":["string"],"presentPct":100},{"name":"canonical_tournament_id","types":["string"],"presentPct":100},{"name":"court","types":["null","string"],"presentPct":100},{"name":"current_set","types":["number"],"presentPct":100},{"name":"game_score","types":["string"],"presentPct":100},{"name":"id","types":["string"],"presentPct":100},{"name":"is_simulated","types":["boolean"],"presentPct":100},{"name":"last_updated_at","types":["string"],"presentPct":100},{"name":"live_match_id","types":["string"],"presentPct":100},{"name":"loser","types":["null"],"presentPct":100},{"name":"match_id","types":["string"],"presentPct":100},{"name":"outcome","types":["null"],"presentPct":100},{"name":"player1","types":["object"],"presentPct":100},{"name":"player1.canonical_id","types":["string"],"presentPct":96},{"name":"player1.current_game_score","types":["string"],"presentPct":100},{"name":"player1.id","types":["null","string"],"presentPct":100},{"name":"player1.ioc","types":["null","string"],"presentPct":100},{"name":"player1.is_serving","types":["boolean"],"presentPct":100},{"name":"player1.name","types":["string"],"presentPct":100},{"name":"player1.seed","types":["null"],"presentPct":100},{"name":"player1.sets_won","types":["number"],"presentPct":100},{"name":"player2","types":["object"],"presentPct":100},{"name":"player2.canonical_id","types":["string"],"presentPct":92},{"name":"player2.current_game_score","types":["string"],"presentPct":100},{"name":"player2.id","types":["null","string"],"presentPct":100},{"name":"player2.ioc","types":["null","string"],"presentPct":100},{"name":"player2.is_serving","types":["boolean"],"presentPct":100},{"name":"player2.name","types":["string"],"presentPct":100},{"name":"player2.seed","types":["null"],"presentPct":100},{"name":"player2.sets_won","types":["number"],"presentPct":100},{"name":"round","types":["string"],"presentPct":100},{"name":"round_name","types":["string"],"presentPct":100},{"name":"scheduled_at","types":["string"],"presentPct":100},{"name":"server","types":["number"],"presentPct":100},{"name":"sets","types":["array"],"presentPct":100},{"name":"sets[].is_completed","types":["boolean"],"presentPct":100},{"name":"sets[].player1_games","types":["number"],"presentPct":100},{"name":"sets[].player2_games","types":["number"],"presentPct":100},{"name":"sets[].score","types":["string"],"presentPct":100},{"name":"sets[].set_num","types":["number"],"presentPct":100},{"name":"sets[].set_number","types":["number"],"presentPct":100},{"name":"sets[].tiebreak","types":["null"],"presentPct":100},{"name":"sets[].tiebreak_points","types":["null"],"presentPct":100},{"name":"started_at","types":["string"],"presentPct":100},{"name":"stats_available","types":["boolean"],"presentPct":100},{"name":"stats_points_counted","types":["null","number"],"presentPct":100},{"name":"stats_unavailable_code","types":["null","string"],"presentPct":100},{"name":"status","types":["string"],"presentPct":100},{"name":"surface","types":["string"],"presentPct":100},{"name":"tiebreak_score","types":["null"],"presentPct":100},{"name":"tour","types":["string"],"presentPct":100},{"name":"tournament_display_name","types":["string"],"presentPct":100},{"name":"tournament_id","types":["string"],"presentPct":100},{"name":"tournament_name","types":["string"],"presentPct":100},{"name":"tournament_short_name","types":["string"],"presentPct":100},{"name":"winner","types":["null"],"presentPct":100},{"name":"winner_side","types":["null"],"presentPct":100}],"example":{"event":"tennis.match.started","id":"a1b2c3d4-0000-4000-8000-000000000000","timestamp":"2026-11-08T18:30:03.776Z","event_type":"tennis.match.started","match_id":"s365_2026_4891306","previous_state":null,"data":{"id":"s365_2026_4891306","sets":[{"score":"0-0","set_num":1,"tiebreak":null,"set_number":1,"is_completed":false,"player1_games":0,"player2_games":0,"tiebreak_points":null}],"tour":"ATP","court":"Cancha Central","loser":null,"round":"Q","server":1,"status":"IN_PROGRESS","winner":null,"best_of":3,"outcome":null,"player1":{"id":"atp_200335","ioc":"BRA","name":"Felipe Meligeni","seed":null,"sets_won":0,"is_serving":true,"canonical_id":"atp_200335","current_game_score":"15"},"player2":{"id":"atp_111797","ioc":"CHI","name":"Nicolas Jarry","seed":null,"sets_won":0,"is_serving":false,"canonical_id":"atp_111797","current_game_score":"0"},"surface":"Clay","match_id":"s365_2026_4891306","game_score":"15-0","round_name":"Qualifying (round unspecified)","started_at":"2026-11-08T18:20:00+00:00","current_set":1,"winner_side":null,"canonical_id":"s365_2026_4891306","is_simulated":false,"scheduled_at":"2026-11-08T18:20:00+00:00","live_match_id":"s365_4891306","tournament_id":"s365_atp_2026_live-challenger-lima-6948-7","tiebreak_score":null,"last_updated_at":"2026-11-08T18:29:54.118590+00:00","stats_available":false,"tournament_name":"Lima","stats_points_counted":null,"tournament_short_name":"Lima","stats_unavailable_code":"not_published_yet","canonical_tournament_id":"s365_atp_2026_live-challenger-lima-6948-7","tournament_display_name":"Lima CH"}},"exampleCapturedAt":"2026-11-08T18:30:03.776Z","docsUrl":"https://citoapi.com/docs/webhooks/#tennis-match-started"},{"event":"tennis.set.completed","game":"tennis","kind":"lifecycle","description":"A set finished: data.set_number, data.set_score, data.set_winner_side, data.set_winner, plus the live match.","whenFires":"A set finishes. Once per set; the last set arrives just before tennis.match.completed.","status":"active","statusNote":"Sent during the last 7 days.","typicalFrequency":"about 10 per day across all matches (about 2 per match)","last7Days":68,"lastSentAt":"2026-11-08T22:09:39.087Z","latency":{"p50Ms":125,"p95Ms":299,"deliveries":56,"basis":"From the moment Cito recorded the event to the moment a customer endpoint answered, recent deliveries."},"minimumPlan":"pro","plans":["PRO","BUSINESS","ENTERPRISE","ONE_GAME_STARTER (own game)","BASIC"],"filters":["matchId","tour","tournamentId","playerId"],"filtersNote":"A filter on a field this event does not carry stops every delivery of it, so only filter on the fields listed here.","payloadBytes":{"average":2160,"max":2628,"sampledRows":51},"notes":"data.set_score lists player1 first.","fields":[{"name":"best_of","types":["number"],"presentPct":100},{"name":"canonical_id","types":["string"],"presentPct":100},{"name":"canonical_tournament_id","types":["string"],"presentPct":100},{"name":"court","types":["null","string"],"presentPct":100},{"name":"current_set","types":["number"],"presentPct":100},{"name":"game_score","types":["string"],"presentPct":100},{"name":"id","types":["string"],"presentPct":100},{"name":"is_simulated","types":["boolean"],"presentPct":100},{"name":"last_updated_at","types":["string"],"presentPct":100},{"name":"live_match_id","types":["string"],"presentPct":100},{"name":"loser","types":["null","object"],"presentPct":100},{"name":"loser.age","types":["null"],"presentPct":27},{"name":"loser.canonical_id","types":["string"],"presentPct":27},{"name":"loser.entry","types":["null"],"presentPct":27},{"name":"loser.id","types":["string"],"presentPct":27},{"name":"loser.ioc","types":["null","string"],"presentPct":27},{"name":"loser.is_winner","types":["boolean"],"presentPct":27},{"name":"loser.name","types":["string"],"presentPct":27},{"name":"loser.rank","types":["null","number"],"presentPct":27},{"name":"loser.rank_date","types":["string"],"presentPct":20},{"name":"loser.seed","types":["null"],"presentPct":27},{"name":"match_id","types":["string"],"presentPct":100},{"name":"outcome","types":["null","string"],"presentPct":100},{"name":"player1","types":["object"],"presentPct":100},{"name":"player1.canonical_id","types":["string"],"presentPct":98},{"name":"player1.current_game_score","types":["string"],"presentPct":100},{"name":"player1.id","types":["null","string"],"presentPct":100},{"name":"player1.ioc","types":["null","string"],"presentPct":100},{"name":"player1.is_serving","types":["boolean"],"presentPct":100},{"name":"player1.name","types":["string"],"presentPct":100},{"name":"player1.seed","types":["null"],"presentPct":100},{"name":"player1.sets_won","types":["number"],"presentPct":100},{"name":"player2","types":["object"],"presentPct":100},{"name":"player2.canonical_id","types":["string"],"presentPct":98},{"name":"player2.current_game_score","types":["string"],"presentPct":100},{"name":"player2.id","types":["null","string"],"presentPct":100},{"name":"player2.ioc","types":["null","string"],"presentPct":100},{"name":"player2.is_serving","types":["boolean"],"presentPct":100},{"name":"player2.name","types":["string"],"presentPct":100},{"name":"player2.seed","types":["null"],"presentPct":100},{"name":"player2.sets_won","types":["number"],"presentPct":100},{"name":"result_available","types":["null"],"presentPct":27},{"name":"result_unavailable_reason","types":["null"],"presentPct":27},{"name":"round","types":["string"],"presentPct":100},{"name":"round_name","types":["string"],"presentPct":100},{"name":"scheduled_at","types":["string"],"presentPct":100},{"name":"server","types":["number"],"presentPct":100},{"name":"set","types":["object"],"presentPct":100},{"name":"set_number","types":["number"],"presentPct":100},{"name":"set_score","types":["string"],"presentPct":100},{"name":"set_winner","types":["object"],"presentPct":100},{"name":"set_winner_side","types":["number"],"presentPct":100},{"name":"set_winner.canonical_id","types":["string"],"presentPct":98},{"name":"set_winner.current_game_score","types":["string"],"presentPct":100},{"name":"set_winner.id","types":["null","string"],"presentPct":100},{"name":"set_winner.ioc","types":["null","string"],"presentPct":100},{"name":"set_winner.is_serving","types":["boolean"],"presentPct":100},{"name":"set_winner.name","types":["string"],"presentPct":100},{"name":"set_winner.seed","types":["null"],"presentPct":100},{"name":"set_winner.sets_won","types":["number"],"presentPct":100},{"name":"set.is_completed","types":["boolean"],"presentPct":100},{"name":"set.player1_games","types":["number"],"presentPct":100},{"name":"set.player2_games","types":["number"],"presentPct":100},{"name":"set.score","types":["string"],"presentPct":100},{"name":"set.set_num","types":["number"],"presentPct":100},{"name":"set.set_number","types":["number"],"presentPct":100},{"name":"set.tiebreak","types":["null","string"],"presentPct":100},{"name":"set.tiebreak_points","types":["null","object"],"presentPct":100},{"name":"sets","types":["array"],"presentPct":100},{"name":"sets[].is_completed","types":["boolean"],"presentPct":100},{"name":"sets[].player1_games","types":["number"],"presentPct":100},{"name":"sets[].player2_games","types":["number"],"presentPct":100},{"name":"sets[].score","types":["string"],"presentPct":100},{"name":"sets[].set_num","types":["number"],"presentPct":100},{"name":"sets[].set_number","types":["number"],"presentPct":100},{"name":"sets[].tiebreak","types":["null","string"],"presentPct":100},{"name":"sets[].tiebreak_points","types":["null","object"],"presentPct":100},{"name":"started_at","types":["string"],"presentPct":100},{"name":"stats_available","types":["boolean"],"presentPct":100},{"name":"stats_points_counted","types":["null","number"],"presentPct":73},{"name":"stats_unavailable_code","types":["null","string"],"presentPct":100},{"name":"status","types":["string"],"presentPct":100},{"name":"surface","types":["string"],"presentPct":100},{"name":"tiebreak_score","types":["null"],"presentPct":100},{"name":"tour","types":["string"],"presentPct":100},{"name":"tournament_display_name","types":["string"],"presentPct":100},{"name":"tournament_id","types":["string"],"presentPct":100},{"name":"tournament_name","types":["string"],"presentPct":100},{"name":"tournament_short_name","types":["string"],"presentPct":100},{"name":"winner","types":["null","object"],"presentPct":100},{"name":"winner_side","types":["null","number"],"presentPct":100},{"name":"winner.age","types":["null"],"presentPct":27},{"name":"winner.canonical_id","types":["string"],"presentPct":27},{"name":"winner.entry","types":["null"],"presentPct":27},{"name":"winner.id","types":["string"],"presentPct":27},{"name":"winner.ioc","types":["string"],"presentPct":27},{"name":"winner.is_winner","types":["boolean"],"presentPct":27},{"name":"winner.name","types":["string"],"presentPct":27},{"name":"winner.rank","types":["null","number"],"presentPct":27},{"name":"winner.rank_date","types":["string"],"presentPct":25},{"name":"winner.seed","types":["null"],"presentPct":27}],"example":{"event":"tennis.set.completed","id":"a1b2c3d4-0000-4000-8000-000000000000","timestamp":"2026-11-08T17:19:04.284Z","event_type":"tennis.set.completed","match_id":"s365_2026_4891177","previous_state":null,"data":{"id":"s365_2026_4891177","set":{"score":"6-7","set_num":2,"tiebreak":"4-7","set_number":2,"is_completed":true,"player1_games":6,"player2_games":7,"tiebreak_points":{"loser":4,"winner":7,"player1":4,"player2":7,"in_progress":false}},"sets":[{"score":"1-6","set_num":1,"tiebreak":null,"set_number":1,"is_completed":true,"player1_games":1,"player2_games":6,"tiebreak_points":null},{"score":"6-7","set_num":2,"tiebreak":"4-7","set_number":2,"is_completed":true,"player1_games":6,"player2_games":7,"tiebreak_points":{"loser":4,"winner":7,"player1":4,"player2":7,"in_progress":false}}],"tour":"ATP","court":"CENTRE COURT","loser":{"id":"atp_111200","age":null,"ioc":"SWE","name":"Elias Ymer","rank":245,"seed":null,"entry":null,"is_winner":false,"rank_date":"2026-11-02","canonical_id":"atp_111200"},"round":"R32","server":1,"status":"FINISHED","winner":{"id":"atp_207678","age":null,"ioc":"ARG","name":"Juan Manuel Cerundolo","rank":54,"seed":null,"entry":null,"is_winner":true,"rank_date":"2026-11-02","canonical_id":"atp_207678"},"best_of":3,"outcome":"COMPLETED","player1":{"id":"atp_111200","ioc":"SWE","name":"Elias Ymer","seed":null,"sets_won":0,"is_serving":true,"canonical_id":"atp_111200","current_game_score":"0"},"player2":{"id":"atp_207678","ioc":"ARG","name":"Juan Manuel Cerundolo","seed":null,"sets_won":2,"is_serving":false,"canonical_id":"atp_207678","current_game_score":"0"},"surface":"Hard","match_id":"s365_2026_4891177","set_score":"6-7","game_score":"0-0","round_name":"Round of 32","set_number":2,"set_winner":{"id":"atp_207678","ioc":"ARG","name":"Juan Manuel Cerundolo","seed":null,"sets_won":2,"is_serving":false,"canonical_id":"atp_207678","current_game_score":"0"},"started_at":"2026-11-08T15:30:00+00:00","current_set":2,"winner_side":2,"canonical_id":"s365_2026_4891177","is_simulated":false,"scheduled_at":"2026-11-08T15:30:00+00:00","live_match_id":"s365_4891177","tournament_id":"atp_2026_0429","tiebreak_score":null,"last_updated_at":"2026-11-08T17:18:59.328323+00:00","set_winner_side":2,"stats_available":true,"tournament_name":"Stockholm","result_available":null,"tournament_short_name":"Stockholm","stats_unavailable_code":null,"canonical_tournament_id":"atp_2026_0429","tournament_display_name":"Stockholm","result_unavailable_reason":null}},"exampleCapturedAt":"2026-11-08T17:19:04.284Z","docsUrl":"https://citoapi.com/docs/webhooks/#tennis-set-completed"},{"event":"tennis.match.completed","game":"tennis","kind":"lifecycle","description":"A tennis result is final. data is the match as /tennis/matches/{id} returns it, without stats and point_stats.","whenFires":"The result is final. Once per match.","status":"active","statusNote":"Sent during the last 7 days.","typicalFrequency":"about 4 per day across all matches","last7Days":27,"lastSentAt":"2026-11-08T22:09:39.264Z","latency":null,"minimumPlan":"pro","plans":["PRO","BUSINESS","ENTERPRISE","ONE_GAME_STARTER (own game)","BASIC"],"filters":["matchId","tour","tournamentId","playerId"],"filtersNote":"A filter on a field this event does not carry stops every delivery of it, so only filter on the fields listed here.","payloadBytes":{"average":2792,"max":3129,"sampledRows":17},"notes":"As on /tennis/matches/{id}, player1 is the winner. data.outcome is COMPLETED, RETIREMENT, WALKOVER, DEFAULT or ABANDONED.","fields":[{"name":"best_of","types":["number"],"presentPct":100},{"name":"canonical_id","types":["string"],"presentPct":100},{"name":"canonical_tournament_id","types":["string"],"presentPct":100},{"name":"court","types":["null","string"],"presentPct":100},{"name":"current_set","types":["number"],"presentPct":18},{"name":"date_is_tournament_start","types":["boolean"],"presentPct":82},{"name":"duration_minutes","types":["null"],"presentPct":82},{"name":"game_score","types":["string"],"presentPct":18},{"name":"id","types":["string"],"presentPct":100},{"name":"is_simulated","types":["boolean"],"presentPct":100},{"name":"last_updated_at","types":["string"],"presentPct":18},{"name":"live_match_id","types":["null","string"],"presentPct":100},{"name":"loser","types":["object"],"presentPct":100},{"name":"loser_id","types":["string"],"presentPct":82},{"name":"loser_partner","types":["null"],"presentPct":82},{"name":"loser_partner_id","types":["null"],"presentPct":82},{"name":"loser_sets_won","types":["number"],"presentPct":82},{"name":"loser.age","types":["null"],"presentPct":100},{"name":"loser.canonical_id","types":["string"],"presentPct":100},{"name":"loser.entry","types":["null"],"presentPct":100},{"name":"loser.id","types":["string"],"presentPct":100},{"name":"loser.ioc","types":["null","string"],"presentPct":100},{"name":"loser.is_winner","types":["boolean"],"presentPct":100},{"name":"loser.name","types":["string"],"presentPct":100},{"name":"loser.rank","types":["null","number"],"presentPct":100},{"name":"loser.rank_date","types":["null","string"],"presentPct":94},{"name":"loser.seed","types":["null"],"presentPct":100},{"name":"match_date","types":["string"],"presentPct":82},{"name":"match_id","types":["string"],"presentPct":100},{"name":"outcome","types":["string"],"presentPct":100},{"name":"player1","types":["object"],"presentPct":100},{"name":"player1.age","types":["null"],"presentPct":82},{"name":"player1.canonical_id","types":["string"],"presentPct":100},{"name":"player1.current_game_score","types":["string"],"presentPct":18},{"name":"player1.entry","types":["null"],"presentPct":82},{"name":"player1.id","types":["string"],"presentPct":100},{"name":"player1.ioc","types":["null","string"],"presentPct":100},{"name":"player1.is_serving","types":["boolean"],"presentPct":18},{"name":"player1.is_winner","types":["boolean"],"presentPct":82},{"name":"player1.name","types":["string"],"presentPct":100},{"name":"player1.rank","types":["null","number"],"presentPct":82},{"name":"player1.rank_date","types":["null","string"],"presentPct":82},{"name":"player1.seed","types":["null"],"presentPct":100},{"name":"player1.sets_won","types":["number"],"presentPct":18},{"name":"player2","types":["object"],"presentPct":100},{"name":"player2.age","types":["null"],"presentPct":82},{"name":"player2.canonical_id","types":["string"],"presentPct":100},{"name":"player2.current_game_score","types":["string"],"presentPct":18},{"name":"player2.entry","types":["null"],"presentPct":82},{"name":"player2.id","types":["string"],"presentPct":100},{"name":"player2.ioc","types":["null","string"],"presentPct":100},{"name":"player2.is_serving","types":["boolean"],"presentPct":18},{"name":"player2.is_winner","types":["boolean"],"presentPct":82},{"name":"player2.name","types":["string"],"presentPct":100},{"name":"player2.rank","types":["null","number"],"presentPct":82},{"name":"player2.rank_date","types":["null","string"],"presentPct":82},{"name":"player2.seed","types":["null"],"presentPct":100},{"name":"player2.sets_won","types":["number"],"presentPct":18},{"name":"qualifying_round","types":["null"],"presentPct":82},{"name":"result_available","types":["boolean","null"],"presentPct":100},{"name":"result_unavailable_reason","types":["null"],"presentPct":100},{"name":"round","types":["string"],"presentPct":100},{"name":"round_name","types":["string"],"presentPct":100},{"name":"scheduled_at","types":["null","string"],"presentPct":100},{"name":"score","types":["string"],"presentPct":82},{"name":"server","types":["number"],"presentPct":18},{"name":"sets","types":["array"],"presentPct":100},{"name":"sets[].is_completed","types":["boolean"],"presentPct":18},{"name":"sets[].loser_games","types":["number"],"presentPct":82},{"name":"sets[].player1_games","types":["number"],"presentPct":100},{"name":"sets[].player2_games","types":["number"],"presentPct":100},{"name":"sets[].score","types":["string"],"presentPct":18},{"name":"sets[].set_num","types":["number"],"presentPct":18},{"name":"sets[].set_number","types":["number"],"presentPct":100},{"name":"sets[].tiebreak","types":["null","string"],"presentPct":100},{"name":"sets[].tiebreak_points","types":["null","object"],"presentPct":100},{"name":"sets[].winner_games","types":["number"],"presentPct":82},{"name":"start_time_kind","types":["null"],"presentPct":82},{"name":"start_time_known","types":["boolean"],"presentPct":82},{"name":"started_at","types":["string"],"presentPct":18},{"name":"stats_available","types":["boolean"],"presentPct":18},{"name":"stats_coverage","types":["object"],"presentPct":82},{"name":"stats_coverage.expected_later","types":["boolean"],"presentPct":82},{"name":"stats_coverage.missing","types":["array"],"presentPct":82},{"name":"stats_coverage.missing_by_side","types":["object"],"presentPct":82},{"name":"stats_coverage.note","types":["null","string"],"presentPct":82},{"name":"stats_coverage.reason","types":["null","string"],"presentPct":82},{"name":"stats_coverage.serve_stats","types":["string"],"presentPct":82},{"name":"stats_unavailable_code","types":["null"],"presentPct":18},{"name":"status","types":["string"],"presentPct":100},{"name":"surface","types":["string"],"presentPct":100},{"name":"tiebreak_score","types":["null"],"presentPct":18},{"name":"tour","types":["string"],"presentPct":100},{"name":"tournament","types":["object"],"presentPct":82},{"name":"tournament_display_name","types":["string"],"presentPct":100},{"name":"tournament_id","types":["string"],"presentPct":100},{"name":"tournament_name","types":["string"],"presentPct":100},{"name":"tournament_short_name","types":["string"],"presentPct":100},{"name":"tournament.canonical_id","types":["string"],"presentPct":82},{"name":"tournament.category","types":["string"],"presentPct":82},{"name":"tournament.city","types":["string"],"presentPct":82},{"name":"tournament.country","types":["string"],"presentPct":82},{"name":"tournament.display_name","types":["string"],"presentPct":82},{"name":"tournament.edition_category","types":["string"],"presentPct":82},{"name":"tournament.id","types":["string"],"presentPct":82},{"name":"tournament.level","types":["string"],"presentPct":82},{"name":"tournament.name","types":["string"],"presentPct":82},{"name":"tournament.short_name","types":["string"],"presentPct":82},{"name":"tournament.surface","types":["string"],"presentPct":82},{"name":"tournament.year","types":["number"],"presentPct":82},{"name":"winner","types":["object"],"presentPct":100},{"name":"winner_id","types":["string"],"presentPct":82},{"name":"winner_partner","types":["null"],"presentPct":82},{"name":"winner_partner_id","types":["null"],"presentPct":82},{"name":"winner_sets_won","types":["number"],"presentPct":82},{"name":"winner_side","types":["number"],"presentPct":100},{"name":"winner.age","types":["null"],"presentPct":100},{"name":"winner.canonical_id","types":["string"],"presentPct":100},{"name":"winner.entry","types":["null"],"presentPct":100},{"name":"winner.id","types":["string"],"presentPct":100},{"name":"winner.ioc","types":["string"],"presentPct":100},{"name":"winner.is_winner","types":["boolean"],"presentPct":100},{"name":"winner.name","types":["string"],"presentPct":100},{"name":"winner.rank","types":["null","number"],"presentPct":100},{"name":"winner.rank_date","types":["null","string"],"presentPct":100},{"name":"winner.seed","types":["null"],"presentPct":100}],"example":{"event":"tennis.match.completed","id":"a1b2c3d4-0000-4000-8000-000000000000","timestamp":"2026-11-08T18:17:13.519Z","event_type":"tennis.match.completed","match_id":"s365_2026_4891303","previous_state":null,"data":{"id":"s365_2026_4891303","sets":[{"tiebreak":null,"set_number":1,"loser_games":6,"winner_games":7,"player1_games":7,"player2_games":6,"tiebreak_points":null},{"tiebreak":null,"set_number":2,"loser_games":5,"winner_games":7,"player1_games":7,"player2_games":5,"tiebreak_points":null}],"tour":"ATP","court":null,"loser":{"id":"atp_127108","age":null,"ioc":"BRA","name":"Igor Ribeiro Marcondes","rank":279,"seed":null,"entry":null,"is_winner":false,"rank_date":"2026-11-02","canonical_id":"atp_127108"},"round":"Q","score":"7-6 7-5","status":"COMPLETED","winner":{"id":"atp_212944","age":null,"ioc":"JPN","name":"Ryo Tabata","rank":934,"seed":null,"entry":null,"is_winner":true,"rank_date":"2026-11-02","canonical_id":"atp_212944"},"best_of":3,"outcome":"COMPLETED","player1":{"id":"atp_212944","age":null,"ioc":"JPN","name":"Ryo Tabata","rank":934,"seed":null,"entry":null,"is_winner":true,"rank_date":"2026-11-02","canonical_id":"atp_212944"},"player2":{"id":"atp_127108","age":null,"ioc":"BRA","name":"Igor Ribeiro Marcondes","rank":279,"seed":null,"entry":null,"is_winner":false,"rank_date":"2026-11-02","canonical_id":"atp_127108"},"surface":"Clay","loser_id":"atp_127108","match_id":"s365_2026_4891303","winner_id":"atp_212944","match_date":"2026-11-08","round_name":"Qualifying (round unspecified)","tournament":{"id":"s365_atp_2026_live-challenger-lima-6948-7","city":"Lima","name":"Lima CH","year":2026,"level":"C","country":"PER","surface":"Clay","category":"challenger","short_name":"Lima","canonical_id":"s365_atp_2026_live-challenger-lima-6948-7","display_name":"Lima CH","edition_category":"Challenger 75"},"winner_side":1,"canonical_id":"s365_2026_4891303","is_simulated":false,"scheduled_at":null,"live_match_id":null,"loser_partner":null,"tournament_id":"s365_atp_2026_live-challenger-lima-6948-7","loser_sets_won":0,"stats_coverage":{"note":"Some serve statistics were not published for this match; the fields in missing are null.","reason":"partially_published","missing":["break_points_saved","break_points_faced"],"serve_stats":"partial","expected_later":false,"missing_by_side":{"loser":["break_points_saved","break_points_faced"],"winner":["break_points_saved","break_points_faced"]}},"winner_partner":null,"start_time_kind":null,"tournament_name":"Lima CH","winner_sets_won":2,"duration_minutes":null,"loser_partner_id":null,"qualifying_round":null,"result_available":true,"start_time_known":false,"winner_partner_id":null,"tournament_short_name":"Lima","canonical_tournament_id":"s365_atp_2026_live-challenger-lima-6948-7","tournament_display_name":"Lima CH","date_is_tournament_start":false,"result_unavailable_reason":null}},"exampleCapturedAt":"2026-11-08T18:17:13.519Z","docsUrl":"https://citoapi.com/docs/webhooks/#tennis-match-completed"},{"event":"tennis.match.stats_ready","game":"tennis","kind":"lifecycle","description":"The full serve statistics of a completed match are available. data is the full /tennis/matches/{id} body.","whenFires":"data.stats_coverage.serve_stats becomes \"full\", which can be minutes or hours after the result. Once per match; not sent for matches whose statistics stay partial.","status":"active","statusNote":"Sent during the last 7 days.","typicalFrequency":"about 5 per week","last7Days":5,"lastSentAt":"2026-11-08T21:42:48.401Z","latency":null,"minimumPlan":"pro","plans":["PRO","BUSINESS","ENTERPRISE","ONE_GAME_STARTER (own game)","BASIC"],"filters":["matchId","tour","tournamentId","playerId"],"filtersNote":"A filter on a field this event does not carry stops every delivery of it, so only filter on the fields listed here.","payloadBytes":{"average":4577,"max":5019,"sampledRows":4},"fields":[{"name":"best_of","types":["number"],"presentPct":100},{"name":"canonical_id","types":["string"],"presentPct":100},{"name":"canonical_tournament_id","types":["string"],"presentPct":100},{"name":"court","types":["null","string"],"presentPct":100},{"name":"date_is_tournament_start","types":["boolean"],"presentPct":100},{"name":"duration_minutes","types":["null","number"],"presentPct":100},{"name":"id","types":["string"],"presentPct":100},{"name":"is_simulated","types":["boolean"],"presentPct":100},{"name":"live_match_id","types":["null"],"presentPct":100},{"name":"loser","types":["object"],"presentPct":100},{"name":"loser_id","types":["string"],"presentPct":100},{"name":"loser_partner","types":["null"],"presentPct":100},{"name":"loser_partner_id","types":["null"],"presentPct":100},{"name":"loser_sets_won","types":["number"],"presentPct":100},{"name":"loser.age","types":["null"],"presentPct":100},{"name":"loser.canonical_id","types":["string"],"presentPct":100},{"name":"loser.entry","types":["null"],"presentPct":100},{"name":"loser.id","types":["string"],"presentPct":100},{"name":"loser.ioc","types":["null","string"],"presentPct":100},{"name":"loser.is_winner","types":["boolean"],"presentPct":100},{"name":"loser.name","types":["string"],"presentPct":100},{"name":"loser.rank","types":["null","number"],"presentPct":100},{"name":"loser.rank_date","types":["null","string"],"presentPct":100},{"name":"loser.seed","types":["null"],"presentPct":100},{"name":"match_date","types":["string"],"presentPct":100},{"name":"match_id","types":["string"],"presentPct":100},{"name":"outcome","types":["string"],"presentPct":100},{"name":"player1","types":["object"],"presentPct":100},{"name":"player1.age","types":["null"],"presentPct":100},{"name":"player1.canonical_id","types":["string"],"presentPct":100},{"name":"player1.entry","types":["null"],"presentPct":100},{"name":"player1.id","types":["string"],"presentPct":100},{"name":"player1.ioc","types":["string"],"presentPct":100},{"name":"player1.is_winner","types":["boolean"],"presentPct":100},{"name":"player1.name","types":["string"],"presentPct":100},{"name":"player1.rank","types":["null","number"],"presentPct":100},{"name":"player1.rank_date","types":["null","string"],"presentPct":100},{"name":"player1.seed","types":["null"],"presentPct":100},{"name":"player2","types":["object"],"presentPct":100},{"name":"player2.age","types":["null"],"presentPct":100},{"name":"player2.canonical_id","types":["string"],"presentPct":100},{"name":"player2.entry","types":["null"],"presentPct":100},{"name":"player2.id","types":["string"],"presentPct":100},{"name":"player2.ioc","types":["null","string"],"presentPct":100},{"name":"player2.is_winner","types":["boolean"],"presentPct":100},{"name":"player2.name","types":["string"],"presentPct":100},{"name":"player2.rank","types":["null","number"],"presentPct":100},{"name":"player2.rank_date","types":["null","string"],"presentPct":100},{"name":"player2.seed","types":["null"],"presentPct":100},{"name":"point_stats","types":["null","object"],"presentPct":100},{"name":"point_stats.loser","types":["object"],"presentPct":50},{"name":"point_stats.winner","types":["object"],"presentPct":50},{"name":"qualifying_round","types":["null"],"presentPct":100},{"name":"result_available","types":["boolean"],"presentPct":100},{"name":"result_unavailable_reason","types":["null"],"presentPct":100},{"name":"round","types":["string"],"presentPct":100},{"name":"round_name","types":["string"],"presentPct":100},{"name":"scheduled_at","types":["null","string"],"presentPct":100},{"name":"score","types":["string"],"presentPct":100},{"name":"sets","types":["array"],"presentPct":100},{"name":"sets[].loser_games","types":["number"],"presentPct":100},{"name":"sets[].player1_games","types":["number"],"presentPct":100},{"name":"sets[].player2_games","types":["number"],"presentPct":100},{"name":"sets[].set_number","types":["number"],"presentPct":100},{"name":"sets[].tiebreak","types":["null","object"],"presentPct":100},{"name":"sets[].tiebreak_points","types":["null","object"],"presentPct":100},{"name":"sets[].winner_games","types":["number"],"presentPct":100},{"name":"start_time_kind","types":["null","string"],"presentPct":100},{"name":"start_time_known","types":["boolean"],"presentPct":100},{"name":"stats","types":["object"],"presentPct":100},{"name":"stats_coverage","types":["object"],"presentPct":100},{"name":"stats_coverage.expected_later","types":["boolean"],"presentPct":100},{"name":"stats_coverage.missing","types":["array"],"presentPct":100},{"name":"stats_coverage.missing_by_side","types":["object"],"presentPct":100},{"name":"stats_coverage.note","types":["null"],"presentPct":100},{"name":"stats_coverage.reason","types":["null"],"presentPct":100},{"name":"stats_coverage.serve_stats","types":["string"],"presentPct":100},{"name":"stats.loser","types":["object"],"presentPct":100},{"name":"stats.winner","types":["object"],"presentPct":100},{"name":"status","types":["string"],"presentPct":100},{"name":"surface","types":["string"],"presentPct":100},{"name":"tour","types":["string"],"presentPct":100},{"name":"tournament","types":["object"],"presentPct":100},{"name":"tournament_display_name","types":["string"],"presentPct":100},{"name":"tournament_id","types":["string"],"presentPct":100},{"name":"tournament_name","types":["string"],"presentPct":100},{"name":"tournament_short_name","types":["string"],"presentPct":100},{"name":"tournament.canonical_id","types":["string"],"presentPct":100},{"name":"tournament.category","types":["string"],"presentPct":100},{"name":"tournament.city","types":["string"],"presentPct":100},{"name":"tournament.country","types":["string"],"presentPct":100},{"name":"tournament.display_name","types":["string"],"presentPct":100},{"name":"tournament.edition_category","types":["string"],"presentPct":100},{"name":"tournament.id","types":["string"],"presentPct":100},{"name":"tournament.level","types":["string"],"presentPct":100},{"name":"tournament.name","types":["string"],"presentPct":100},{"name":"tournament.short_name","types":["string"],"presentPct":100},{"name":"tournament.surface","types":["string"],"presentPct":100},{"name":"tournament.year","types":["number"],"presentPct":100},{"name":"winner","types":["object"],"presentPct":100},{"name":"winner_id","types":["string"],"presentPct":100},{"name":"winner_partner","types":["null"],"presentPct":100},{"name":"winner_partner_id","types":["null"],"presentPct":100},{"name":"winner_sets_won","types":["number"],"presentPct":100},{"name":"winner_side","types":["number"],"presentPct":100},{"name":"winner.age","types":["null"],"presentPct":100},{"name":"winner.canonical_id","types":["string"],"presentPct":100},{"name":"winner.entry","types":["null"],"presentPct":100},{"name":"winner.id","types":["string"],"presentPct":100},{"name":"winner.ioc","types":["string"],"presentPct":100},{"name":"winner.is_winner","types":["boolean"],"presentPct":100},{"name":"winner.name","types":["string"],"presentPct":100},{"name":"winner.rank","types":["null","number"],"presentPct":100},{"name":"winner.rank_date","types":["null","string"],"presentPct":100},{"name":"winner.seed","types":["null"],"presentPct":100}],"example":{"event":"tennis.match.stats_ready","id":"a1b2c3d4-0000-4000-8000-000000000000","timestamp":"2026-11-08T20:21:49.492Z","event_type":"tennis.match.stats_ready","match_id":"s365_2026_4891209","previous_state":null,"data":{"id":"s365_2026_4891209","sets":[{"tiebreak":{"loser_points":3,"winner_points":7},"set_number":1,"loser_games":6,"winner_games":7,"player1_games":7,"player2_games":6,"tiebreak_points":{"loser":3,"winner":7,"player1":7,"player2":3,"in_progress":false}},{"tiebreak":null,"set_number":2,"loser_games":4,"winner_games":6,"player1_games":6,"player2_games":4,"tiebreak_points":null}],"tour":"ATP","court":"Center","loser":{"id":"atp_365_80707","age":null,"ioc":null,"name":"Stephanos Schinas","rank":null,"seed":null,"entry":null,"is_winner":false,"rank_date":null,"canonical_id":"atp_365_80707"},"round":"Q","score":"7-6 6-4","stats":{"loser":{"aces":7,"serve_points":69,"double_faults":5,"first_serve_pct":60.9,"first_serves_in":42,"first_serves_won":31,"total_points_won":65,"return_points_won":19,"second_serves_won":15,"break_points_faced":4,"break_points_saved":2,"max_games_in_a_row":2,"points_won_last_10":6,"service_points_won":46,"first_serve_win_pct":73.8,"first_serve_won_pct":73.8,"max_points_in_a_row":5,"return_points_played":66,"second_serve_win_pct":55.6,"second_serve_won_pct":55.6,"service_games_played":11,"service_points_played":69,"break_points_converted":1,"break_points_saved_pct":50,"first_serve_points_won":31,"first_return_points_won":12,"second_serve_points_won":15,"second_return_points_won":7,"break_point_opportunities":2},"winner":{"aces":0,"serve_points":66,"double_faults":0,"first_serve_pct":66.7,"first_serves_in":44,"first_serves_won":32,"total_points_won":70,"return_points_won":23,"second_serves_won":15,"break_points_faced":2,"break_points_saved":1,"max_games_in_a_row":3,"points_won_last_10":4,"service_points_won":47,"first_serve_win_pct":72.7,"first_serve_won_pct":72.7,"max_points_in_a_row":5,"return_points_played":69,"second_serve_win_pct":68.2,"second_serve_won_pct":68.2,"service_games_played":11,"service_points_played":66,"break_points_converted":2,"break_points_saved_pct":50,"first_serve_points_won":32,"first_return_points_won":11,"second_serve_points_won":15,"second_return_points_won":12,"break_point_opportunities":4}},"status":"COMPLETED","winner":{"id":"atp_365_54218","age":null,"ioc":"UKR","name":"Nikita Mashtakov","rank":null,"seed":null,"entry":null,"is_winner":true,"rank_date":null,"canonical_id":"atp_365_54218"},"best_of":3,"outcome":"COMPLETED","player1":{"id":"atp_365_54218","age":null,"ioc":"UKR","name":"Nikita Mashtakov","rank":null,"seed":null,"entry":null,"is_winner":true,"rank_date":null,"canonical_id":"atp_365_54218"},"player2":{"id":"atp_365_80707","age":null,"ioc":null,"name":"Stephanos Schinas","rank":null,"seed":null,"entry":null,"is_winner":false,"rank_date":null,"canonical_id":"atp_365_80707"},"surface":"Hard","loser_id":"atp_365_80707","match_id":"s365_2026_4891209","winner_id":"atp_365_54218","match_date":"2026-11-08","round_name":"Qualifying (round unspecified)","tournament":{"id":"s365_atp_2026_live-challenger-hersonissos-8606-9","city":"Hersonissos","name":"Hersonissos CH","year":2026,"level":"C","country":"GRE","surface":"Hard","category":"challenger","short_name":"Hersonissos","canonical_id":"s365_atp_2026_live-challenger-hersonissos-8606-9","display_name":"Hersonissos CH","edition_category":"Challenger 50"},"point_stats":{"loser":{"games_won":10,"points_won":65,"service_games":11,"max_games_in_row":2,"max_points_in_row":5,"return_points_won":19,"service_games_won":9,"break_points_faced":4,"break_points_saved":2,"points_won_last_10":6,"service_points_won":46,"service_points_played":69,"break_points_converted":1,"break_point_opportunities":2},"winner":{"games_won":13,"points_won":70,"service_games":11,"max_games_in_row":3,"max_points_in_row":5,"return_points_won":23,"service_games_won":10,"break_points_faced":2,"break_points_saved":1,"points_won_last_10":4,"service_points_won":47,"service_points_played":66,"break_points_converted":2,"break_point_opportunities":4}},"winner_side":1,"canonical_id":"s365_2026_4891209","is_simulated":false,"scheduled_at":"2026-11-08T14:45:54+00:00","live_match_id":null,"loser_partner":null,"tournament_id":"s365_atp_2026_live-challenger-hersonissos-8606-9","loser_sets_won":0,"stats_coverage":{"note":null,"reason":null,"missing":[],"serve_stats":"full","expected_later":false,"missing_by_side":{"loser":[],"winner":[]}},"winner_partner":null,"start_time_kind":"actual","tournament_name":"Hersonissos CH","winner_sets_won":2,"duration_minutes":94,"loser_partner_id":null,"qualifying_round":null,"result_available":true,"start_time_known":true,"winner_partner_id":null,"tournament_short_name":"Hersonissos","canonical_tournament_id":"s365_atp_2026_live-challenger-hersonissos-8606-9","tournament_display_name":"Hersonissos CH","date_is_tournament_start":false,"result_unavailable_reason":null}},"exampleCapturedAt":"2026-11-08T20:21:49.492Z","docsUrl":"https://citoapi.com/docs/webhooks/#tennis-match-stats_ready"}],"count":4,"games":["lol","cod","fortnite","cs2","dota2","tennis","ufc"],"plans":{"live_delivery":{"plans":["PRO","BUSINESS","ENTERPRISE"],"names":"Pro and Scale (and Enterprise)","pro_monthly_usd":59,"scale_monthly_usd":100},"closed_plans":"Accounts still on the closed One Game Starter and Basic plans keep webhooks for the events their plan allows. They cannot subscribe to the real-time CS2 events.","free_and_starter":"Free and Starter accounts can create a test inbox (POST /api/v1/webhook-inbox) and send sample events to it. Live delivery needs Pro or Scale.","upgrade_url":"https://citoapi.com/signup/pro?checkout=1&source=webhook_access","limits":{"webhooks_per_account":5}},"setup":[{"step":1,"title":"Pick events","detail":"GET /api/v1/webhooks/events lists every event, with status, volume, fields and a real example. Subscribe to the fewest that do the job: cs2.player.state_changed alone is hundreds of thousands of requests a week."},{"step":2,"title":"Get a URL","detail":"A public HTTPS route that accepts POST and answers 2xx within 10 seconds. No server yet? POST /api/v1/webhook-inbox gives you a hosted temporary URL, on any plan."},{"step":3,"title":"Create the webhook","detail":"POST /api/v1/webhooks with x-api-key and {\"url\":\"...\",\"events\":[\"...\"],\"filters\":{...}}. Needs Pro or Scale. Save webhook.secret from the response: it is shown once."},{"step":4,"title":"Verify signatures","detail":"HMAC-SHA256 of the raw request body with your secret, hex, compared with the X-Cito-Signature header. Hash the raw bytes before parsing JSON."},{"step":5,"title":"Send a test","detail":"POST /api/v1/webhooks/{id}/test with {\"event\":\"cs2.match.completed\"} sends a real recent sample, signed, marked as a test (X-Cito-Test: true, data.test true, test true). The response has the status code, latency and a plain-English diagnosis."},{"step":6,"title":"Watch deliveries","detail":"GET /api/v1/webhooks/{id}/deliveries lists each delivery. Handle retries with the payload id as your idempotency key."}],"envelope":{"fields":{"event":"The event name.","id":"Unique id of this event. Use it as your idempotency key (same as the X-Cito-Event-Id header).","timestamp":"When Cito sent this delivery, ISO 8601 UTC.","event_type":"The event name.","match_id":"The match id, or null when the event is not about one match.","previous_state":"The state before the change, on events that have one. Otherwise null.","data":"The event body. See fields and example on each event."},"test_markers":"A test delivery has test: true on the envelope, data.test true and the header X-Cito-Test: true. A replay has data.replayed true and data.original_event_id."},"signature_headers":["X-Cito-Signature","X-Cito-Event","X-Cito-Event-Id","X-Cito-Timestamp","X-Cito-Delivery-Attempt","X-Cito-Test (test deliveries only)"],"signing":{"algorithm":"HMAC-SHA256","signedContent":"UTF-8 bytes of the exact JSON request body sent by Cito","bodySerialization":"JSON.stringify(payload)","signatureHeader":"X-Cito-Signature","signatureEncoding":"hex","signaturePrefix":"none","secretFormat":"Use the exact webhook secret value shown when the webhook is created or regenerated. No whsec_ prefix is used.","verificationRule":"Verify against the raw request body bytes before reparsing or reserializing JSON.","sampleSecret":"cito_test_secret_123","samplePayload":{"event":"lol.live.state","id":"sample-event-id-123","timestamp":"2026-06-07T16:00:00.000Z","data":{"gameId":"lol-game-123","matchId":"lol-match-123","league":"LEC","gameTime":1337,"blueTeam":{"tag":"G2","kills":7,"gold":24800,"towers":3,"dragons":2,"barons":0},"redTeam":{"tag":"FNC","kills":5,"gold":23700,"towers":2,"dragons":1,"barons":0}}},"samplePayloadString":"{\"event\":\"lol.live.state\",\"id\":\"sample-event-id-123\",\"timestamp\":\"2026-06-07T16:00:00.000Z\",\"data\":{\"gameId\":\"lol-game-123\",\"matchId\":\"lol-match-123\",\"league\":\"LEC\",\"gameTime\":1337,\"blueTeam\":{\"tag\":\"G2\",\"kills\":7,\"gold\":24800,\"towers\":3,\"dragons\":2,\"barons\":0},\"redTeam\":{\"tag\":\"FNC\",\"kills\":5,\"gold\":23700,\"towers\":2,\"dragons\":1,\"barons\":0}}}","sampleSignature":"97db77f5cd96e09a70dcf6cc75fc5d92d780c41ce82c853b51e4070954c54171","sampleHeaders":{"Content-Type":"application/json","X-Cito-Signature":"97db77f5cd96e09a70dcf6cc75fc5d92d780c41ce82c853b51e4070954c54171","X-Cito-Event":"lol.live.state","X-Cito-Event-Id":"sample-event-id-123","X-Cito-Timestamp":"2026-06-07T16:00:00.000Z","X-Cito-Delivery-Attempt":"1"}},"delivery":{"timeout_ms":10000,"attempts_per_event":3,"retry_gaps_seconds":[1,2],"retried":"Timeouts, network errors, 5xx, 408 and 429.","not_retried":"Other 4xx answers.","success":"Any 2xx answer.","redirects":"307 and 308 keep the POST. 301, 302 and 303 turn it into a GET with no body, so set the webhook to the final URL.","ordering":"Not guaranteed. Use data timestamps or seq-like fields, and treat each event independently.","idempotency":"Use the payload id / X-Cito-Event-Id header as your idempotency key.","failure_pause":{"after_consecutive_failures":3,"pause_minutes":[1,5,15,30],"behaviour":"After 3 failed events in a row, Cito pauses sending to that webhook: 1, then 5, 15 and 30 minutes (30 is the cap). Events that occur during a pause are NOT queued for you. They are logged with status \"skipped_backoff\" and are not sent again unless you ask. Any success ends the pause.","after_recovery":"When the first delivery after a pause succeeds, Cito re-sends up to 50 missed match and result events from the last 24 hours, oldest first, with data.catch_up true and the same event id. POST /api/v1/webhooks/{id}/catch-up re-sends any still missing. POST /api/v1/webhooks/{id}/replay re-sends a specific event or match."},"auto_disable":{"behaviour":"A webhook is switched off (isActive false, reason in lastError) after 100 failures in a row, 20 in a row when the answer is permanent (401, 403, 404, 410, 530, DNS or certificate errors), or 50 in a row with no success for 7 days.","re_enable":"POST /api/v1/webhooks/{id}/reset, or PATCH with {\"isActive\":true}."},"log_note":"attempt in the delivery log is currently always 1, even when retries happened. X-Cito-Delivery-Attempt on the request is the real attempt number.","outbound_addresses":"Deliveries come from Cito servers and may change. Verify X-Cito-Signature instead of allow-listing addresses."},"filters":{"note":"Set on a webhook as {\"filters\":{\"league\":\"LEC\"}}. Each field takes one value or a list, compared case-insensitively. Fields per event are on each event.","fields":{"league":"data.league (for example LEC, Worlds, or cs2 for CS2 events).","matchId":"data.matchId.","gameId":"data.gameId.","side":"data.side.","tour":"Tennis: ATP, WTA and so on.","tournamentId":"Tennis tournament id.","playerId":"Tennis: matches either player."},"tennis_matchId":"For tennis events, matchId matches data.id."},"endpoints":{"catalog":"GET /api/v1/webhooks/events?game=&event=&examples=false&fields=false (public)","openapi":"GET /api/v1/webhooks/openapi.json (public)","list":"GET /api/v1/webhooks","get":"GET /api/v1/webhooks/{id}","create":"POST /api/v1/webhooks","update":"PATCH /api/v1/webhooks/{id}","delete":"DELETE /api/v1/webhooks/{id}","test":"POST /api/v1/webhooks/{id}/test","regenerate_secret":"POST /api/v1/webhooks/{id}/regenerate-secret","reset":"POST /api/v1/webhooks/{id}/reset","deliveries":"GET /api/v1/webhooks/{id}/deliveries","delivery":"GET /api/v1/webhooks/{id}/deliveries/{deliveryId}","replay":"POST /api/v1/webhooks/{id}/replay","catch_up":"POST /api/v1/webhooks/{id}/catch-up","inbox":"POST, GET /api/v1/webhook-inbox"},"auth":"Management routes take your API key (x-api-key header or Authorization: Bearer) or a dashboard session. A key only reaches its own account's webhooks.","measured_at":"2026-11-08T20:30:57.835Z","docs":"https://citoapi.com/docs/webhooks/","dashboard":"https://citoapi.com/dashboard/webhooks"}