Retrieve projects currently shown in CoinSniper's listings, including each project's name, ticker, direct coin URL, and any description available on its detail page.
Use Cases
Use when the caller asks for a sample or collection of currently listed CoinSniper crypto projects and wants names, tickers, and descriptions. The collection size is the caller's requested count, such as 5.
Automation Flow
- Navigate directly to
https://coinsniper.net/. - Allow the page to finish loading. If Cloudflare protection is presented, solve the challenge and wait for the listing DOM to appear; CoinSniper may require several seconds of post-challenge settling.
- On the loaded listing page, run this evaluator to resolve the first
{count}currently listed projects and their opaque IDs without guessing IDs:
(() => {
const wanted = {count};
const seen = new Set();
const projects = [];
for (const link of document.querySelectorAll('a[href^="/coin/"]')) {
const href = link.getAttribute('href') || '';
const match = href.match(/^\/coin\/([^/?#]+)/);
if (!match || seen.has(match[1])) continue;
seen.add(match[1]);
const row = link.closest('tr[role="link"]') || link.closest('tr') || link.closest('article') || link.closest('[class*="card"]') || link;
const rowText = row.innerText || link.innerText || '';
const lines = rowText.split(/\n+/).map(s => s.trim()).filter(Boolean);
const ticker = lines.map(s => s.match(/^\$?([A-Z][A-Z0-9]{1,9})$/)?.[1]).find(Boolean) || (rowText.match(/\$([A-Z][A-Z0-9]{1,9})\b/)?.[1] || '');
const name = (link.innerText || '').split(/\n+/).map(s => s.trim()).filter(Boolean)[0] || lines[0] || '';
projects.push({
name,
ticker,
id: match[1],
url: new URL(href, location.origin).href,
listingText: rowText.replace(/\s+/g, ' ').trim()
});
if (projects.length >= wanted) break;
}
return {projects};
})()- For each resolved project URL, navigate directly to
https://coinsniper.net/coin/{id}. On the loaded detail page, run this evaluator:
(() => {
const clean = value => (value || '').replace(/\s+/g, ' ').trim();
const body = document.body.innerText || '';
const heading = clean(document.querySelector('h1')?.innerText);
const leafTexts = [...document.querySelectorAll('body *')]
.filter(el => el.children.length === 0)
.map(el => clean(el.innerText))
.filter(Boolean);
const ticker = leafTexts.find(text => /^\$?[A-Z][A-Z0-9]{1,9}$/.test(text))?.replace(/^\$/, '') || '';
const upper = body.toUpperCase();
const start = upper.indexOf('DESCRIPTION');
const end = upper.indexOf('MARKET DETAILS', start + 1);
let description = start >= 0
? clean(body.slice(start + 'DESCRIPTION'.length, end > start ? end : start + 1200))
: '';
if (description.toUpperCase() === 'NO DESCRIPTION SECTION') description = '';
return {name: heading, ticker, description, url: location.href};
})()- Return exactly the requested number of projects in listing order. Use the detail-page description when present; otherwise return an empty description or state that none was shown. Do not infer missing values.
Possible Friction Points
- Coin detail URLs use opaque numeric IDs such as
/coin/{id}. Resolve IDs from listing links first; never derive or guess them from project names. - Listing entries can appear as
tr[role="link"]rows or cards containinga[href^="/coin/"]; deduplicate links by ID because the same coin may be linked more than once. - The description is exposed on the detail page between the
DESCRIPTIONandMARKET DETAILSsections when available. Some projects have no description section. - The listing is time-sensitive: report only projects present in the page loaded for the current run.
- CoinSniper may be protected by Cloudflare. A direct navigation can require waiting, solving the challenge, and waiting again before evaluating the listing DOM.
- Ticker extraction is heuristic because listing and detail layouts may contain other uppercase labels; prefer the ticker shown alongside the project when validating results.