# NASA Technical Reports Scraper (`muhammadafzal/nasa-technical-reports-scraper`) Actor

Search public NASA NTRS records and export titles, abstracts, authors, centers, keywords, funding IDs, report metadata, and PDF links.

- **URL**: https://apify.com/muhammadafzal/nasa-technical-reports-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 nasa report records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## NASA Technical Reports Scraper

Search the public NASA Technical Reports Server (NTRS) and export structured citation metadata, abstracts, authors, NASA centers, topics, funding identifiers, and public document links.

The Actor uses NASA's documented, first-party NTRS OpenAPI. It does not log in, bypass access controls, or retrieve NASA registered content. Results are ready for research discovery, literature reviews, aerospace intelligence, citation analysis, knowledge bases, and AI-agent pipelines.

### What it extracts

Each dataset item represents one public NASA citation:

| Field | Description |
| --- | --- |
| `nasaId`, `recordUrl` | Stable NTRS citation ID and public record page |
| `title`, `abstract` | Report title and abstract when available |
| `authors`, `organizations` | Deduplicated author and affiliation names |
| `center` | NASA center code and name |
| `documentType`, `documentTypeDetails` | STI type code and readable label |
| `publicationDate`, `publicationNames` | Publication date and journal/proceedings names |
| `subjectCategories`, `keywords` | NASA-indexed topics and keywords |
| `reportNumbers`, `fundingNumbers` | Report, project, contract, grant, and task identifiers |
| `downloads`, `pdfUrl` | Public original, PDF, and extracted full-text URLs |
| `createdAt`, `modifiedAt`, `fetchedAt` | Repository and scrape timestamps |

Nullable fields remain explicit `null`, and list fields remain arrays, so the output shape is stable across runs.

### Input

The default input returns 25 best-match public records for `Artemis`:

```json
{
  "query": "Artemis",
  "maxResults": 25,
  "sortBy": "relevance"
}
```

For a targeted literature search, combine full-text search with NASA filters:

```json
{
  "query": "thermal protection",
  "centers": ["ARC", "LaRC"],
  "subjectCategories": ["Spacecraft Design, Testing and Performance"],
  "publicationDateFrom": "2020-01-01",
  "publicationDateTo": "2026-12-31",
  "sortBy": "newest",
  "maxResults": 100
}
```

Retrieve exact known citations with `citationIds`:

```json
{
  "query": "",
  "citationIds": ["20230002992", "20260001774"],
  "maxResults": 2
}
```

Supported filters include title text, abstract text, authors, organizations, NASA centers, subject categories, keywords, report numbers, funding numbers, document type details, and publication-date bounds. `maxResults` is the hard delivery and result-event cap. The Actor requests up to 100 records per NASA API page and deduplicates all results by NASA citation ID.

### Output example

```json
{
  "nasaId": "20230002992",
  "title": "Returning to the Moon: NASA's Artemis Missions",
  "abstract": "With Artemis missions, NASA will establish the first long-term presence on the Moon...",
  "authors": ["Parul Agrawal"],
  "organizations": ["Ames Research Center"],
  "center": { "code": "ARC", "name": "Ames Research Center" },
  "documentType": "PRESENTATION",
  "documentTypeDetails": "Presentation",
  "publicationDate": null,
  "publicationNames": [],
  "subjectCategories": ["Space Sciences (General)", "Fluid Mechanics and Thermodynamics"],
  "keywords": ["Artemis", "Thermal Protection"],
  "reportNumbers": [],
  "fundingNumbers": ["374409.01.02.02.02"],
  "distribution": "PUBLIC",
  "disseminated": "DOCUMENT_AND_METADATA",
  "downloadsAvailable": true,
  "pdfUrl": "https://ntrs.nasa.gov/api/citations/20230002992/downloads/Artemis%20Presentation.pdf",
  "recordUrl": "https://ntrs.nasa.gov/citations/20230002992",
  "createdAt": "2023-03-06T17:57:52.9886810+00:00",
  "modifiedAt": "2025-08-31T18:39:21.7150190+00:00",
  "fetchedAt": "2026-08-28T12:00:00.000Z"
}
```

The default dataset contains only report records. Runtime diagnostics are written separately to the `SUMMARY` key in the default key-value store, with `data`, `partial`, `empty`, or `rejected` status.

### Pay per event

| Event | Price | When charged |
| --- | ---: | --- |
| Actor start | $0.0005 | Once when a run starts |
| NASA report record | $0.001 | Once for each item written to the default dataset |

A successful 25-result default run costs up to **$0.0255** in events. A one-result run costs **$0.0015**. A valid search with no matches incurs only the start event. Apify platform behavior and any account discounts are shown in Console before the run.

