# IPNI Plant Names Search (`maximedupre/ipni`) Actor

Search public IPNI records with plant names, genus or species terms, author abbreviations, or free text. Choose citation, author, or publication records and save names, taxonomy, authorship, publication data, and source links. Request remarks, type locations, and richer BHL links when available.

- **URL**: https://apify.com/maximedupre/ipni.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Education, Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.45 / 1,000 nomenclature entries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🌿 Search IPNI plant names with useful context

For botanists, herbarium teams, taxonomy researchers, and data builders, IPNI Plant Names Search turns plant names, genus or species terms, author abbreviations, and free text into a structured dataset of nomenclatural records. Get scientific names, taxonomic parts, authorship, publication citations, source IDs, IPNI links, and Biodiversity Heritage Library evidence in one run.

- Search **[POWO](https://apify.com/maximedupre/ipni/examples/powo)** terms and save matching IPNI nomenclature records.
- Search **[IPNI plant names](https://apify.com/maximedupre/ipni/examples/ipni-plant-names)** to collect names, citations, and source links.
- Look up an **[International Plant Names Index](https://apify.com/maximedupre/ipni/examples/international-plant-names-index)** term and keep its returned identifiers.
- Check **[Kew Plants of the World](https://apify.com/maximedupre/ipni/examples/kew-plants-of-the-world)** terms against IPNI nomenclature data.
- Build a **[Plants names list](https://apify.com/maximedupre/ipni/examples/plants-names-list)** from several submitted search terms.
- Inspect a **[WFO plant list](https://apify.com/maximedupre/ipni/examples/wfo-plant-list)** entry with its citation details.

#### 🌱 IPNI nomenclature records

Each dataset row keeps the submitted search term that first found the source record. If a later term finds the same source record, the saved row keeps that first match. Stable IPNI IDs and source links help you join the data to other work and check the original entry.

**Returned data**

Rows can include scientific names, nomenclatural rank, family, genus, species, infraspecies, abbreviated authorship, full author-team provenance, publication citations, BHL scan links, suppression status, and a Plants of the World Online presence flag. Details can also include original remarks and type locations.

#### ▶️ Search IPNI across terms

Submit one or more search terms, choose record types for every term, and optionally request more details. Leave **Maximum records** empty to return all available records until the IPNI source is exhausted. Add a maximum when you want to shorten a large run. You do not need to provide IPNI credentials because the source records are public.

#### ⚙️ Input

Enter one or more terms and choose the records you need. Record type choices apply to every submitted term.

| Field | Type | What it does |
| --- | --- | --- |
| `searchTerms` | array of strings | Searches plant names, genus or species terms, author abbreviations, or other text. Submit one or more values. |
| `recordTypes` | array of strings | Applies to every search term. Choose `citation`, `author`, or `publication`. Citation records include nomenclatural name records. |
| `maxItems` | integer, optional | Stops after this many matching records across the run. Leave it empty to return all available records until the IPNI source is exhausted. |
| `includeDetails` | boolean | Requests original remarks, type locations, and richer Biodiversity Heritage Library links for each matching record. |

**Input fields**

The following is the public default input from a successful current-beta run:

```json
{
  "searchTerms": [
    "Quercus"
  ],
  "recordTypes": [
    "citation",
    "author",
    "publication"
  ],
  "maxItems": 100,
  "includeDetails": false
}
```

#### 🧾 Output

The output link opens the records saved in the default dataset. Citation, author, and publication records use the same public shape. IPNI may omit fields that do not apply to a record or that the source does not provide.

**Dataset record**

| Field | Type | What it does |
| --- | --- | --- |
| `searchTerm` | string | The term that first found this record. |
| `recordType` | string | The IPNI record type: `citation`, `author`, or `publication`. |
| `ipniId` | string | Stable IPNI identifier for the record. |
| `ipniUrl` | URL | Link to the record in IPNI. |
| `scientificName` | string | Scientific name for the match, when IPNI provides one. |
| `rank` | string | Nomenclatural rank, when IPNI provides one. |
| `taxonomy` | object | Taxonomic parts of the name, when available. |
| `taxonomy.family` | string | Plant family, when available. |
| `taxonomy.genus` | string | Genus, when available. |
| `taxonomy.species` | string | Species part of the name, when available. |
| `taxonomy.infraspecies` | string | Infraspecies part of the name, when available. |
| `authorship` | object | Abbreviated and full authorship data, when available. |
| `authorship.abbreviation` | string | Abbreviated authorship for the record. |
| `authorship.authorTeam` | string | Full author-team provenance as source JSON text. |
| `publication` | object | Publication and citation data, when available. |
| `publication.protologue` | string | Protologue publication for the name. |
| `publication.year` | integer | Publication year, when available. |
| `publication.literatureReference` | string | Full literature reference, when available. |
| `publication.collation` | string | Page, volume, or other collation details. |
| `bhl` | object | Biodiversity Heritage Library evidence, when available. |
| `bhl.hasScan` | boolean | Whether a BHL scan is available. |
| `bhl.url` | URL | Main BHL link, when available. |
| `bhl.links` | array of URLs | Other BHL links returned by IPNI. |
| `isSuppressed` | boolean | Whether IPNI marks the record as suppressed. |
| `hasPowoRecord` | boolean | Whether IPNI reports a Plants of the World Online record for the name. |
| `remarks` | string | Original remarks, when IPNI provides them. |
| `typeLocations` | array of strings | Type locations returned when record details are requested. |

**Standard record**

This genuine row comes from the current beta run with `Quercus` and record details turned off:

```json
{
  "searchTerm": "Quercus",
  "recordType": "citation",
  "ipniId": "108963-1",
  "ipniUrl": "https://www.ipni.org/n/108963-1",
  "bhl": {
    "hasScan": true,
    "url": "http://www.biodiversitylibrary.org/openurl?ctx_ver=Z39.88-2004&rft.date=1785&rft.issue=2&rft.spage=417&rft.volume=1&rft_id=http://www.biodiversitylibrary.org/bibliography/824&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
    "links": [
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=Z39.88-2004&rft.date=1785&rft.issue=2&rft.spage=417&rft.volume=1&rft_id=http://www.biodiversitylibrary.org/bibliography/824&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=z39.88-2004&rft_id=http://www.biodiversitylibrary.org/page/33068974&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=z39.88-2004&rft_id=http://www.biodiversitylibrary.org/bibliography/824&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004"
    ]
  },
  "scientificName": "Bignonia quercus",
  "rank": "spec.",
  "taxonomy": {
    "family": "Bignoniaceae",
    "genus": "Bignonia",
    "species": "quercus"
  },
  "authorship": {
    "abbreviation": "Lam.",
    "authorTeam": "[{\"name\":\"Lam.\",\"id\":\"5227-1\",\"order\":1,\"type\":\"aut\",\"summary\":null,\"url\":\"/a/5227-1\"}]"
  },
  "publication": {
    "protologue": "Encycl. [J. Lamarck & al.]",
    "year": 1785,
    "literatureReference": "Encycl. [J. Lamarck & al.] 1(2): 417. 1785 [1 Aug 1785]",
    "collation": "1(2): 417"
  },
  "isSuppressed": false,
  "hasPowoRecord": true
}
```

**Detailed record**

This genuine row comes from the current beta run with `Poa annua` and record details turned on:

```json
{
  "searchTerm": "Poa annua",
  "recordType": "citation",
  "ipniId": "320035-2",
  "ipniUrl": "https://www.ipni.org/n/320035-2",
  "bhl": {
    "hasScan": true,
    "url": "http://www.biodiversitylibrary.org/openurl?ctx_ver=Z39.88-2004&rft.date=1753&rft.spage=68&rft.volume=1&rft_id=http://www.biodiversitylibrary.org/bibliography/669&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
    "links": [
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=Z39.88-2004&rft.date=1753&rft.spage=68&rft.volume=1&rft_id=http://www.biodiversitylibrary.org/bibliography/669&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=z39.88-2004&rft_id=http://www.biodiversitylibrary.org/page/33355180&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004",
      "http://www.biodiversitylibrary.org/openurl?ctx_ver=z39.88-2004&rft_id=http://www.biodiversitylibrary.org/bibliography/669&rft_val_fmt=info:ofi/fmt:kev:mtx:book&url_ver=z39.88-2004"
    ]
  },
  "scientificName": "Poa annua",
  "rank": "spec.",
  "taxonomy": {
    "family": "Poaceae",
    "genus": "Poa",
    "species": "annua"
  },
  "authorship": {
    "abbreviation": "L.",
    "authorTeam": "[{\"name\":\"L.\",\"id\":\"12653-1\",\"order\":0,\"type\":\"aut\",\"summary\":\"Linnaeus, Carl (1707-1778)\",\"url\":\"/a/12653-1\"}]"
  },
  "publication": {
    "protologue": "Sp. Pl.",
    "year": 1753,
    "literatureReference": "Sp. Pl. 1: 68. 1753 [1 May 1753]",
    "collation": "1: 68"
  },
  "isSuppressed": false,
  "hasPowoRecord": true,
  "typeLocations": [
    "LINN"
  ]
}
```

#### 💳 Pricing

**Charged event**

The charged event is **Nomenclature entry**. It costs `$0.00045` for each successfully returned nomenclature record saved to your dataset. The total depends on the matches, record types, details setting, and maximum you choose.

#### 🔌 Integrations

Use the Apify API to start runs and read the default dataset. Export saved records from Apify in standard data formats.

For a short guide to using Actor data:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I search several terms in one run?

Yes. Submit a list of terms and the Actor searches them in one run. The record type choices apply to every term. If the same source record matches more than one term, the saved row keeps the first term that found it.

##### What do the record type choices return?

Choose citation records for nomenclatural name records, or choose author and publication records for those source record types. You can choose more than one type for the same run.

##### What does Include record details add?

It requests original remarks, type locations, and richer Biodiversity Heritage Library links for each matching record. Turn it on when those extra source details matter more than a shorter run.

##### Does this provide accepted taxonomy or species distributions?

No. This Actor searches IPNI nomenclatural records. The `hasPowoRecord` field is an indicator reported by IPNI, not accepted taxonomy, geographic distribution, or species occurrence data.

##### What happens when Maximum records is empty?

The Actor returns all available matching records until the IPNI source is exhausted. Set a maximum when you want to keep a large run shorter.

##### Do I need IPNI credentials?

No. The Actor uses public IPNI records, so you do not need to provide source credentials.

##### What does IPNI mean?

IPNI means International Plant Names Index. It is a public source for published plant nomenclature records.

##### Can I use this with Plants of the World Online or POWO?

The output can show whether IPNI reports a Plants of the World Online record for a name. It does not replace an accepted-taxonomy or distribution source, so use a separate source when you need those fields.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~ipni/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [URL to BibTeX Converter](https://apify.com/maximedupre/url-to-bibtex-converter) turns public publication URLs into BibTeX citations for reference lists.
- [ORCID Researcher Profile Search](https://apify.com/maximedupre/orcid-researcher-profile-search) adds public researcher profiles, affiliations, works, and author identifiers to author-focused research.
- [International Plant Names Index (IPNI) Scraper](https://apify.com/jungle_synthesizer/ipni-international-plant-names-index-scraper) is a direct alternative for bulk IPNI nomenclature extraction.
- [Kew POWO Plants of the World Online Scraper](https://apify.com/jungle_synthesizer/kew-powo-plants-of-the-world-online-scraper) helps when you need accepted taxonomy, distribution, and synonym data alongside IPNI nomenclature.
- [BGCI GlobalTreeSearch Tree Species Scraper](https://apify.com/jungle_synthesizer/bgci-globaltreesearch-threatened-tree-scraper) helps build tree-species datasets with conservation and geographic context.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `searchTerms` (type: `array`):

Enter one or more plant names, genus or species terms, author abbreviations, or other text to search in IPNI.

## `recordTypes` (type: `array`):

Choose one or more record types for every search term. Citation results include nomenclatural name records. You can also choose author or publication records.

## `maxItems` (type: `integer`):

Optional. Stop after this many matching records across the run. Leave it empty to return all available records until the IPNI source is exhausted.

## `includeDetails` (type: `boolean`):

Turn this on to request original remarks, type locations, and richer Biodiversity Heritage Library links for each matching record.

## Actor input object example

```json
{
  "searchTerms": [
    "Quercus"
  ],
  "recordTypes": [
    "citation",
    "author",
    "publication"
  ],
  "maxItems": 100,
  "includeDetails": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Link to the IPNI records saved in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "Quercus"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/ipni").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["Quercus"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/ipni").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "Quercus"
  ],
  "maxItems": 100
}' |
apify call maximedupre/ipni --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/ipni"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LZjaJbhwOWYVAiTdl/builds/cuaHIhYoGL4OZRMlK/openapi.json
