API reference
Sources
Sources decide where Gemlead looks for a persona's leads. A source is an X account whose following or followers are read. A keyword search finds the authors of matching posts. A competitor account brings the people who comment on its posts.
Each one shows the leads it found, scored and hot, so you keep what works. Look up an X profile first to see how good a source it makes.
- GET/v1/
personas/ :persona_id/ sources - GET/v1/
personas/ :persona_id/ sources/ :source_id - POST/v1/
personas/ :persona_id/ sources - PATCH/v1/
personas/ :persona_id/ sources/ :source_id - POST/v1/
personas/ :persona_id/ sources/ :source_id/ pause - POST/v1/
personas/ :persona_id/ sources/ :source_id/ resume - POST/v1/
personas/ :persona_id/ sources/ :source_id/ skip - POST/v1/
personas/ :persona_id/ sources/ :source_id/ refresh - POST/v1/
personas/ :persona_id/ sources/ :source_id/ score - DELETE/v1/
personas/ :persona_id/ sources/ :source_id - GET/v1/
personas/ :persona_id/ sources/ :source_id/ leads - GET/v1/
personas/ :persona_id/ search_queries - POST/v1/
personas/ :persona_id/ search_queries - POST/v1/
personas/ :persona_id/ search_queries/ remove - GET/v1/
personas/ :persona_id/ search_queries/ leads - GET/v1/
personas/ :persona_id/ competitor_accounts - POST/v1/
personas/ :persona_id/ competitor_accounts - POST/v1/
personas/ :persona_id/ competitor_accounts/ remove - GET/v1/
personas/ :persona_id/ competitor_accounts/ leads - GET/v1/
personas/ :persona_id/ source_suggestions - GET/v1/
x_profiles/ :username
The source object
An X account whose network Gemlead reads to find a persona's leads. It reads the accounts it follows, its followers, or both.
Attributes
- idstringUnique identifier for the source.
- objectstringAlways
source. - persona_idstringThe persona it finds leads for.
- methodstring
competitor_followerswhen only its followers are read, elsefollowing.followingcompetitor_followers - profileobjectThe source's X profile.
- statusstringWhere reading it stands.
pendingscrapingscoringdonefailedskipped - pausedbooleanWhether you paused it.
- errorstring or nullWhy reading it failed, when it did.
- read_followingbooleanWhether the accounts it follows are read.
- read_followersbooleanWhether its followers are read.
- score_selfbooleanWhether the source's own account is scored as a lead too.
- self_lead_idstring or nullThe lead of the source's own account, once scored.
- origin_lead_idstring or nullThe lead it came from, when you made it with Turn a lead into a source.
- statsobjectWhat it brought so far.
- last_activity_atstring or nullWhen it last brought a lead, ISO 8601.
- last_scraped_atstring or nullWhen it was last read, ISO 8601.
- created_atstringWhen it was added, ISO 8601.
{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}List sources
Returns the persona's sources with their stats.
Path parameters
- persona_idstringRequiredThe persona's ID.
Query parameters
- pausedboolean
truefor paused sources only,falsefor running ones. - limitintegerHow many objects to return, from 1 to 100. Defaults to 25.
- cursorstringThe
next_cursorof the previous page, to get the page after it. See Pagination.
Returns
A list of source objects.
Errors
- No persona with this ID on the key's account.
- A parameter has a value the API does not accept.
paramnames it.
curl https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "list",
"data": [
{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}
],
"has_more": false,
"next_cursor": null
}Retrieve a source
Returns one source with its stats.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
Errors
- No source with this ID on the key's account.
curl \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Add a source
Adds an X account as a source. The best are people who look like your buyers, their following is full of peers. A competitor's followers already care about products like yours.
Path parameters
- persona_idstringRequiredThe persona's ID.
Body parameters
- usernamestringRequiredAn X username, 1 to 15 letters, digits or
_, with or without the @. - read_followingbooleanRead the accounts it follows, the people who look like it. Default
true. - read_followersbooleanRead its followers, a competitor's audience for example. Default
false. - score_selfbooleanScore the source's own account as a lead too. Default
true.
Returns
The new source object.
Errors
- No persona with this ID on the key's account.
- A required parameter is missing.
paramnames it. - A parameter has a value the API does not accept.
paramnames it. - The persona already has this account as a source with this method.
- X has no readable profile at this username.
- The X account's session expired. Reconnect it in the app, then try again.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"username": "pickswithmike",
"read_following": true
}'{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "pending",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 0,
"scored_leads": 0,
"hot_leads": 0,
"avg_score": 0
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Update a source
Changes what Gemlead reads on the source.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Body parameters
- read_followingbooleanRead the accounts it follows, the people who look like it.
- read_followersbooleanRead its followers, a competitor's audience for example.
- score_selfbooleanScore the source's own account as a lead too.
Returns
The updated source object.
Errors
- No source with this ID on the key's account.
- A parameter has a value the API does not accept.
paramnames it. - The body has a field this endpoint does not take.
curl -X PATCH \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"read_followers": true
}'{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": true,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Pause a source
Stops reading the source for now. Its leads stay.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
The source object.
Errors
- No source with this ID on the key's account.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/pause \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": true,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Resume a source
Starts reading a paused source again.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
The source object.
Errors
- No source with this ID on the key's account.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/resume \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Skip a source
Stops a source for good and counts it as done, when it brings the wrong people.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
The source object.
Errors
- No source with this ID on the key's account.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/skip \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "skipped",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Refresh a source
Reads the source's X profile again, for a new name, photo or follower count.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
The source object.
Errors
- No source with this ID on the key's account.
- The X account's session expired. Reconnect it in the app, then try again.
- X or a Gemlead service did not answer. Nothing changed, try again in a minute.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/refresh \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Score a source
Scores the source's own X account as a lead of the persona. Uses up to 2 credits a lead: 1 for the first pass, 1 more for the deep score when it passes.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
The source object.
Errors
- No source with this ID on the key's account.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/score \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"persona_id": "lvWBPnytpS",
"method": "following",
"profile": {
"username": "pickswithmike",
"name": "Mike Picks",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"followers_count": 8400,
"following_count": 1210,
"url": "https://x.com/pickswithmike"
},
"status": "done",
"paused": false,
"error": null,
"read_following": true,
"read_followers": false,
"score_self": true,
"self_lead_id": "Lp4WqZ7sXe",
"origin_lead_id": null,
"stats": {
"leads": 1184,
"scored_leads": 1160,
"hot_leads": 212,
"avg_score": 44
},
"last_activity_at": "2026-11-05T14:03:40.117Z",
"last_scraped_at": "2026-11-05T14:02:11.482Z",
"created_at": "2026-09-14T09:21:05.300Z"
}Delete a source
Removes a source and the leads it found that no campaign worked on.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Returns
An object with the source's id, deleted set to true and the count of deleted_leads.
Errors
- No source with this ID on the key's account.
curl -X DELETE \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "s2HvN8qLtB",
"object": "source",
"deleted": true,
"deleted_leads": 972
}List a source's leads
Returns the leads a source found, best score first.
Path parameters
- persona_idstringRequiredThe persona's ID.
- source_idstringRequiredThe source's ID.
Query parameters
- orderstring
-scoreputs the best leads first,scorethe lowest. Default-score.-scorescore - limitintegerHow many objects to return, from 1 to 100. Defaults to 25.
- cursorstringThe
next_cursorof the previous page, to get the page after it. See Pagination.
Returns
A list of lead objects, with total_count.
Errors
- No source with this ID on the key's account.
- A parameter has a value the API does not accept.
paramnames it.
curl -G \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/sources/s2HvN8qLtB/leads \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-d limit=10{
"object": "list",
"data": [
{
"id": "msgOtJ8dvT",
"object": "lead",
"profile": {
"x_user_id": "1460283925",
"username": "jane_builds",
"name": "Jane Doe",
"bio": "Runs a paid trading community. Daily setups, no hype.",
"followers_count": 12400,
"following_count": 380,
"location": "Austin, TX",
"website": "https://janedoe.com",
"profile_image_url": "https://pbs.twimg.com/profile_images/1460283925/jane_400x400.jpg",
"verified": true,
"url": "https://x.com/jane_builds"
},
"score": 86,
"score_reason": "Runs a paid trading community and asks how to collect payments for it.",
"hot": true,
"status": "scored",
"persona": {
"id": "lvWBPnytpS",
"name": "Tipsters"
},
"campaign": null,
"conversation_id": null,
"locked_to": null,
"found_at": "2026-11-05T14:02:11.482Z",
"scored_at": "2026-11-05T14:03:40.117Z",
"updated_at": "2026-11-05T14:03:40.117Z",
"metadata": {}
}
],
"has_more": true,
"next_cursor": "eyJzIjoiMjAyNi0xMS0wNVQxNDowMzo0MC4xMTdaIn0",
"total_count": 1184
}The keyword search object
A search Gemlead runs on X for a persona. The authors of the posts it finds are scored as leads.
Attributes
- objectstringAlways
search_query. - querystringThe search, as you would type it on X.
- persona_idstringThe persona it finds leads for.
- statsobjectWhat it brought so far.
- first_found_atstring or nullWhen it found its first lead, ISO 8601.
{
"object": "search_query",
"query": "paid discord picks",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 640,
"scored_leads": 618,
"hot_leads": 131,
"avg_score": 47
},
"first_found_at": "2026-10-21T10:04:51.000Z"
}List keyword searches
Returns the persona's keyword searches, each with the leads it found, scored and hot.
Path parameters
- persona_idstringRequiredThe persona's ID.
Returns
A list of keyword search objects.
Errors
- No persona with this ID on the key's account.
curl \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/search_queries \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "list",
"data": [
{
"object": "search_query",
"query": "paid discord picks",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 640,
"scored_leads": 618,
"hot_leads": 131,
"avg_score": 47
},
"first_found_at": "2026-10-21T10:04:51.000Z"
}
],
"has_more": false,
"next_cursor": null
}Add keyword searches
Adds keyword searches to a persona. Gemlead searches X for posts with them and scores their authors.
Path parameters
- persona_idstringRequiredThe persona's ID.
Body parameters
- queriesarray of stringsRequired1 to 50 keyword searches to add, 500 in all on a persona. Each a search as you would type it on X, 2 to 200 characters.
Returns
The persona's keyword searches, a list of keyword search objects.
Errors
- No persona with this ID on the key's account.
- A required parameter is missing.
paramnames it. - A parameter has a value the API does not accept.
paramnames it. - The persona already has this keyword search.
- The persona would have more than 500 in all.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/search_queries \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"queries": ["paid discord picks", "vip tips telegram"]
}'{
"object": "list",
"data": [
{
"object": "search_query",
"query": "paid discord picks",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 640,
"scored_leads": 618,
"hot_leads": 131,
"avg_score": 47
},
"first_found_at": "2026-10-21T10:04:51.000Z"
}
],
"has_more": false,
"next_cursor": null
}Remove keyword searches
Removes keyword searches from a persona. The leads they found stay.
Path parameters
- persona_idstringRequiredThe persona's ID.
Body parameters
- queriesarray of stringsRequiredThe keyword searches to remove, as listed.
Returns
The persona's keyword searches left, a list of keyword search objects.
Errors
- No persona with this ID on the key's account.
- One of them is not on the persona's keyword searches.
- A required parameter is missing.
paramnames it.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/search_queries/remove \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"queries": ["vip tips telegram"]
}'{
"object": "list",
"data": [
{
"object": "search_query",
"query": "paid discord picks",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 640,
"scored_leads": 618,
"hot_leads": 131,
"avg_score": 47
},
"first_found_at": "2026-10-21T10:04:51.000Z"
}
],
"has_more": false,
"next_cursor": null
}List a keyword search's leads
Returns the leads one keyword search found, best score first.
Path parameters
- persona_idstringRequiredThe persona's ID.
Query parameters
- querystringRequiredThe keyword search, as listed.
- orderstring
-scoreputs the best leads first,scorethe lowest. Default-score.-scorescore - limitintegerHow many objects to return, from 1 to 100. Defaults to 25.
- cursorstringThe
next_cursorof the previous page, to get the page after it. See Pagination.
Returns
A list of lead objects, with total_count.
Errors
- No persona with this ID on the key's account.
- A required parameter is missing.
paramnames it. - A parameter has a value the API does not accept.
paramnames it.
curl -G \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/search_queries/leads \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
--data-urlencode "query=paid discord picks" \
-d limit=10{
"object": "list",
"data": [
{
"id": "msgOtJ8dvT",
"object": "lead",
"profile": {
"x_user_id": "1460283925",
"username": "jane_builds",
"name": "Jane Doe",
"bio": "Runs a paid trading community. Daily setups, no hype.",
"followers_count": 12400,
"following_count": 380,
"location": "Austin, TX",
"website": "https://janedoe.com",
"profile_image_url": "https://pbs.twimg.com/profile_images/1460283925/jane_400x400.jpg",
"verified": true,
"url": "https://x.com/jane_builds"
},
"score": 86,
"score_reason": "Runs a paid trading community and asks how to collect payments for it.",
"hot": true,
"status": "scored",
"persona": {
"id": "lvWBPnytpS",
"name": "Tipsters"
},
"campaign": null,
"conversation_id": null,
"locked_to": null,
"found_at": "2026-11-05T14:02:11.482Z",
"scored_at": "2026-11-05T14:03:40.117Z",
"updated_at": "2026-11-05T14:03:40.117Z",
"metadata": {}
}
],
"has_more": true,
"next_cursor": "eyJzIjoiMjAyNi0xMS0wNVQxNDowMzo0MC4xMTdaIn0",
"total_count": 640
}The competitor account object
A competitor's X account. Gemlead reads who comments on its posts and scores them as leads.
Attributes
- objectstringAlways
competitor_account. - usernamestringThe X username, without the @.
- persona_idstringThe persona it finds leads for.
- statsobjectWhat it brought so far.
- first_found_atstring or nullWhen it found its first lead, ISO 8601.
{
"object": "competitor_account",
"username": "whop",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 905,
"scored_leads": 902,
"hot_leads": 96,
"avg_score": 38
},
"first_found_at": "2026-10-24T16:30:12.000Z"
}List competitor accounts
Returns the persona's competitor accounts, each with the leads it found, scored and hot.
Path parameters
- persona_idstringRequiredThe persona's ID.
Returns
A list of competitor account objects.
Errors
- No persona with this ID on the key's account.
curl \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/competitor_accounts \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "list",
"data": [
{
"object": "competitor_account",
"username": "whop",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 905,
"scored_leads": 902,
"hot_leads": 96,
"avg_score": 38
},
"first_found_at": "2026-10-24T16:30:12.000Z"
}
],
"has_more": false,
"next_cursor": null
}Add competitor accounts
Adds competitor accounts to a persona. Gemlead reads who comments on their posts and scores them.
Path parameters
- persona_idstringRequiredThe persona's ID.
Body parameters
- usernamesarray of stringsRequired1 to 50 competitor accounts to add, 100 in all on a persona. Each an X username, with or without the @.
Returns
The persona's competitor accounts, a list of competitor account objects.
Errors
- No persona with this ID on the key's account.
- A required parameter is missing.
paramnames it. - A parameter has a value the API does not accept.
paramnames it. - The persona already has this competitor account.
- The persona would have more than 100 in all.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/competitor_accounts \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"usernames": ["whop"]
}'{
"object": "list",
"data": [
{
"object": "competitor_account",
"username": "whop",
"persona_id": "lvWBPnytpS",
"stats": {
"leads": 905,
"scored_leads": 902,
"hot_leads": 96,
"avg_score": 38
},
"first_found_at": "2026-10-24T16:30:12.000Z"
}
],
"has_more": false,
"next_cursor": null
}Remove competitor accounts
Removes competitor accounts from a persona. The leads they found stay.
Path parameters
- persona_idstringRequiredThe persona's ID.
Body parameters
- usernamesarray of stringsRequiredThe competitor accounts to remove, as listed.
Returns
The persona's competitor accounts left, a list of competitor account objects.
Errors
- No persona with this ID on the key's account.
- One of them is not on the persona's competitor accounts.
- A required parameter is missing.
paramnames it.
curl -X POST \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/competitor_accounts/remove \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"usernames": ["whop"]
}'{
"object": "list",
"data": [],
"has_more": false,
"next_cursor": null
}List a competitor account's leads
Returns the leads one competitor account found, best score first.
Path parameters
- persona_idstringRequiredThe persona's ID.
Query parameters
- usernamestringRequiredThe competitor's X username, as listed.
- orderstring
-scoreputs the best leads first,scorethe lowest. Default-score.-scorescore - limitintegerHow many objects to return, from 1 to 100. Defaults to 25.
- cursorstringThe
next_cursorof the previous page, to get the page after it. See Pagination.
Returns
A list of lead objects, with total_count.
Errors
- No persona with this ID on the key's account.
- A required parameter is missing.
paramnames it. - A parameter has a value the API does not accept.
paramnames it.
curl -G \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/competitor_accounts/leads \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-d username=whop \
-d limit=10{
"object": "list",
"data": [
{
"id": "msgOtJ8dvT",
"object": "lead",
"profile": {
"x_user_id": "1460283925",
"username": "jane_builds",
"name": "Jane Doe",
"bio": "Runs a paid trading community. Daily setups, no hype.",
"followers_count": 12400,
"following_count": 380,
"location": "Austin, TX",
"website": "https://janedoe.com",
"profile_image_url": "https://pbs.twimg.com/profile_images/1460283925/jane_400x400.jpg",
"verified": true,
"url": "https://x.com/jane_builds"
},
"score": 86,
"score_reason": "Runs a paid trading community and asks how to collect payments for it.",
"hot": true,
"status": "scored",
"persona": {
"id": "lvWBPnytpS",
"name": "Tipsters"
},
"campaign": null,
"conversation_id": null,
"locked_to": null,
"found_at": "2026-11-05T14:02:11.482Z",
"scored_at": "2026-11-05T14:03:40.117Z",
"updated_at": "2026-11-05T14:03:40.117Z",
"metadata": {}
}
],
"has_more": true,
"next_cursor": "eyJzIjoiMjAyNi0xMS0wNVQxNDowMzo0MC4xMTdaIn0",
"total_count": 905
}The source suggestion object
An X account the AI picked as a source for a persona, with why and how to read it.
Attributes
- objectstringAlways
source_suggestion. - profileobjectIts X profile, as on the X profile object.
- methodstringWhat to read on it.
followingcompetitor_followers - reasonstring or nullWhy the AI picked it.
- seed_adviceobject or nullGemlead's own check of the account.
{
"object": "source_suggestion",
"profile": {
"x_user_id": "1722093311",
"username": "pickswithmike",
"name": "Mike Picks",
"bio": "NBA and NFL picks. VIP Discord, 61 % last season.",
"followers_count": 8400,
"following_count": 1210,
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"verified": false,
"url": "https://x.com/pickswithmike"
},
"method": "following",
"reason": "Runs a paid picks group and follows dozens of other tipsters.",
"seed_advice": {
"verdict": "good",
"kind": "person",
"reason_code": "peer",
"reason": "A founder-sized account (1k to 15k followers) follows peers who look like your buyers.",
"recommended_method": "following"
}
}Suggest sources
Asks the AI for X accounts to add as sources, picked from the persona's description, keywords and competitors.
Path parameters
- persona_idstringRequiredThe persona's ID.
Returns
A list of source suggestion objects.
Errors
- No persona with this ID on the key's account.
- X or a Gemlead service did not answer. Nothing changed, try again in a minute.
curl \
https://gemlead.ai/api/v1/personas/lvWBPnytpS/source_suggestions \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "list",
"data": [
{
"object": "source_suggestion",
"profile": {
"x_user_id": "1722093311",
"username": "pickswithmike",
"name": "Mike Picks",
"bio": "NBA and NFL picks. VIP Discord, 61 % last season.",
"followers_count": 8400,
"following_count": 1210,
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"verified": false,
"url": "https://x.com/pickswithmike"
},
"method": "following",
"reason": "Runs a paid picks group and follows dozens of other tipsters.",
"seed_advice": {
"verdict": "good",
"kind": "person",
"reason_code": "peer",
"reason": "A founder-sized account (1k to 15k followers) follows peers who look like your buyers.",
"recommended_method": "following"
}
}
],
"has_more": false,
"next_cursor": null
}The X profile object
An X account read live with your X session, before you add it as a source or a competitor.
Attributes
- objectstringAlways
x_profile. - x_user_idstringThe X account's numeric ID, as a string.
- usernamestringThe X handle, without the @.
- namestringThe display name.
- biostringThe profile's bio.
- followers_countintegerFollowers on X.
- following_countintegerAccounts it follows on X.
- locationstringThe location written on the profile.
- websitestringThe website on the profile.
- profile_image_urlstringThe profile picture's URL.
- verifiedbooleanWhether the account has a verified badge.
- urlstringThe profile's URL on X.
- can_dmboolean or nullWhether your account can DM it, when X says.
- joined_atstring or nullWhen the account was created on X, ISO 8601.
- seed_adviceobjectWith the
personaparameter only. How good a source it makes, once for each way to read it.
{
"object": "x_profile",
"x_user_id": "1722093311",
"username": "pickswithmike",
"name": "Mike Picks",
"bio": "NBA and NFL picks. VIP Discord, 61 % last season.",
"followers_count": 8400,
"following_count": 1210,
"location": "Las Vegas",
"website": "https://mikepicks.com",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"verified": false,
"can_dm": true,
"joined_at": "2019-03-02T18:11:40.000Z",
"url": "https://x.com/pickswithmike"
}Look up an X profile
Reads an X profile live with your X session. With persona, it also says how good a source the account makes for it.
Path parameters
- usernamestringRequiredThe X username, with or without the @.
Query parameters
- personastringA persona ID, to get
seed_advicefor it.
Returns
An X profile object.
Errors
- X has no readable profile at this username.
- The X account's session expired. Reconnect it in the app, then try again.
- X or a Gemlead service did not answer. Nothing changed, try again in a minute.
curl -G https://gemlead.ai/api/v1/x_profiles/pickswithmike \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-d persona=lvWBPnytpS{
"object": "x_profile",
"x_user_id": "1722093311",
"username": "pickswithmike",
"name": "Mike Picks",
"bio": "NBA and NFL picks. VIP Discord, 61 % last season.",
"followers_count": 8400,
"following_count": 1210,
"location": "Las Vegas",
"website": "https://mikepicks.com",
"profile_image_url": "https://pbs.twimg.com/profile_images/1722093311/mike_400x400.jpg",
"verified": false,
"can_dm": true,
"joined_at": "2019-03-02T18:11:40.000Z",
"url": "https://x.com/pickswithmike",
"seed_advice": {
"following": {
"verdict": "good",
"kind": "person",
"reason_code": "peer",
"reason": "A founder-sized account (1k to 15k followers) follows peers who look like your buyers.",
"recommended_method": "following"
},
"competitor_followers": {
"verdict": "weak",
"kind": "person",
"reason_code": "followers",
"reason": "Followers lists are mostly passive accounts: few of them score hot. The following of a founder like your buyers works far better.",
"recommended_method": "following"
},
"both": {
"verdict": "weak",
"kind": "person",
"reason_code": "both",
"reason": "Adding the followers drowns a good following in passive accounts. Keep the following only.",
"recommended_method": "following"
}
}
}