---
name: 1stauthor-talent
description: Find and read researcher profiles through the 1stAuthor API — by name, organisation, role, area or h-index, plus the pages a profile cites. Use when asked who works on something, or about a specific researcher.
---

# 1stAuthor Talent

AI researcher directory: 189k people, 160k LLM-researched profiles (education, career, representative papers, open source), Google Scholar metrics rendered live. One document per person; id is person_id.

Base URL `https://api.1stauthor.com`. Every call takes `Authorization: Bearer $FA_API_KEY`; the free samples named below work without a key. Free sample id: `7870`, free sample query: `Federica Sarro`.

## Three verbs, every domain

```
POST /v1/{domain}/search  {query, filters?, top_k?}      → hits[].id + a card each
GET  /v1/{domain}/read/{id}?level=brief|detail|full      → read as deep as you need
POST /v1/{domain}/ask     {query, effort: low|medium|high} → an answer with real citations
```

`read` also takes `extra=<side>` for another side of the same document and `format=json|md|html`.
At `level=full`, `section=<name>` reads one section and `characters=N` the first N characters.

## Start here

- **Look someone up by name** — `POST /v1/talent/search {"query": "Federica Sarro"}`
- **Find people matching criteria** — `POST /v1/talent/search {"query": "具身智能", "filters": {"org": "清华大学", "role": "教授", "min_h_index": 30}}`
- **Read one person** — `GET /v1/talent/read/7870`

## Search filters

| field | type | meaning |
|---|---|---|
| `org` | keyword · eq any | Current organisation, e.g. Tsinghua University; several allowed (past or current: advanced field orgs) |
| `role` | keyword · eq any text | Title: the normalised titles match exactly; anything else (or {"text": …}) is a full-text match on the raw title |
| `area` | keyword · eq any | Research area, e.g. embodied AI, RAG; several allowed |
| `location` | keyword · eq any | Location, e.g. Beijing, Singapore; several allowed |
| `min_h_index` | integer · eq | h-index at least |
| `active_since` | integer · eq | Most recent paper in or after this year (drops inactive people) |

Rarely needed, but valid: `names`, `name_zh`, `name_en`, `aff_raw`, `orgs`, `orgs_current`, `role_norm`, `career_stage`, `areas`, `h_index`, `citations_all`, `citations_5y`, `i10_index`, `last_paper_year`, `profile_at`, `has_profile`, `has_scholar`.

Filters combine with AND; `_or` / `_not` are available. Ranges are `{"gte": n}` / `{"lte": n}`, full text is `{"text": "…"}`.

## Read

| level | credits | returns |
|---|---|---|
| `brief` | 1 | Card: name, affiliation, title, areas, h-index, citations, has_profile (what search hits carry as brief) |
| `detail` (default) | 3 | Everything most callers need in one call (the default, level=detail): card + bio, current organisations, education, career, top 5 papers, Scholar metrics, top 5 coauthors, advisors, and the full profile's section map (read one with level=full&section=<name>) |
| `full` | 10 | The full profile markdown (level=full; the contact section is omitted unless contact=1) |

| extra | credits | returns |
|---|---|---|
| `scholar` | 2 | Structured Google Scholar: metrics (all / 5y), citations by year, top papers, as_of, stale, source. A stale snapshot is rebuilt from cache for free when possible, otherwise queued for background refresh |
| `scholar_live` | 20 | Same as scholar but synchronously fetches the latest numbers from Google Scholar (≤10s). Subject to a per-account daily quota (talent:scholar_live) and a global crawl budget; if the refresh does not actually happen you get a 502 and the credits and quota back — use extra=scholar for the stored snapshot |
| `papers` | 2 | Representative papers: Scholar top papers + profile top_papers + OpenAlex works, deduplicated by title, sorted by citations |
| `network` | 2 | Relations: coauthors (with in-corpus person_id), advisors, students |
| `sources` | 1 | The profile's reference list: the [n] numbers used in the report, url, title, confidence, whether the page archived at research time is still readable (snapshot), and which facts it backs (backs: education / affiliation) |
| `source` | 2 | The archived page behind one reference (the snapshot taken at research time; no live fetch). n is the [n] in the report; raw=1 returns the original HTML |

## Ask

`POST /v1/talent/ask {query, effort}` — Find or understand people: an agent searches the corpus and reads profiles, answering with [talent:<id> <name>] citations; no web access, says so when nobody matches. Costs 50 / 100 / 200 credits by effort. Append `/stream` for NDJSON; the first event is always `billing`.

`sources` is the retrieval set, not the citation list — filter it by the ids that appear in `answer`. `answer_truncated` means the answer is incomplete; say so.

## Also here

- POST /v1/talent/resolve {names: [..≤50]} → 每个名字的库内同名候选（含拼音 / 拆写变体；2 credits/次）

## Facets

`GET /v1/talent/facets?field=<field>` lists the legal values for `orgs`, `orgs_current`, `areas`, `role_norm`, `career_stage`, `location`, `last_paper_year` — free, no key. Use it instead of guessing a spelling.

## Working rules

- **Search first, read second.** A search hit is a card; decide from the card which ids deserve a read.
- **Read in layers.** `detail` answers most questions; go to `full` only when the answer is not in it.
- **Filters are declared.** An undeclared filter field is a 400, never a silent no-op. `GET /v1/{domain}` lists what exists.
- **Cite what you read.** Use the citation format below, and say plainly when the corpus has nothing.
- **Failures are not charged.** A 404 costs nothing; an upstream error is refunded. Quote `meta.request_id` when reporting one.

Citation format: `[talent:7870 Federica Sarro]`.

## What this corpus will and will not tell you

- People with has_profile=false carry only name/affiliation-level data; level=full (and its sections) returns 404.
- Profile content has a daily quota counted in distinct people read per day (talent:profiles; per-plan numbers are in the self-description's quotas): re-reading the same person is free, card / brief and search are not capped. Over the limit returns 429 quota_exceeded with used_today and resets_at. Contact us for a talent:bulk key for volume or offline use (it lifts the scholar_live quota too).
- Common usage is in quickstart: search to look people up or filter them, read (default level=detail) to read one in a single call; other facets via extra=, a human-readable page via format=html; filters marked advanced are there when you need them.
- Facet fields: org / role / area / location / active_since, plus orgs / career_stage (recomputed nightly).
- POST /v1/talent/resolve {names:[…]} checks a batch of names (paper authors, a team page) against the corpus and returns person_ids.
- Name lookup: when the query looks like a person's name (2–4 Chinese characters / 2–4 Latin words), people with that name come first (hit.match="name"); Chinese names are converted to pinyin and Hongjin / Hong Jin / Hong-Jin all match. The response carries name_match: exact (full name matches — a Latin name, or a Chinese name of 3+ characters matched directly) returns only those people; partial (e.g. matched only through pinyin) keeps the normal results after them. mode=name returns only people with that name (ordered by has_profile, then h-index).
- Every [n] in a profile points at an entry in extra=sources; extra=source&n=3 returns the page archived when the profile was researched (text plus the fetch date). Only snapshot=text has readable text — none / blocked (the site refused the crawler) / html (raw page only, add raw=1 for the original HTML) return 404, which is not charged.
- Scholar numbers inside profile.publications are crawl-time values; trust h_index / citations_* in level=brief / detail.
- The closing 'online footprint & contact' section comes from public homepages.

---

Generated from https://api.1stauthor.com/v1/talent on 2026-10-14. Full reference: https://1stauthor.com/docs/talent/