> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/apis/apis/comms-gatekeeper/platform-moderation.md).

# Platform Moderation

## Get ban status for a user

> Returns whether the specified user address would currently be rejected by a platform\
> ban — its own, or one matching the device the address is recorded on.\
> \
> This endpoint is \*\*public\*\* — no authentication required. It is intended for\
> clients to check their own ban status before attempting to connect.\
> \
> \### Close to what token retrieval enforces, but not identical\
> \
> This endpoint receives only an address, so its device term is always the address's \*\*last\
> recorded\*\* device. Token paths prefer the device identifier the request itself carries and\
> fall back to the recorded one only when it has none. Where a request arrives with a device\
> that differs from the recorded one, the two can disagree in both directions.\
> \
> So a user banned on one wallet who reconnects under a different wallet from the same\
> recorded device is reported as banned here and rejected at token issuance — but treat this\
> endpoint as the source for \*\*user-facing ban messaging\*\*, not as a prediction of whether a\
> specific connection will be accepted. Token issuance stays authoritative for a concrete\
> request.\
> \
> \### The ban record is only returned for the address's own ban\
> \
> \`matchedOn\` says which identifier matched. When it is \`device\`, the response contains\
> \`isBanned: true\` and no \`ban\` object: the matching row belongs to another player, and\
> publishing it on an unauthenticated route would disclose whose wallet is banned. The full\
> record — reason, expiry, custom message — is returned only when \`matchedOn\` is \`address\`.\
> Where both exist, the address's own ban is the one reported.\
> \
> \`bannedDeviceId\` is \*\*never\*\* returned on this route, whatever \`matchedOn\` says: it is a\
> stable cross-wallet machine identifier and this endpoint is unauthenticated. Moderator\
> tooling reads it from the moderator-gated \`GET /bans\`.\
> \
> A client can use \`matchedOn\` to word the notice: an \`address\` match has a reason and an\
> expiry to show, a \`device\` match has neither.\
> \
> Because the route is unauthenticated, any address can be tested for device coverage. That\
> is an accepted trade-off for being able to tell banned players why they are blocked.\
> \
> Moderator tooling that needs the full picture, including each ban's device snapshot,\
> should use the moderator-gated \`GET /bans\`.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[],"paths":{"/users/{address}/bans":{"get":{"operationId":"getBanStatus","summary":"Get ban status for a user","description":"Returns whether the specified user address would currently be rejected by a platform\nban — its own, or one matching the device the address is recorded on.\n\nThis endpoint is **public** — no authentication required. It is intended for\nclients to check their own ban status before attempting to connect.\n\n### Close to what token retrieval enforces, but not identical\n\nThis endpoint receives only an address, so its device term is always the address's **last\nrecorded** device. Token paths prefer the device identifier the request itself carries and\nfall back to the recorded one only when it has none. Where a request arrives with a device\nthat differs from the recorded one, the two can disagree in both directions.\n\nSo a user banned on one wallet who reconnects under a different wallet from the same\nrecorded device is reported as banned here and rejected at token issuance — but treat this\nendpoint as the source for **user-facing ban messaging**, not as a prediction of whether a\nspecific connection will be accepted. Token issuance stays authoritative for a concrete\nrequest.\n\n### The ban record is only returned for the address's own ban\n\n`matchedOn` says which identifier matched. When it is `device`, the response contains\n`isBanned: true` and no `ban` object: the matching row belongs to another player, and\npublishing it on an unauthenticated route would disclose whose wallet is banned. The full\nrecord — reason, expiry, custom message — is returned only when `matchedOn` is `address`.\nWhere both exist, the address's own ban is the one reported.\n\n`bannedDeviceId` is **never** returned on this route, whatever `matchedOn` says: it is a\nstable cross-wallet machine identifier and this endpoint is unauthenticated. Moderator\ntooling reads it from the moderator-gated `GET /bans`.\n\nA client can use `matchedOn` to word the notice: an `address` match has a reason and an\nexpiry to show, a `device` match has neither.\n\nBecause the route is unauthenticated, any address can be tested for device coverage. That\nis an accepted trade-off for being able to tell banned players why they are blocked.\n\nModerator tooling that needs the full picture, including each ban's device snapshot,\nshould use the moderator-gated `GET /bans`.\n","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address to check"}],"responses":{"200":{"description":"Ban status retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"isBanned":{"type":"boolean"},"matchedOn":{"type":"string","enum":["address","device"],"description":"Which identifier the ban matched on. `address` is the player's own ban and comes with the full `ban` record. `device` means another player's ban covers the device this address is recorded on; `ban` is omitted, because that record belongs to someone else. Absent when `isBanned` is false."},"ban":{"description":"A ban record without the device id, as returned by the public `GET /users/{address}/bans`. Declared standalone rather than as `UserBan` minus a field, so no generator can flatten a composed schema and hand the device id back to a public client. `UserBan` is this plus `bannedDeviceId`.","type":"object","properties":{"id":{"type":"string","description":"Unique ban record identifier"},"bannedAddress":{"type":"string","description":"Ethereum address of the banned user"},"bannedBy":{"type":"string","description":"Ethereum address of the moderator who issued the ban"},"reason":{"type":"string","description":"Internal reason for the ban"},"customMessage":{"type":"string","nullable":true,"description":"Optional message shown to the player on rejection"},"bannedAt":{"type":"string","format":"date-time","description":"When the ban was issued"},"expiresAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban expires. Null for permanent bans."},"liftedAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban was manually lifted, if applicable"},"liftedBy":{"type":"string","nullable":true,"description":"Ethereum address of the moderator who lifted the ban"},"createdAt":{"type":"string","format":"date-time","description":"Record creation timestamp"}}}}}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## Ban a player (platform-wide)

> Issues a platform-level ban for the specified user address. A platform-banned\
> user will be rejected at token issuance time and cannot enter any Genesis City\
> scene or island room until the ban expires or is lifted.\
> \
> Requires Signed Fetch authentication plus a valid moderator role, verified\
> server-side via \`moderatorAuthMiddleware\`.\
> \
> The ban can be permanent (no \`duration\`) or timed. An optional \`customMessage\`\
> is surfaced to the player at rejection time.\
> \
> The player's recorded device id (from their connection info) is banned alongside the\
> address when one is known, so the ban follows the device across wallets. This is\
> best-effort: a player who has never connected, or whose client sent no device\
> identifier, is banned by address only.\
> \
> The resulting device coverage is reflected by \`GET /users/{address}/bans\`, which reports\
> a device match as \`isBanned: true\` without disclosing the matching ban record.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"SignedFetch":[]}],"components":{"securitySchemes":{"SignedFetch":{"type":"apiKey","in":"header","name":"x-identity","description":"Signed Fetch authentication for scene-based requests.\nRequires a chain of identity headers:\n- x-identity-auth-chain-0: Signer information\n- x-identity-auth-chain-1: Ephemeral key information  \n- x-identity-auth-chain-2: Signed entity information\n- x-identity-timestamp: Request timestamp\n- x-identity-metadata: Request metadata\nUsed for authentication from decentraland-kernel-scene.\n"}}},"paths":{"/users/{address}/bans":{"post":{"operationId":"banPlayer","summary":"Ban a player (platform-wide)","description":"Issues a platform-level ban for the specified user address. A platform-banned\nuser will be rejected at token issuance time and cannot enter any Genesis City\nscene or island room until the ban expires or is lifted.\n\nRequires Signed Fetch authentication plus a valid moderator role, verified\nserver-side via `moderatorAuthMiddleware`.\n\nThe ban can be permanent (no `duration`) or timed. An optional `customMessage`\nis surfaced to the player at rejection time.\n\nThe player's recorded device id (from their connection info) is banned alongside the\naddress when one is known, so the ban follows the device across wallets. This is\nbest-effort: a player who has never connected, or whose client sent no device\nidentifier, is banned by address only.\n\nThe resulting device coverage is reflected by `GET /users/{address}/bans`, which reports\na device match as `isBanned: true` without disclosing the matching ban record.\n","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address of the user to ban"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","minLength":1,"description":"Reason for the ban (internal, logged)"},"duration":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Ban duration in seconds. Must be positive. Omit for a permanent ban."},"customMessage":{"type":"string","description":"Optional message shown to the player on rejection"}}}}}},"responses":{"201":{"description":"Ban created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"A full ban record, including the device snapshot. Returned by the moderator-gated `GET /bans` and by the ban-creation response. Composed from `PublicUserBan`, so flattening yields the correct superset.","allOf":[{"description":"A ban record without the device id, as returned by the public `GET /users/{address}/bans`. Declared standalone rather than as `UserBan` minus a field, so no generator can flatten a composed schema and hand the device id back to a public client. `UserBan` is this plus `bannedDeviceId`.","type":"object","properties":{"id":{"type":"string","description":"Unique ban record identifier"},"bannedAddress":{"type":"string","description":"Ethereum address of the banned user"},"bannedBy":{"type":"string","description":"Ethereum address of the moderator who issued the ban"},"reason":{"type":"string","description":"Internal reason for the ban"},"customMessage":{"type":"string","nullable":true,"description":"Optional message shown to the player on rejection"},"bannedAt":{"type":"string","format":"date-time","description":"When the ban was issued"},"expiresAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban expires. Null for permanent bans."},"liftedAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban was manually lifted, if applicable"},"liftedBy":{"type":"string","nullable":true,"description":"Ethereum address of the moderator who lifted the ban"},"createdAt":{"type":"string","format":"date-time","description":"Record creation timestamp"}}},{"type":"object","properties":{"bannedDeviceId":{"type":"string","nullable":true,"description":"Device id captured from the player's connection info at ban time. The ban also rejects this device (under any wallet). Null when no device id was recorded. Never returned by the public `GET /users/{address}/bans`."}}}]}}}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"401":{"description":"Unauthorized — invalid Signed Fetch or missing moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"403":{"description":"Forbidden — caller does not have the moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## Lift a platform-wide ban

> Removes the active platform-level ban for the specified user address. The user\
> will be able to obtain LiveKit tokens again on their next connection attempt.\
> \
> Requires Signed Fetch authentication plus a valid moderator role.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"SignedFetch":[]}],"components":{"securitySchemes":{"SignedFetch":{"type":"apiKey","in":"header","name":"x-identity","description":"Signed Fetch authentication for scene-based requests.\nRequires a chain of identity headers:\n- x-identity-auth-chain-0: Signer information\n- x-identity-auth-chain-1: Ephemeral key information  \n- x-identity-auth-chain-2: Signed entity information\n- x-identity-timestamp: Request timestamp\n- x-identity-metadata: Request metadata\nUsed for authentication from decentraland-kernel-scene.\n"}}},"paths":{"/users/{address}/bans":{"delete":{"operationId":"liftBan","summary":"Lift a platform-wide ban","description":"Removes the active platform-level ban for the specified user address. The user\nwill be able to obtain LiveKit tokens again on their next connection attempt.\n\nRequires Signed Fetch authentication plus a valid moderator role.\n","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address of the user whose ban to lift"}],"responses":{"204":{"description":"Ban lifted successfully"},"401":{"description":"Unauthorized — invalid Signed Fetch or missing moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"403":{"description":"Forbidden — caller does not have the moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"404":{"description":"No active ban found for this address","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## Get warnings for a user

> Returns all warnings on record for the specified user address.\
> \
> Requires Signed Fetch authentication plus a valid moderator role.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"SignedFetch":[]}],"components":{"securitySchemes":{"SignedFetch":{"type":"apiKey","in":"header","name":"x-identity","description":"Signed Fetch authentication for scene-based requests.\nRequires a chain of identity headers:\n- x-identity-auth-chain-0: Signer information\n- x-identity-auth-chain-1: Ephemeral key information  \n- x-identity-auth-chain-2: Signed entity information\n- x-identity-timestamp: Request timestamp\n- x-identity-metadata: Request metadata\nUsed for authentication from decentraland-kernel-scene.\n"}}},"paths":{"/users/{address}/warnings":{"get":{"operationId":"getWarnings","summary":"Get warnings for a user","description":"Returns all warnings on record for the specified user address.\n\nRequires Signed Fetch authentication plus a valid moderator role.\n","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address to look up"}],"responses":{"200":{"description":"Warnings retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique warning record identifier"},"warnedAddress":{"type":"string","description":"Ethereum address of the warned user"},"warnedBy":{"type":"string","description":"Ethereum address of the moderator who issued the warning"},"reason":{"type":"string","description":"Reason for the warning"},"warnedAt":{"type":"string","format":"date-time","description":"When the warning was issued"},"createdAt":{"type":"string","format":"date-time","description":"Record creation timestamp"}}}}}}}}},"401":{"description":"Unauthorized — invalid Signed Fetch or missing moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"403":{"description":"Forbidden — caller does not have the moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## Issue a warning to a player

> Records a formal warning for the specified user. Warnings are part of a\
> graduated moderation system and can inform future ban decisions.\
> \
> Requires Signed Fetch authentication plus a valid moderator role.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"SignedFetch":[]}],"components":{"securitySchemes":{"SignedFetch":{"type":"apiKey","in":"header","name":"x-identity","description":"Signed Fetch authentication for scene-based requests.\nRequires a chain of identity headers:\n- x-identity-auth-chain-0: Signer information\n- x-identity-auth-chain-1: Ephemeral key information  \n- x-identity-auth-chain-2: Signed entity information\n- x-identity-timestamp: Request timestamp\n- x-identity-metadata: Request metadata\nUsed for authentication from decentraland-kernel-scene.\n"}}},"paths":{"/users/{address}/warnings":{"post":{"operationId":"warnPlayer","summary":"Issue a warning to a player","description":"Records a formal warning for the specified user. Warnings are part of a\ngraduated moderation system and can inform future ban decisions.\n\nRequires Signed Fetch authentication plus a valid moderator role.\n","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address of the user to warn"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","minLength":1,"description":"Reason for the warning"}}}}}},"responses":{"201":{"description":"Warning issued successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","description":"Unique warning record identifier"},"warnedAddress":{"type":"string","description":"Ethereum address of the warned user"},"warnedBy":{"type":"string","description":"Ethereum address of the moderator who issued the warning"},"reason":{"type":"string","description":"Reason for the warning"},"warnedAt":{"type":"string","format":"date-time","description":"When the warning was issued"},"createdAt":{"type":"string","format":"date-time","description":"Record creation timestamp"}}}}}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"401":{"description":"Unauthorized — invalid Signed Fetch or missing moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"403":{"description":"Forbidden — caller does not have the moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## List all active platform bans

> Returns a list of all currently active platform-level bans.\
> \
> Requires Signed Fetch authentication plus a valid moderator role. Not paginated —\
> intended for moderator tooling that needs a full snapshot.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"SignedFetch":[]}],"components":{"securitySchemes":{"SignedFetch":{"type":"apiKey","in":"header","name":"x-identity","description":"Signed Fetch authentication for scene-based requests.\nRequires a chain of identity headers:\n- x-identity-auth-chain-0: Signer information\n- x-identity-auth-chain-1: Ephemeral key information  \n- x-identity-auth-chain-2: Signed entity information\n- x-identity-timestamp: Request timestamp\n- x-identity-metadata: Request metadata\nUsed for authentication from decentraland-kernel-scene.\n"}}},"paths":{"/bans":{"get":{"operationId":"listBans","summary":"List all active platform bans","description":"Returns a list of all currently active platform-level bans.\n\nRequires Signed Fetch authentication plus a valid moderator role. Not paginated —\nintended for moderator tooling that needs a full snapshot.\n","responses":{"200":{"description":"Bans retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"description":"A full ban record, including the device snapshot. Returned by the moderator-gated `GET /bans` and by the ban-creation response. Composed from `PublicUserBan`, so flattening yields the correct superset.","allOf":[{"description":"A ban record without the device id, as returned by the public `GET /users/{address}/bans`. Declared standalone rather than as `UserBan` minus a field, so no generator can flatten a composed schema and hand the device id back to a public client. `UserBan` is this plus `bannedDeviceId`.","type":"object","properties":{"id":{"type":"string","description":"Unique ban record identifier"},"bannedAddress":{"type":"string","description":"Ethereum address of the banned user"},"bannedBy":{"type":"string","description":"Ethereum address of the moderator who issued the ban"},"reason":{"type":"string","description":"Internal reason for the ban"},"customMessage":{"type":"string","nullable":true,"description":"Optional message shown to the player on rejection"},"bannedAt":{"type":"string","format":"date-time","description":"When the ban was issued"},"expiresAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban expires. Null for permanent bans."},"liftedAt":{"type":"string","format":"date-time","nullable":true,"description":"When the ban was manually lifted, if applicable"},"liftedBy":{"type":"string","nullable":true,"description":"Ethereum address of the moderator who lifted the ban"},"createdAt":{"type":"string","format":"date-time","description":"Record creation timestamp"}}},{"type":"object","properties":{"bannedDeviceId":{"type":"string","nullable":true,"description":"Device id captured from the player's connection info at ban time. The ban also rejects this device (under any wallet). Null when no device id was recorded. Never returned by the public `GET /users/{address}/bans`."}}}]}}}}}}},"401":{"description":"Unauthorized — invalid Signed Fetch or missing moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"403":{"description":"Forbidden — caller does not have the moderator role","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```

