Full search
curl --request GET \
--url https://api.dis.dog/v1/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.dis.dog/v1/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.dis.dog/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "srch_a1b2c3",
"createdAt": "2023-11-07T05:31:56Z",
"query": "80351110224678912",
"kind": "discord_id",
"value": "<string>",
"account": {
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z"
},
"lookup": {
"resolvedId": "<string>",
"matches": [
{
"id": "<string>",
"username": "<string>",
"displayName": "<string>",
"avatarUrl": "<string>",
"serverCount": 123,
"lastSeenAt": "2023-11-07T05:31:56Z"
}
]
},
"invite": {
"code": "discord-developers",
"url": "<string>",
"memberCount": 862000,
"onlineCount": 123,
"expiresAt": "2023-11-07T05:31:56Z",
"server": {
"id": "<string>",
"name": "Discord Developers",
"description": "<string>",
"iconUrl": "<string>",
"bannerUrl": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"vanityCode": "<string>",
"boostCount": 123,
"boostTier": 123,
"verificationLevel": 123
}
},
"modules": [
{
"id": "<string>",
"name": "<string>",
"status": "found",
"data": {}
}
]
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}Search
Search
Recognise a Discord ID, a username or an invite link, decode what the input itself tells (a Discord ID carries the account’s creation date), and run every lookup module. Answering 200 takes 1 search from your daily quota; 400, 451 and 429 take none.
GET
/
v1
/
search
Full search
curl --request GET \
--url https://api.dis.dog/v1/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.dis.dog/v1/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.dis.dog/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"id": "srch_a1b2c3",
"createdAt": "2023-11-07T05:31:56Z",
"query": "80351110224678912",
"kind": "discord_id",
"value": "<string>",
"account": {
"id": "<string>",
"createdAt": "2023-11-07T05:31:56Z"
},
"lookup": {
"resolvedId": "<string>",
"matches": [
{
"id": "<string>",
"username": "<string>",
"displayName": "<string>",
"avatarUrl": "<string>",
"serverCount": 123,
"lastSeenAt": "2023-11-07T05:31:56Z"
}
]
},
"invite": {
"code": "discord-developers",
"url": "<string>",
"memberCount": 862000,
"onlineCount": 123,
"expiresAt": "2023-11-07T05:31:56Z",
"server": {
"id": "<string>",
"name": "Discord Developers",
"description": "<string>",
"iconUrl": "<string>",
"bannerUrl": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"vanityCode": "<string>",
"boostCount": 123,
"boostTier": 123,
"verificationLevel": 123
}
},
"modules": [
{
"id": "<string>",
"name": "<string>",
"status": "found",
"data": {}
}
]
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}{
"error": "plan_has_no_api",
"retryAfterMs": 2000
}Give it a Discord ID, a username or an invite link in
Anything else answers
q: DisDog recognises which, decodes what the input itself tells, and runs every lookup module. A search that answers 200 takes 1 search from your quota; every refusal is free. What takes a search →
Accepted inputs
| Input | Rule | Examples | kind | value |
|---|---|---|---|---|
| Discord ID | 17 to 20 digits, a real snowflake (not in the future) | 80351110224678912 | discord_id | the ID |
| Invite link | discord.gg/<code> or discord.com/invite/<code>, with or without https:// | discord.gg/disdog | invite | the code alone: disdog |
| Username | 2 to 32 letters, digits, _ or ., not only digits; a leading @ is dropped | disdog, @DisDog | username | lowercase, without @ |
| Legacy tag | a name of 2 to 32 characters, then # and 4 digits | name#1234 | username | as typed |
400 invalid_query. A bare code like disdog, without discord.gg/, is read as a username.
For a Discord ID, account.createdAt is the exact moment the account was created: Discord encodes it in the ID. A removed ID answers 451 removed_by_owner.
Usernames
A username is looked up by name:lookup.matches lists the accounts whose username or display name contains it (up to 20, best first). When one has exactly this username, it becomes the account: lookup.resolvedId and account hold its ID, and every module runs on it. Without an exact match, the modules answer no_data: pick an ID from matches and search again. Same thing on its own: GET /v1/lookup/{name}.
Invite links
For an invite,invite holds what’s behind it, straight from Discord: the server (name, icon, description, boosts), the channel, who created the invite, member and online counts, expiry. null when the invite doesn’t exist or has expired. Same thing on its own: GET /v1/invite/{code}.
Module results
Each entry ofmodules has a status:
status | Meaning |
|---|---|
found | Results are in data. For profile, the same object as GET /v1/profile/{id}. |
not_found | The source has nothing for this input. |
no_data | The module can’t answer this kind of input (the profile module needs a Discord ID). |
error | The source didn’t answer. The search still counts; try again later. |
soon | The module is being connected and answers nothing yet. Check GET /v1/modules. |
Authorizations
Query Parameters
Response
Search result