### Reliability and limits

The Actor calls NASA's public `POST /api/citations/search` endpoint directly and uses the public citation endpoint for exact IDs. It retries rate limits, server errors, timeouts, and network failures with bounded exponential backoff. Invalid searches and missing citation IDs are not retried indefinitely. Partial valid results are preserved, and skipped exact IDs are listed in `SUMMARY`.

NASA controls repository availability, metadata completeness, indexing, and download assets. A report may have no abstract, publication date, report number, or PDF; those cases are represented truthfully rather than fabricated. The Actor returns public metadata and URLs but does not download or parse PDF contents. The maximum supported delivery cap is 5,000 records per run.

### Responsible use

Use the data in accordance with NASA's NTRS/OpenAPI terms, applicable law, and the rights attached to individual documents. Public availability does not imply that every linked work is free of third-party copyright restrictions. This Actor does not access NTRS registered content or request NASA credentials.

For support, include the Apify run ID, redacted input, and the `SUMMARY` record. Do not post account tokens or private credentials.

# Actor input Schema

## `query` (type: `string`):

Use this for full-text search across public NASA NTRS metadata, for example `Artemis thermal protection`. Defaults to `Artemis`; clear it only when using citation IDs or filters.

## `citationIds` (type: `array`):

Use this to retrieve exact public NTRS records by numeric ID, for example `20230002992`. This is not a DOI or report number.

## `title` (type: `string`):

Use this to match words in a report title, for example `lunar surface`. Leave empty to search all titles.

## `abstract` (type: `string`):

Use this to match words in the abstract, for example `thermal protection system`. Leave empty to search all abstracts.

## `authors` (type: `array`):

Use this for author names as NASA stores them, for example `Mark Schoenenberger`. Multiple values narrow the NASA search.

## `organizations` (type: `array`):

Use this for contributing organizations, for example `Langley Research Center`. This is not the NASA center-code filter.

## `centers` (type: `array`):

Use this for NASA center names or codes, for example `LaRC` or `Ames Research Center`. Leave empty for all centers.

## `subjectCategories` (type: `array`):

Use this for NASA STI subject categories, for example `Astrophysics`. Values should match NTRS category text.

## `keywords` (type: `array`):

Use this for indexed NTRS keywords, for example `climate change`. This is stricter than the full-text query.

## `reportNumbers` (type: `array`):

Use this for formal report identifiers, for example `NASA-TM-20210000001`. This is not the numeric citation ID.

## `fundingNumbers` (type: `array`):

Use this for NASA project, contract, grant, or task identifiers, for example `NNA14AB82C`.

## `documentType` (type: `string`):

Use this to filter NASA's detailed STI type text, for example `Presentation` or `Technical Memorandum (TM)`. Leave empty for all document types.

## `publicationDateFrom` (type: `string`):

Use this lower publication-date bound in YYYY-MM-DD format, for example `2024-01-01`. This is not the repository acquisition date.

## `publicationDateTo` (type: `string`):

Use this upper publication-date bound in YYYY-MM-DD format, for example `2025-12-31`. It must not precede the lower bound.

## `sortBy` (type: `string`):

Use `relevance` for best matches, `newest` or `oldest` for publication date, or `modified` for recently updated NTRS records.

## `maxResults` (type: `integer`):

Use this to cap delivered dataset records and PPE result events. Default is 25; accepted range is 1–5,000.

## `maxRequestRetries` (type: `integer`):

Use this to retry NASA 429, 5xx, timeout, or network failures. Default is 2; accepted range is 0–5. Invalid searches are not retried.

## Actor input object example

```json
{
  "query": "Artemis",
  "citationIds": [],
  "authors": [],
  "organizations": [],
  "centers": [],
  "subjectCategories": [],
  "keywords": [],
  "reportNumbers": [],
  "fundingNumbers": [],
  "sortBy": "relevance",
  "maxResults": 25,
  "maxRequestRetries": 2
}
```

# Actor output Schema

## `results` (type: `string`):

Schema-validated public NASA Technical Reports Server citation records.

## `summary` (type: `string`):

Run outcome, delivered and matched counts, request count, warnings, and estimated result-event cost.

# 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 = {
    "query": "Artemis"
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/nasa-technical-reports-scraper").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 = { "query": "Artemis" }

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/nasa-technical-reports-scraper").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 '{
  "query": "Artemis"
}' |
apify call muhammadafzal/nasa-technical-reports-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/nasa-technical-reports-scraper"
        }
    }
}
```

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/VEImRS0VhZV77hjfL/builds/pA7s4ZkwweW9vGF9V/openapi.json
