tap
Back

devto/search

devtoRead-only

Search Dev.to articles by keyword

dev.to
Last 7 days
0
Last 30 days
0
All time
0
devto/search.js
/* @meta
{
  "name": "devto/search",
  "description": "Search Dev.to articles by keyword",
  "domain": "dev.to",
  "args": {
    "query": { "required": true, "description": "Search keyword or phrase" },
    "count": { "required": false, "description": "Number of results (default 20, max 60)" }
  },
  "readOnly": true,
  "example": "bb-browser site devto/search \"rust programming\""
}
*/

async function(args) {
  const query = args.query;
  if (!query) return { error: 'query is required' };
  const count = Math.min(args.count || 20, 60);

  const appId = 'PRSOBFP46H';
  const apiKey = '9aa7d31610cba78851c9b1f63776a9dd';
  const url = `https://${appId}-dsn.algolia.net/1/indexes/Article_production/query?x-algolia-application-id=${appId}&x-algolia-api-key=${apiKey}`;

  const resp = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: JSON.stringify({ query, hitsPerPage: String(count), queryType: 'prefixNone', page: '0' })
  });

  if (!resp.ok) return { error: 'HTTP ' + resp.status, hint: 'Algolia API error' };
  const data = await resp.json();
  const hits = data.hits || [];

  return {
    query,
    count: hits.length,
    articles: hits.map(a => ({
      title: a.title,
      url: a.path ? ('https://dev.to' + a.path) : null,
      author: a.user?.name || null,
      username: a.user?.username || null,
      published_at: a.readable_publish_date || null,
      reactions: a.public_reactions_count || 0,
      comments: a.comments_count || 0,
      tags: a.tag_list || [],
      reading_time: a.reading_time || null
    }))
  };
}
Updated May 23, 2026Created May 23, 2026SHA-256: 9de06a1db312