As a CTF organizer you can provide us a scoreboard feed, so we can parse it in realtime and provide more information to CTF teams.
In your CTF management panel you can specify the URLs for the feeds. Feed polling interval is 60 sec.
On getting the feed URL we expect to receive a JSON object/array with a corresponding set of fields.

Warning! Feed format development is in progress — don't implement maximal feeds before the official announce!

After the CTF finish you can submit the final results via form available at: Manage CTFs -> Existing CTF events -> Manage results.

Team standings feed

This feed is used to render a real-time scoreboard for your CTF. Here is the list of fields:

Feed Examples

Example 1. Minimal scoreboard
This example shows the minimal set of information needed to render a real-time scoreboard.
{
	"standings": [
		{ "pos": 1, "team": "Intergalactic Pwners", "score": 1700 },
		{ "pos": 2, "team": "h4ckmeifyouc4n", "score": 1200 },
		{ "pos": 3, "team": "MV Tech", "score": 100 }
	]
}

Example 2. Maximum scoreboard (Jeopardy)
This example shows off all available fields as can be used in a Jeopardy-style CTF.
{
	"tasks": [ "PPC 100", "Web 200", "Beer Challenge" ],
	"standings": [
		{ "pos": 1, "team": "Intergalactic Pwners", "score": 401, 
			"taskStats": {
				"PPC 100": { "points": 103, "time": 1352647482 },
				"Web 200": { "points": 201, "time": 1352652183 },
				"Beer Challenge": { "points": 97, "time": 1352651383 }
			}, 
			"lastAccept": 1352652183 },
		{ "pos": 2, "team": "h4ckmeifyouc4n", "score": 291, 
			"taskStats": { 
				"Web 200" : { "points": 202, "time": 1352649284 },
				"Beer Challenge": { "points": 89, "time": 1352649511 }
			}, 
			"lastAccept": 1352649511 },
		{ "pos": 3, "team": "MV Tech", "score": 203, 
			"taskStats": { 
				"Web 200": { "points": 203, "time": 1352650418 }
			}, 
			"lastAccept": 1352650418 }
	]
}

Example 3. Maximum scoreboard (Attack-Defense)
This example shows off all available fields as can be used in a Classic Attack-Defense CTF.
{
	"tasks": [ "Attack", "Defense", "Advisories" ],
	"standings": [
		{ "pos": 1, "team": "Intergalactic Pwners", "score": 1, 
			"taskStats": {
				"Attack": { "points": 1 },
				"Defence": { "points": 0.984 },
				"Advisories": { "points": 1 }
			}
		},
		{ "pos": 2, "team": "h4ckmeifyouc4n", "score": 0.548, 
			"taskStats": {
				"Attack": { "points": 0.733 },
				"Defence": { "points": 0.651 },
				"Advisories": { "points": 0.25 }
			}
		},
		{ "pos": 3, "team": "MV Tech", "score": 0.283, 
			"taskStats": {
				"Attack": { "points": 0.49 },
				"Defence": { "points": 0.796 },
				"Advisories": { "points": 0 }
			}
		}
	]
}

Capture log feed

This feed is used to provide additional statistics, such as "Time to First Capture" for Jeopardy CTFs and "Team vs Team attack" for classic CTFs.
We expect to receive a JSON array, consisting of flag capture events. Each event object has the following fields:
The URL that you specify for this type of feed will receive a "lastId" GET parameter. The log should only include the events that happened later than this value. Also, if you want, you can purge from your DB the events that have ID ≤ to this value: we already have them recorded, guaranteed.

Feed Examples

Example 1. An exhaustive log
This example shows off all available fields in a CTF similar to iCTF, that is mixed Jeopardy/Classic (i.e., has Tasks as well as the Services).
First request: ?lastId=0
[
	{ "id": 1, "time": 1352656809, "type": "taskWrong", "team": "More Smoked Leet Chicken", "task": "37", "pointsDelta": 0 },
	{ "id": 2, "time": 1352656827, "type": "flagRead", "team": "PPP", "victim": "More Smoked Leet Chicken", "task": "reactor" },
	{ "id": 3, "time": 1352656829, "type": "taskCorrect", "team": "More Smoked Leet Chicken", "task": "37", "pointsDelta": 500 },
	{ "id": 4, "time": 1352656846, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "perlache" },
	{ "id": 5, "time": 1352656855, "type": "flagRead", "team": "PPP", "victim": "More Smoked Leet Chicken", "task": "reactor" },
	{ "id": 6, "time": 1352656861, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "gitnick" },
	{ "id": 7, "time": 1352656871, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "ips" }
]
Second request, in a minute: ?lastId=7
[
	{ "id": 8, "time": 1352656875, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 9, "time": 1352656876, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 10, "time": 1352656879, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 11, "time": 1352656881, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "gitnick" },
	{ "id": 12, "time": 1352656881, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 13, "time": 1352656886, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 14, "time": 1352656889, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 15, "time": 1352656889, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 16, "time": 1352656891, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "reactor" },
	{ "id": 17, "time": 1352656896, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "ips" },
	{ "id": 18, "time": 1352656899, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 19, "time": 1352656904, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 20, "time": 1352656907, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "perlache" },
	{ "id": 21, "time": 1352656907, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 22, "time": 1352656907, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 23, "time": 1352656909, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 24, "time": 1352656910, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 25, "time": 1352656914, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 },
	{ "id": 26, "time": 1352656918, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }
]

Sign in to comment.