## Check if a user is banned from a world parcel

> Service-to-service endpoint used by Worlds Content Server to verify whether\
> a user is banned from a specific world parcel before issuing a LiveKit token.\
> \
> Requires Bearer token authentication (\`COMMS\_GATEKEEPER\_AUTH\_TOKEN\`). Not\
> intended for direct client use.<br>

```json
{"openapi":"3.0.0","info":{"title":"Comms Gatekeeper API","version":"1.0.0"},"servers":[{"url":"https://comms-gatekeeper.decentraland.org","description":"Production server"},{"url":"https://comms-gatekeeper.decentraland.zone","description":"Development server"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Bearer token authentication for service-to-service communication.\n"}}},"paths":{"/worlds/{worldName}/parcels/{baseParcel}/users/{address}/ban-status":{"get":{"operationId":"getWorldBanStatus","summary":"Check if a user is banned from a world parcel","description":"Service-to-service endpoint used by Worlds Content Server to verify whether\na user is banned from a specific world parcel before issuing a LiveKit token.\n\nRequires Bearer token authentication (`COMMS_GATEKEEPER_AUTH_TOKEN`). Not\nintended for direct client use.\n","parameters":[{"name":"worldName","in":"path","required":true,"schema":{"type":"string"},"description":"World identifier"},{"name":"baseParcel","in":"path","required":true,"schema":{"type":"string"},"description":"Base parcel position (e.g. \"0,0\")"},{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":"Ethereum address of the user to check"}],"responses":{"200":{"description":"Ban status retrieved","content":{"application/json":{"schema":{"type":"object","required":["isBanned"],"properties":{"isBanned":{"type":"boolean","description":"true if the user is banned from this world parcel"}}}}}},"401":{"description":"Unauthorized — invalid or missing Bearer token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Error message describing what went wrong"}}}}}}},"tags":["Platform Moderation"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/apis/apis/comms-gatekeeper/platform-moderation.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
