API reference
Leads
Leads are the people Gemlead finds on X for your personas. Dana AI scores each one from 0 to 100, and a lead is hot at 60 or more. List them with filters, attach your own metadata like a CRM ID, or act on one as you would in the app.
The lead object
A person Gemlead found on X for one of your personas, with the score Dana AI gave them and where they are in your outreach.
Attributes
- idstringUnique identifier for the lead.
- objectstringAlways
lead. - profileobjectThe lead's X profile.
- scoreinteger or nullHow well the lead fits your persona, from 0 to 100. Null until scored.
- score_reasonstring or nullWhy the lead got this score, in one or two sentences.
- hotbooleanTrue when the score is 60 or more.
- statusstringWhere the lead is in your pipeline.
pendingscoringscoredin_campaigncontactedin_conversationclosed - personaobject or nullThe persona the lead was found for.
- campaignobject or nullThe campaign the lead is in, if any.
- conversation_idstring or nullThe conversation with the lead once one exists. Use it with Retrieve a conversation.
- locked_toobject or nullThe one X account of the owner this person is kept for. A lead goes to one X account only, so the others never contact them. Null when nothing holds the lead yet.
- found_atstringWhen Gemlead found the lead, ISO 8601.
- scored_atstring or nullWhen the lead was scored, ISO 8601.
- updated_atstringWhen the lead last changed, ISO 8601.
- metadataobjectYour own key value pairs, set with Update a lead.
{
"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": {}
}List leads
Returns your leads, newest scored first by default. Combine filters to get exactly the leads you want.
Query parameters
- personastringOnly leads of this persona ID.
- statusstringOnly leads in these statuses, comma separated, like
scored,in_campaign.pendingscoringscoredin_campaigncontactedin_conversationclosed - score_minintegerOnly leads with at least this score, from 0 to 100.
- score_maxintegerOnly leads with at most this score, from 0 to 100.
- hotboolean
truefor leads that scored 60 or more,falsefor the others. - scored_afterstringOnly leads scored after this time, ISO 8601.
- scored_beforestringOnly leads scored before this time, ISO 8601.
- found_afterstringOnly leads found after this time, ISO 8601.
- found_beforestringOnly leads found before this time, ISO 8601.
- orderstringThe sort order. Defaults to
-scored_at, the most recently scored first.-scored_at-score-found_at - 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.
Errors
- A parameter has a value the API does not accept.
paramnames it.
curl -G https://gemlead.ai/api/v1/leads \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-d hot=true \
-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"
}Retrieve a lead
Returns one lead.
Path parameters
- idstringRequiredThe lead's ID.
Returns
A lead object.
Errors
- No lead with this ID on the key's account.
curl https://gemlead.ai/api/v1/leads/msgOtJ8dvT \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"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": {}
}Update a lead
Sets your own metadata on a lead, or closes it when you are done with it. Closing a lead stops the campaign steps still waiting for it, so Gemlead stops writing to it.
Path parameters
- idstringRequiredThe lead's ID.
Body parameters
- metadataobjectKey value pairs merged into the lead's metadata. Keys up to 40 letters, digits,
_or-, values strings up to 500 characters, 20 keys at most. Set a key tonullor an empty string to remove it, ormetadatatonullto clear them all. - statusstringSet to
closedto close the lead.closed
Returns
The updated lead object.
Errors
- No lead 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/leads/msgOtJ8dvT \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"crm_id": "hs_48213"
}
}'{
"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": {
"crm_id": "hs_48213"
}
}Rescore a lead
Asks Dana AI to score the lead again against its persona, after you changed the persona's description for example. Uses up to 2 credits a lead: 1 for the first pass, 1 more for the deep score when it passes.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
The lead object.
Errors
- No lead with this ID on the key's account.
- X or a Gemlead service did not answer. Nothing changed, try again in a minute.
curl -X POST \
https://gemlead.ai/api/v1/leads/msgOtJ8dvT/rescore \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"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": {}
}Refresh a lead
Reads the lead's X profile again, for a new bio, photo or follower count.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
The updated lead object.
Errors
- No lead 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/leads/msgOtJ8dvT/refresh \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"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": {}
}Follow a lead
Follows the lead on X from your X account, right away.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
The lead object.
Errors
- No lead with this ID on the key's account.
- The lead has no X account ID to follow.
- 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/leads/msgOtJ8dvT/follow \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"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": {}
}Unfollow a lead
Unfollows the lead on X from your X account, right away.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
The lead object.
Errors
- No lead with this ID on the key's account.
- The lead has no X account ID to unfollow.
- 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/leads/msgOtJ8dvT/unfollow \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"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": {}
}Turn a lead into a source
Makes a great lead a source of its persona, to find more people like it. Gemlead reads who it follows, its followers, or who comments on its posts.
Path parameters
- lead_idstringRequiredThe lead's ID.
Body parameters
- methodstring
followingreads who the lead follows,competitor_followersits followers,competitor_commentswho comments on its posts. Defaultfollowing.followingcompetitor_followerscompetitor_comments
Returns
An object with the lead_id, its persona_id, the method, and the new source, or the competitor_account username for competitor_comments.
Errors
- No lead with this ID on the key's account.
- The lead belongs to no persona.
- The persona already has this account as a source with this method.
- The persona has 100 competitor accounts already.
- A parameter has a value the API does not accept.
paramnames it. - X or a Gemlead service did not answer. Nothing changed, try again in a minute.
curl -X POST \
https://gemlead.ai/api/v1/leads/msgOtJ8dvT/convert_to_source \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"method": "following"
}'{
"object": "lead_conversion",
"lead_id": "msgOtJ8dvT",
"persona_id": "lvWBPnytpS",
"method": "following",
"source": {
"id": "s9KdT3pXwM",
"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": "msgOtJ8dvT",
"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"
},
"competitor_account": null
}Delete a lead
Deletes a lead. It leaves your lists and every campaign stops for it, and Gemlead does not bring the same person back for this persona. To keep someone out of every persona, add them to the exclusion list.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
An object with the lead's id and deleted set to true.
Errors
- No lead with this ID on the key's account.
curl -X DELETE https://gemlead.ai/api/v1/leads/msgOtJ8dvT \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "msgOtJ8dvT",
"object": "lead",
"deleted": true
}The lead origin object
How Gemlead found a lead, the post that surfaced it, and every campaign it is in.
Attributes
- objectstringAlways
lead_origin. - lead_idstringThe lead's ID.
- personaobject or nullThe persona it was found for.
- methodstring or nullHow it was found.
followingkeywordscompetitor_followerscompetitor_comments - found_querystring or nullThe keyword search that found it, for
keywords. - source_usernamestring or nullThe source or competitor account it was found through.
- found_postobject or nullThe post that surfaced the lead, when a post did.
- campaignsarray of objectsThe campaigns the lead is in, each with its
id,name, the lead'sstatusin it, the campaign'smethodand thestepthe lead is on.
{
"object": "lead_origin",
"lead_id": "msgOtJ8dvT",
"persona": {
"id": "lvWBPnytpS",
"name": "Tipsters"
},
"method": "keywords",
"found_query": "paid discord picks",
"source_username": null,
"found_post": {
"method": "keywords",
"query": "paid discord picks",
"post_id": "1985102233445566778",
"text": "Thinking of moving my paid discord picks to a real checkout. Any tips?",
"url": "https://x.com/i/status/1985102233445566778",
"posted_at": "2026-11-05T13:40:02.000Z",
"found_at": "2026-11-05T14:02:11.482Z"
},
"campaigns": [
{
"id": "c7RkQ2wLxe",
"name": "Tipsters warm intro",
"status": "waiting",
"method": "keywords",
"step": "Timer"
}
]
}Retrieve a lead's origin
Returns how Gemlead found the lead, the post that surfaced it and every campaign it is in, with the step it is on.
Path parameters
- lead_idstringRequiredThe lead's ID.
Returns
Errors
- No lead with this ID on the key's account.
curl https://gemlead.ai/api/v1/leads/msgOtJ8dvT/origin \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "lead_origin",
"lead_id": "msgOtJ8dvT",
"persona": {
"id": "lvWBPnytpS",
"name": "Tipsters"
},
"method": "keywords",
"found_query": "paid discord picks",
"source_username": null,
"found_post": {
"method": "keywords",
"query": "paid discord picks",
"post_id": "1985102233445566778",
"text": "Thinking of moving my paid discord picks to a real checkout. Any tips?",
"url": "https://x.com/i/status/1985102233445566778",
"posted_at": "2026-11-05T13:40:02.000Z",
"found_at": "2026-11-05T14:02:11.482Z"
},
"campaigns": [
{
"id": "c7RkQ2wLxe",
"name": "Tipsters warm intro",
"status": "waiting",
"method": "keywords",
"step": "Timer"
}
]
}