search_works
Search AO3 for fanfiction works using optional fandom, tag, relationship, character, rating, word-count, and sorting filters; combine filters or page through results to narrow and retrieve matching fics.
Instructions
Search AO3 for works. All filters optional; combine freely.
RECOMMENDATION WORKFLOW — reading before recommending is MANDATORY, and the
reading is done by a SEPARATE model, not you. Blurbs are author-written ads;
never recommend, rank, or summarize a fic from its blurb alone. Cast a wide
net (pages=2-3, i.e. 40-60 blurbs), shortlist the promising ones, then hand
the top ≤20 ids to read_works — a second AI reads them and reports back.
Recommend ONLY fics that came back from read_works. Do not read fic text
yourself; delegating it is the entire point of this server.
SEARCH STRATEGY — searching is cheap and reading is delegated, so the
winning move is always to OVER-FETCH and let read_works brute-force the
shortlist, never to craft one perfect narrow query. Filters multiply: each
one you add cuts the pool, and stacked filters routinely cut it to zero.
USE WILDCARDS LIBERALLY — abuse them. A * matches any run of characters
and works in EVERY name field (fandom, relationship, character, tags)
and in query. Wrapping a term in stars is the single best defence against
AO3's exact-canonical-name trap: fandom="Genshin Impact (Video Game)"
returns ZERO (the canonical tag is actually "原神 | Genshin Impact (Video
Game)"), but fandom="*Genshin Impact*" returns the whole fandom. Likewise
relationship="*Kazuha*Scaramouche*", tags="*Enemies to Lovers*". When you
don't know the exact canonical name — which is most of the time — reach for a
wildcard first instead of guessing the literal string.
IF YOU GET 0 (or few) RESULTS, that is almost always your query being too narrow, NOT the content missing from AO3. Recover instead of giving up:
FIRST, wildcard the name fields (
*Genshin Impact*). This fixes the most common cause — an exact-match field that didn't match the canonical tag — in one retry, without a separatefind_tagsround-trip.Still unsure of a name?
find_tagsresolves it, or move the idea intoqueryas free text (fuzzy, no canonical spelling needed).Drop filters one at a time and retry:
word_countfirst, thencomplete_only, thenrating. Re-add only what the user insisted on.Concepts don't need to be tags at all: "slow burn rivals in a bakery" works fine as free-text
queryeven if no such tag exists.Still thin? Search the broad version (fandom + category, sort by kudos), fetch 2-3 pages, and let the blurbs +
read_worksdo the filtering. A human reader has to search narrowly because they can only read a few fics; you can read twenty at once, so breadth costs you nothing.
Results show numeric work ids, not URLs. When relaying a work to the user, build the link yourself: https://archiveofourown.org/works/{id}
Each result shows a kudos-to-hits ratio (k/h) — AO3's most honest quality proxy, since kudos are one-per-reader but hits count every visit. Compare it only within similar works: multi-chapter fics accumulate hits on every chapter visit, so long WIPs run structurally lower ratios than one-shots.
Args:
query: free-text search. Supports AO3's full operator syntax
(case-sensitive, space after colon required where shown):
"exact phrase", AND / OR / NOT, -term to exclude;
words>10000, words:1000-5000, kudos>500 (same for hits/
comments/bookmarks); sort:kudos, sort:hits, sort:>posted
(oldest first); otp: true (exactly one ship, no side pairings);
creators: username / -creators: username; summary: "phrase";
expected_number_of_chapters: 1 (one-shots only);
series.title: * (part of a series); language_id: en.
Also supports * wildcards, e.g. *coffee shop*.
⚠️ query is a FULL-TEXT match on the fic body, AND'd with every
other filter — so it narrows HARD. Do NOT stuff mood/concept
synonyms here ("nuzzle OR forehead kiss OR won't let go"): that
demands the prose literally contain one of those strings on top of
your tag/fandom filters, and routinely collapses a healthy 60-result
search to 0. Concepts belong in tags (wildcarded), not here. Use
query for author names, quoted title/summary phrases, or the numeric
operators above — leave it EMPTY when a tag already covers the vibe.
title: words in the work title.
author: author/creator name.
fandom: fandom name, e.g. "Naruto" (comma-separate several). Exact
canonical match — but * wildcards work here: prefer
"Genshin Impact" over the literal name to survive canonical tags
with prefixes/aliases (e.g. "原神 | Genshin Impact (Video Game)").
relationship: ship tag. Format: "A/B" romantic, "A & B" platonic,
canonical name order, e.g. "Kakashi Hatake/Iruka Umino". Wildcards
work: "KazuhaScaramouche*" beats guessing the exact tag order.
character: character name(s), comma-separated. Wildcards work here too.
tags: freeform tags, comma-separated, EXACT canonical spelling
(use find_tags to resolve, or wildcard it: "Enemies to Lovers"). Popular canonical tags: Fluff; Angst;
Hurt/Comfort; Emotional Hurt/Comfort; Angst with a Happy Ending;
Hurt No Comfort; Enemies to Lovers; Friends to Lovers; Enemies to
Friends to Lovers; Slow Burn; Mutual Pining; Fake/Pretend
Relationship; There Was Only One Bed; Idiots in Love; Getting
Together; Established Relationship; First Kiss; Found Family;
Fix-It; Time Travel; Kid Fic; Domestic Fluff; Tooth-Rotting Fluff;
Crack; Crack Treated Seriously; 5+1 Things; POV Outsider; Soulmates;
Smut; Plot What Plot/Porn Without Plot; Alpha/Beta/Omega Dynamics;
Dead Dove: Do Not Eat; Canon Compliant; Post-Canon; Alternate
Universe - Modern Setting; Alternate Universe - Canon Divergence;
Alternate Universe - Coffee Shops & Cafés; Alternate Universe -
College/University; Alternate Universe - Soulmates.
rating: one of: general, teen, mature, explicit, not rated.
categories: comma-separated relationship categories to include:
F/F, F/M, Gen, M/M, Multi, Other. Empty = all.
complete_only: only finished works.
word_count: range like "10000-50000", ">5000" or "<20000".
sort_by: relevance | kudos | hits | comments | bookmarks | words | date_updated | date_posted.
page: which result page to start from (for paging through results).
pages: result pages to fetch, 20 works each (1-5). For a targeted
lookup 1 is enough; for a recommendation hunt fetch 2-3 pages
(40-60 blurbs) so the read_works shortlist has real competition.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| tags | No | ||
| pages | No | ||
| query | No | ||
| title | No | ||
| author | No | ||
| fandom | No | ||
| rating | No | ||
| sort_by | No | relevance | |
| character | No | ||
| categories | No | ||
| word_count | No | ||
| relationship | No | ||
| complete_only | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |