# Crypto projects without a token, ranked by Twitter Score or follower growth

`GET https://twitterscore.io/api/v1/get_tokenless`

Returns the list behind the Airdrop / tokenless page: accounts in the "Projects" category that have no linked coin on TwitterScore (no token tracked) and are not on the tokenless blacklist. Each item carries the project's Twitter Score, its current and previous follower counts (as integers and as compact strings like "318K") and the difference between them. Rank by Twitter Score (`by=score`, default, uses the absolute current score — not a change) or by follower change (`by=followers`, current minus previous followers). The ranking is capped at the first 1000 rows, so `total` never exceeds 1000. Unlike get_trending, there is no period parameter: the "previous" follower count is the previous stored snapshot of the account, and the response has no extra period fields.
**Nested fields**

- `data[].twitter_id` (string): Project account's numeric Twitter/X id as a string.
- `data[].name` (string): Display name. Serialised with str(), so an account without a name yields the literal string "None".
- `data[].username` (string): Handle without the @.
- `data[].description` (string): Profile bio (empty string when none).
- `data[].twitter_score` (number): Current Twitter Score (0-1000 scale) as a float with decimals, e.g. 851.53 (Account.project_score FloatField).
- `data[].curr_followers_int` (integer): Current follower count.
- `data[].curr_followers_str` (string): Current followers as a compact string with K/M/B suffix (3 significant digits), e.g. "318K"; "0" when zero.
- `data[].prev_followers_int` (integer): Follower count at the previous snapshot.
- `data[].prev_followers_str` (string): Previous followers as a compact K/M/B string.
- `data[].followers_diff_int` (integer): curr_followers_int minus prev_followers_int; may be negative. Sort key for by=followers.
- `data[].followers_diff_str` (string): followers_diff_int as a compact K/M/B string, e.g. "12.2K" or "-1.5K"; "0" when zero.
- `data[].img` (string): Avatar URL from the account's stored profile image on S3 (https://<bucket>.s3.amazonaws.com/profiles/<file>). When no image is stored the code builds "https://twitterscore.io" + settings.MEDIA_URL + "profiles/NoImageFound.png" — "https://twitterscore.io/media/profiles/NoImageFound.png" with local media, but a malformed double-scheme URL when USE_S3 is on (see notes).

## Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `by` | string (`score`, `followers`) | no | `score` | Ranking column: `score` orders by the current Twitter Score (project_score), `followers` by the follower change (current minus previous followers). Case-sensitive; any other value returns {"success": false, "message": "Sorting is only possible by [followers\|score]"}. |
| `sort` | string (`desc`, `asc`, `descending`, `ascending`) | no | `desc` | Sort direction: `asc` or `ascending` (case-insensitive) for ascending, anything else (including the default) for descending. |
| `page` | integer | no | `1` | 1-based page number. Non-numeric, 0 or negative values are treated as 1; a page past the last returns an empty `data` array. |
| `size` | integer | no | `10` | Rows per page, capped at 100. Values below 1 are treated as 1; a non-numeric value falls back to 10. |

## Example request

```bash
curl -s "https://twitterscore.io/api/v1/get_tokenless?by=followers" \
  -H "X-API-Key: $TWITTERSCORE_API_KEY" \
  -H "User-Agent: my-app/1.0 (contact@example.com)"
```

```python
import os, requests

r = requests.get(
    "https://twitterscore.io/api/v1/get_tokenless",
    params={"by": "followers"},
    headers={"X-API-Key": os.environ["TWITTERSCORE_API_KEY"],
             "User-Agent": "my-app/1.0 (contact@example.com)"},
    timeout=15,
)
data = r.json()
if not data.get("success", True):      # errors arrive as success=false (see /developers/errors/)
    raise RuntimeError(data["message"])
print(data)
```

```javascript
const r = await fetch("https://twitterscore.io/api/v1/get_tokenless?by=followers", {
  headers: { "X-API-Key": process.env.TWITTERSCORE_API_KEY,
             "User-Agent": "my-app/1.0 (contact@example.com)" },
});
const data = await r.json();
if (data.success === false) throw new Error(data.message);
console.log(data);
```

## Example response

```json
{
  "success": true,
  "total": 1000,
  "page": 1,
  "size": 2,
  "pages": 500,
  "data": [
    {
      "twitter_id": "1457382190432124930",
      "name": "MegaETH",
      "username": "megaeth_labs",
      "description": "Real-time blockchain. Mainnet soon.",
      "twitter_score": 412.37,
      "curr_followers_int": 318204,
      "curr_followers_str": "318K",
      "prev_followers_int": 305990,
      "prev_followers_str": "306K",
      "followers_diff_int": 12214,
      "followers_diff_str": "12.2K",
      "img": "https://twitterscore.s3.amazonaws.com/profiles/megaeth_labs.jpg"
    },
    {
      "twitter_id": "1623390414587465728",
      "name": "Monad",
      "username": "monad_xyz",
      "description": "Performance-optimized EVM L1.",
      "twitter_score": 387.05,
      "curr_followers_int": 742110,
      "curr_followers_str": "742K",
      "prev_followers_int": 739870,
      "prev_followers_str": "740K",
      "followers_diff_int": 2240,
      "followers_diff_str": "2.24K",
      "img": "https://twitterscore.s3.amazonaws.com/profiles/monad_xyz.jpg"
    }
  ]
}
```

## Errors

Error codes this endpoint can return (see [Errors](/developers/errors/) for the body format): `api_key_missing`, `api_key_invalid`, `api_access_deactivated`, `api_key_revoked`, `method_not_allowed`, `rate_limited`, `quota_exceeded`, `server_error`.

---

Authentication: `X-API-Key` header (or `Authorization: Bearer`), see [Authentication](/developers/authentication/). Limits: per-minute rate and monthly quota by plan, see [Rate limits](/developers/rate-limits/). Machine-readable definition: [/openapi.json](/openapi.json).