User objects
Each pointercrate user is represented by a User object.
If the display name is not null, it will replace a user’s username wherever their name is displayed.
There is only one form of user objects:
| Field | Type | Description |
|---|---|---|
| id | int | The user’s ID |
| name | string | The user’s name |
| permissions | bitmask | The user’s access permissions |
| display_name | string | The user’s display name. This can be null. |
| youtube_channel | string | The user’s linked youtube channel. This can be null |
Example object
{
"display_name": "stadust",
"id": 2,
"name": "stardust1971",
"permissions": 0,
"youtube_channel": null
}Named ID
Object representing some generic name-id pair.
| Field | Type | Description |
|---|---|---|
| id | integer | The ID associated with the object |
| name | string? | The name associated with the object |
Example object
{
"id": 5,
"name": "cat"
}Nationality objects
Object representing some nation
| Field | Type | Description |
|---|---|---|
| nation | string | The nation’s name |
| country_code | string | The nation’s ISO country code. Always exactly 2 characters long |
| subdivision | Subdivision? | An optional entry specifying a state within the country |
Subdivision objects
Object representing some state with in a nation
| Field | Type | Description |
|---|---|---|
| name | string | The states’s name |
| iso_code | string | The nation’s ISO country code. Not always 2 characters long (e.g. for Australia’s subdivisions it’s three) |
Example object
{
"nation": "United States",
"country_code": "US",
"subdivision": {
"iso_code": "OH",
"name": "Ohio"
}
}Record objects
Each record on the list is represented by a Record object. The following invariants hold true for all player objects
- The
progressvalue lies withindemon.requirementand100 - Every
videovalue is unique - Every combination of
demon,playerandstatusvalues is unique - Every
videovalue is in one of the formats listed here, ornull
The object only contains the submitter information if the requestee has ListModerator permissions. The object only contains the notes if the requester has ListHelper permissions. Requests without ListHelper permissions can only retrieve approved records.
Minimal Form
The minimal (formerly called embedded form) form of record objects is returned if a record object is part of another object.
| Field | Type | Description |
|---|---|---|
| id | integer | The record’s id |
| progress | integer | The progress achieved by the record holder |
| status | RecordStatus | The record’s status. |
| video | URL? | The record’s video. |
Depending on the context the object is returned in, one (or both) of the following fields will be present:
| Field | Type | Description |
|---|---|---|
| player | Player | The record holder |
| demon | Demon | The demon the record was made on |
Listed Form
The listed form (formerly called short form) of record objects is returned by GET /records/.
| Field | Type | Description |
|---|---|---|
| id | integer | The record’s id |
| progress | integer | The progress achieved by the record holder |
| status | RecordStatus | The record’s status. |
| video | URL? | The record’s video. |
| player | Player | The record holder |
| demon | Demon | The demon the record was made on |
Full Form
The full (formerly called long form) form of record objects is returned by GET /records/{record_id}.
| Field | Type | Description |
|---|---|---|
| id | integer | The record’s id |
| progress | integer | The progress achieved by the record’s holder |
| video | URL? | The record’s video. |
| status | RecordStatus | The record’s status. |
| player | Player | The record holder |
| demon | Demon | The demon the record was made on |
| submitter | Submitter? | The person that submitted the record, as an submitter object |
Enum RecordStatus
| Value | Description |
|---|---|
approved |
The record has been approved and is displayed on the list |
rejected |
The record has been rejected |
submitted |
The record has been submitted and is awaiting review |
under consideration |
The record is awaiting more thorough review |
Example objects
Minimal form
Here with an embedded demon object:
{
"id": 1,
"progress": 100,
"demon": {
"name": "Cadrega City",
"position": 1
},
"status": "approved",
"player": "Aquatias"
}Full form
Here without an embedded submitter object
{
"demon": {
"name": "Cadrega City",
"position": 34
},
"id": 2,
"player": {
"banned": false,
"id": 5,
"name": "AeonAir"
},
"progress": 100,
"status": "approved",
"submitter": null,
"video": null,
"notes":[]
}Record notes
Users with ListHelper and up permissions can comment on records by leaving record notes. Submitters of records can also add initial notes to records. Each record can have an arbitrary amount of notes, and each note keeps track of who created and subsequently edited it.
| Field | Type | Description |
|---|---|---|
| id | int | The internal ID of this note |
| author | string? | The author’s username (see User). Is null if the note was left by the submitter |
| content | string | The comment left |
| is_public | boolean | If the note should be shown to the record owner |
| editors | List[string] | The usernames of everyone who edited this note, in order of edits |
| transferred | boolean | Value indicating whether this note was originally left on a different record, but later transferred to the current one due to internal record merging |
Example objects
{
"author":"stadust",
"content":"This is a new record note :o",
"editors":["stadust"],
"id":3,
"transferred":false
}Demon objects
Each demon on the list is represented by a Demon object. The following assumptions can be made about these:
- The
requirementvalue lies between0and100. - There are no holes in the positioning and the
positionvalue is greater than0 - Every
videovalue, if provided, is in one of the formats listed here, ornull
Note that although on the website the record requirement for demons on the extended list is always displayed as 100%, Demon objects still save their requirement from when they were on the main list.
Minimal Form
When embedded into other objects (for example, as part of a Record), only the following minimal representation of each demon is provided:
| Field | Type | Description |
|---|---|---|
| name | string | The name of the demon |
| position | integer? | The position of the demon. Is null for unplaced demons |
| id | integer | The demons internal ID (has nothing to do with its level ID on the geometry dash servers) |
Listed Form
When retrieving demons via GET /demons/, only the following partial representation of each demon is provided:
| Field | Type | Description |
|---|---|---|
| name | string | The name of the demon |
| position | integer? | The position of the demon. Is null for unplaced demons |
| id | integer | The demons internal ID (has nothing to do with its level ID on the geometry dash servers) |
| publisher | Player | The player that published this demon |
| verifier | Player | The player that verified this demon |
| video | URL? | The verification video |
| thumbnail | string | URL to the thumbnail for the Demon’s verification video |
| level_id | integer? | The level ID of this demon on the Geometry Dash servers. |
Full Form
The listed record objects do not contain the current demon embedded into the demon field.
| Field | Type | Description |
|---|---|---|
| name | string | The name of the demon |
| position | integer? | The position of the demon |
| id | integer | The demons internal ID (has nothing to do with its level ID on the geometry dash servers) |
| requirement | integer | The minimum percentage a record on this demon has to be, to be accepted |
| video | URL? | The verification video. |
| thumbnail | string | URL to the thumbnail for the Demon’s verification video |
| level_id | integer? | The level ID of this demon on the Geometry Dash servers. |
| verifier | Player | The demon’s verifier |
| publisher | Player | The demon’s publisher |
| creators | List[Player] | The demon’s creators |
Example objects
Minimal form
{
"name": "Cadrega City",
"position": 34,
"id": 1
}Listed form
{
"name": "Cadrega City",
"position": 34,
"id": 1,
"publisher": {
"name": "Pennutoh",
"id": 123,
"banned": false
},
"verifier": {
"banned": false,
"id": 3,
"name": "Sunix"
},
"thumbnail": "https://i.ytimg.com/vi/cHEGAqOgddA/mqdefault.jpg",
"video": "https://www.youtube.com/watch?v=cHEGAqOgddA"
}Long form
{
"creators": [
{
"banned": false,
"id": 2,
"name": "Pennutoh"
}
],
"name": "Cadrega City",
"position": 34,
"id": 1,
"publisher": {
"banned": false,
"id": 2,
"name": "Pennutoh"
},
"requirement": 54,
"verifier": {
"banned": false,
"id": 3,
"name": "Sunix"
},
"thumbnail": "https://i.ytimg.com/vi/cHEGAqOgddA/mqdefault.jpg",
"video": "https://www.youtube.com/watch?v=cHEGAqOgddA"
}Player objects
Each player on the list is represented by a Player object. The following invariant holds true for any player object:
- If the player is banned, they do not have any approved or submitted records on the list
Note that it is not possible to retrieve a player’s demonlist score via the API. You can calculate it yourself based on the records list
Minimal Form
When part of the representation of another object, a player has the following fields:
| Field | Type | Description |
|---|---|---|
| id | integer | The player’s id |
| name | string | The player’s name |
| banned | boolean | Value indicating whether the player is banned |
Listed Form
When retrieving players via GET /players/
| Field | Type | Description |
|---|---|---|
| id | integer | The player’s id |
| name | string | The player’s name |
| banned | boolean | Value indicating whether the player is banned |
| nationality | Nationality | The player’s nationality, if set |
| score | float | The player’s stats viewer score |
Full Form
The listed record objects do not contain the current player embedded into the player field.
| Field | Type | Description |
|---|---|---|
| id | integer | The player’s id |
| name | string | The player’s name |
| banned | boolean | Value indicating whether the player is banned |
| nationality | Nationality | The player’s nationality, if set |
| score | float | The player’s stats viewer score |
| created | List[Demon] | A list of demons the player created |
| records | List[Record] | A list of records the player has on the list |
| published | List[Demon] | A list of demons the player has published |
| verified | List[Demon] | A list of demons the player has verified |
Example objects
Minimal form
{
"id": 4,
"name": "Pennutoh",
"banned": false
}Listed Form
{
"id": 4,
"name": "Pennutoh",
"banned": false,
"nationality": {
"nation": "Andorra",
"country_code": "AD"
},
"score": 0
}Full form
{
"banned": false,
"beaten": [],
"records": [
{
"id": 12,
"name": "Cadrega City",
"progress": 100,
"status": "approved"
}
],
"id": 2,
"name": "Pennutoh",
"nationality": {
"nation": "Andorra",
"country_code": "AD"
},
"published": [
{
"name": "Cadrega City",
"position": 34
}
],
"score": 0,
"verified": []
}Player claims
Represents
| Field | Type | Description |
|---|---|---|
| user_id | integer | Id of user that owns the claim |
| player_id | integer | Id of player that claim was assigned to |
| verified | boolean | If the claim is verified by a Moderator |
| lock_submissions | boolean | User claiming the player has locked record submissions, requiring authentication on submissions for this player |
Example objects
{
"user_id": 12,
"player_id": 363,
"verified": true,
"lock_submissions": false
}Submitter objects
Everyone who submits a record gets assigned an incremental submitter id, internally used to keep track of who has been banned from submitting records. The following invariant holds true for any submitter object:
- If the submitter is banned, he cannot submit new records and all his previously submitted records are either marked as
approvedorrejected
| Field | Type | Description |
|---|---|---|
| id | int | The submitter’s ID |
| banned | boolean | Value indicating whether the submitter is banned |
Example object
{
"banned": true,
"id": 7
}Error objects
In case of a client or a (not completely fatal) server error, the API will provide an Error object with some information about what went wrong.
Although each HTTP response comes with a status code, you can still calculate the status code from the error code by performing integer division by 100
| Field | Type | Description |
|---|---|---|
| message | string | A short message describing the error |
| code | integer | The error code |
| data | object | A JSON object containing additional data relevant to the error. |
Example object
{
"code": 42217,
"data": {
"existing": 13
},
"message": "This records has already been submitted"
}