Skip to content

SERP feature types

format: "advanced" returns every SERP feature Serplify detects. Each item is discriminated by its type and carries the shared ranking fields (rank_absolute, rank_group, page).

These types have rich, stable, documented fields:

typeDescriptionNotable fields
organicClassic organic resultdomain, title, description, url, breadcrumb, highlighted, links, rating, price, images, faq
paidPaid addomain, title, description, url, breadcrumb, description_rows, price, rating
featured_snippetAnswer box pulled from a pagedomain, title, description, url, featured_title, table
ai_overviewGoogle AI Overviewitems[] (text/markdown/links/images/references), references[], asynchronous_ai_overview
people_also_ask”People also ask” accordionitems[] with title, seed_question, expanded_element[]
related_searchesRelated search chipsitems[] (strings)
refinement_chipsRefinement/filter chipsitems[] with title, options[]
knowledge_graphKnowledge paneltitle, subtitle, description, url, image_url, cid, items[]
local_packGoogle Business (map 3-pack)title, description, domain, phone, url, rating, cid

These are also returned when present, with a common, flexible field set (title, description, url, items[], images[], rating, price, and type-specific extras):

images, video, short_videos, top_stories, twitter, map, shopping, popular_products, answer_box, currency_box, math_solver, people_also_search, jobs, events, recipes, carousel, multi_carousel, mention_carousel, app, commercial_units, compare_sites, courses, discussions_and_forums, explore_brands, find_results_on, found_on_web, google_flights, google_hotels, google_posts, google_reviews, hotels_pack, knowledge_graph_expanded_item, knowledge_graph_images_item, local_services, perspectives, product_considerations, questions_and_answers, scholarly_articles, third_party_reviews, top_sights.

Because items is a mixed list, switch on type:

for (const item of data.items) {
switch (item.type) {
case "organic":
console.log(item.rank_absolute, item.domain, item.url);
break;
case "local_pack":
console.log("GMB:", item.title, item.cid);
break;
case "people_also_ask":
console.log("PAA questions:", item.items?.map((q) => q.title));
break;
}
}

Use feature_types on the result to see which types are present before iterating.