List Tokens Reusing This Token's Logo
curl --request GET \
--url https://demo-api.mobula.io/api/2/token/logo-reusesimport requests
url = "https://demo-api.mobula.io/api/2/token/logo-reuses"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://demo-api.mobula.io/api/2/token/logo-reuses', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://demo-api.mobula.io/api/2/token/logo-reuses",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://demo-api.mobula.io/api/2/token/logo-reuses"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo-api.mobula.io/api/2/token/logo-reuses")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/token/logo-reuses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"count": 123,
"tokens": [
{
"address": "<string>",
"chainId": "<string>",
"name": "<string>",
"symbol": "<string>",
"logo": "<string>",
"volume24hUSD": 123,
"priceUSD": 123,
"marketCapUSD": 123,
"marketCapDilutedUSD": 123,
"createdAt": 123
}
],
"nextCursor": "<string>"
}
}Market & Token Data
Get Token Logo Reuses
List the other tokens reusing this token’s logo — byte-identical logo file detection for copycat / impersonation screening.
GET
/
2
/
token
/
logo-reuses
List Tokens Reusing This Token's Logo
curl --request GET \
--url https://demo-api.mobula.io/api/2/token/logo-reusesimport requests
url = "https://demo-api.mobula.io/api/2/token/logo-reuses"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://demo-api.mobula.io/api/2/token/logo-reuses', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://demo-api.mobula.io/api/2/token/logo-reuses",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://demo-api.mobula.io/api/2/token/logo-reuses"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://demo-api.mobula.io/api/2/token/logo-reuses")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/token/logo-reuses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"count": 123,
"tokens": [
{
"address": "<string>",
"chainId": "<string>",
"name": "<string>",
"symbol": "<string>",
"logo": "<string>",
"volume24hUSD": 123,
"priceUSD": 123,
"marketCapUSD": 123,
"marketCapDilutedUSD": 123,
"createdAt": 123
}
],
"nextCursor": "<string>"
}
}Query Details
This endpoint returns the OTHER tokens whose logo is the byte-identical file as the queried token’s logo (matched on the sha256 hash of the original logo bytes — not perceptual similarity). A popular token’s logo being reused across many freshly-minted tokens is a strong copycat / impersonation signal.| Parameter | Required | Description |
|---|---|---|
chainId | Yes | Blockchain chain ID (e.g., evm:56, solana:solana). |
address | Yes | Token contract / mint address. |
limit | No | Max number of reusing tokens returned per page. 1–100, default 20. |
cursor | No | Opaque cursor from a previous response’s nextCursor to fetch the next page. |
count is the total number of other tokens sharing the logo, capped at 1001 (read 1001 as “1000+”). It is 0 when the logo is unique — or when the token’s logo hasn’t been hashed yet. Tokens are ranked by 24h volume descending, so the “real” token typically comes first and the copycats trail behind.Response Overview
Top-leveldata object:
- count: Number of OTHER tokens sharing this logo (the queried token itself is excluded). Capped at
1001. - tokens: Array of reusing tokens, ranked by
volume24hUSDdescending. - nextCursor: Opaque cursor for the next page, or
nullwhen there are no more results.
tokens[i]:
- address / chainId: The reusing token’s address and chain ID.
- name / symbol: Token metadata,
nullif unknown. - logo: URL of the (shared) logo file.
- volume24hUSD: 24h trading volume in USD,
nullif unknown. - priceUSD: Current price in USD,
nullif unknown. - marketCapUSD / marketCapDilutedUSD: Market cap from circulating / total supply,
nullif not computable. - createdAt: Token creation time in milliseconds since epoch,
nullif unknown.
Usage Examples
Check a Solana token for logo copycats (GET):curl -X GET "https://api.mobula.io/api/2/token/logo-reuses?chainId=solana:solana&address=6VW37HKxpTtYidHCCmKTZZEYswhPdbicQuVaqzsypump"
curl -X GET "https://api.mobula.io/api/2/token/logo-reuses?chainId=solana:solana&address=6VW37HKxpTtYidHCCmKTZZEYswhPdbicQuVaqzsypump&limit=50&cursor=eyJ2IjowLCJjIjoi..."
Sample Response
{
"data": {
"count": 8,
"tokens": [
{
"address": "0x3a33b54df04abee852b66dad5e7379f6371f2074",
"chainId": "evm:4663",
"name": "bul",
"symbol": "BUL",
"logo": "https://metadata.mobula.io/assets/logos/evm_4663_0x3a33b54df04abee852b66dad5e7379f6371f2074.webp",
"volume24hUSD": 0,
"priceUSD": 0.0000034685682119902066,
"marketCapUSD": 3468.5682119902067,
"marketCapDilutedUSD": 3468.5682119902067,
"createdAt": 1787152548000
},
{
"address": "3ZcohvqqB9sMTFp1zAiv52yJ4M35fnz4wc9on9GXpump",
"chainId": "solana:solana",
"name": "bul",
"symbol": "BUL",
"logo": "https://metadata.mobula.io/assets/logos/solana_solana_3ZcohvqqB9sMTFp1zAiv52yJ4M35fnz4wc9on9GXpump.webp",
"volume24hUSD": 0,
"priceUSD": 0.000014693921615830631,
"marketCapUSD": 14693.921615830632,
"marketCapDilutedUSD": 14693.921615830632,
"createdAt": 1787152536000
}
],
"nextCursor": "eyJ2IjowLCJjIjoic29sYW5hOnNvbGFuYSIsImEiOiIzWmNvaHZxcUI5c01URnAxekFpdjUyeUo0TTM1Zm56NHdjOW9uOUdYcHVtcCIsIm4iOjh9"
}
}
Error Responses
404 — Token not found:{ "statusCode": 404, "message": "Token not found" }
{ "statusCode": 400, "message": "Address is required for logo reuses" }
{ "statusCode": 400, "message": "Invalid cursor" }
Use Cases
- Copycat detection: flag freshly-minted tokens hijacking an established token’s logo.
- Pre-trade due diligence: verify you’re buying the original — the highest-volume token in the list is usually the real one.
- Listing / moderation pipelines: auto-deprioritize tokens whose logo matches hundreds of others (placeholder or spam art).
- Cross-chain impersonation: reuses are matched across ALL chains Mobula indexes, catching copycats deployed on a different chain than the original.
Query Parameters
Blockchain chain ID (e.g., "evm:56", "solana:solana")
Token contract address
Max number of reusing tokens returned, max 100 (default: 20)
Required range:
1 <= x <= 100Opaque cursor from a previous response (nextCursor) to fetch the next page
Response
200 - application/json
Logo reuses response
Show child attributes
Show child attributes