# AI Intern Radar — US & Canada (`benlabs/ai-intern-radar`) Actor

Find AI/ML research internships in the US & Canada. Filter by degree, company and research area. Explore visual reports with original employer links. Chinese supported. Beta.

- **URL**: https://apify.com/benlabs/ai-intern-radar.md
- **Developed by:** [benlabs](https://apify.com/benlabs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AI Intern Radar — US & Canada

**Less searching. More time for research.**

Find AI/ML research internships and student research placements across the United States and Canada. Choose your degree, companies and research interests, then explore a clear visual shortlist with original employer links.

**Chinese-language interface and reports are also supported.**

**Public Beta:** Help us make the next version useful. Did you find a role worth applying for? What company or filter is missing? Share feedback in the **Issues** tab.

[Explore the interactive demo](https://yushu-li.github.io/ai-job-radar/) — a dated sample, not a live job feed.

### Get your shortlist in three steps

1. **Start small.** Keep the six default companies, US + Canada, PhD and 2027. Choose Master independently if it fits your search.
2. **Run the Actor.** Select **Start**. Runs use your own Apify account and platform allowance.
3. **Explore your report.** In **Output**, open **Visual report**. Refine filters, save interesting roles and visit the original postings. Filtering an existing report does not launch another scan.

Default sources: **Cohere, Waabi, Together AI, Pangram Labs, Waymo and Databricks**.

### Built for focused internship searches

- **Find your fit:** filter by US or Canada, Master or PhD, company collection, research area, internship year and explicit workplace type.
- **See the evidence:** inspect original wording about locations, qualifications and timing. Unknown details remain unverified.
- **Keep a personal shortlist:** saved jobs and application progress stay in your browser. They are not synchronized across devices.
- **Track observed changes:** reuse a `monitor_id` and enable `only_changes` to identify changes since your previous live observation.
- **Take the results with you:** download Markdown, CSV or JSON from the visual report.

### Fewer repeated requests

Complete live queries are cached for **24 hours by default**, scoped to your account, monitor and exact query. Repeat runs can reuse those results without requesting the employer sites again.

A changed query, a new monitor, expiry, missing history or `cache_max_age_hours: 0` triggers a fresh scan. Partial or failed scans are not reused. Cached reports preserve the original collection time and clearly state that sources were not checked again. They create no new change events or removal observations.

**This is per-user query caching, not a shared daily job index. No collection schedule is enabled by default.** Apify separately performs Store health tests.

### Pricing

**No additional developer fee.** Users pay only for the Apify platform resources their runs consume, using their own available credit. Compute, storage and transfer still consume resources on a cache hit.

In one measured beta pair, the six-source live run and its cached repeat each displayed approximately **$0.001** of platform usage. The cached run took longer in that pair, so we do not promise a guaranteed speedup or cost reduction. The verified benefit is avoiding repeated employer-site collection. Check your plan and allowance before running.

### Outputs

| Output | What it contains |
| --- | --- |
| **Candidates or changes** | Current matching records, or observed changes when requested. `data_mode` and `data_collected_at` distinguish fresh collection from cached or historical data. |
| **Visual report** (`DASHBOARD`) | A self-contained interactive HTML report. |
| **English report / Chinese report** (`REPORT-EN`, `REPORT-ZH`) | Markdown reports in both supported languages. |
| **Summary** (`OUTPUT`) | Counts, cache metadata, source errors and `complete`, `partial` or `failed` status. |

The first observation establishes a **baseline**; it does not mean every role was just published. First-run changes-only output and cached changes-only output normally have no change rows. The visual report still contains the current shortlist.

### Coverage and limits

The directory includes **100 selectable companies** using public Greenhouse, Ashby and Lever boards plus four experimental scoped website adapters. This does **not** mean complete or equally reliable coverage.

Google, Microsoft, Amazon and NVIDIA use limited public searches or sitemaps. Errors and coverage limits are shown rather than hidden. Meta and Apple currently have official career links only. A company in the directory is not a claim that it is currently hiring interns.

No employer login, LLM, proxy or paid data API is required. Access restrictions are not bypassed. Degree labels reflect posting text, not verified eligibility. Remote work does not establish work authorization. Company tiers are editable preferences, not objective quality ratings.

### Help improve the Beta

Use **Issues** to report missing companies, irrelevant or closed jobs, filter problems and feature requests. Include the company or posting URL, selected country and degree, expected versus actual result, and run ID when relevant.

**Issues are public. Do not include API tokens, personal application details or private documents.**

### Information and liability disclaimer

AI Intern Radar provides public job information for informational purposes only. Information may be inaccurate, outdated or incomplete. We do not guarantee accuracy, completeness or timeliness and are not responsible for losses, omissions or application outcomes arising from use or reliance. Before applying, independently verify availability, eligibility, work authorization, deadlines and other requirements on the employer's official website.

Source code is MIT-licensed; employer text and third-party data retain their original rights. Follow source terms and apply through official employer links.

# Actor input Schema

## `countries` (type: `array`):

CA = Canada; US = United States. Select one or both.

## `target_year` (type: `integer`):

Target internship year.

## `include_rolling` (type: `boolean`):

Only when the original explicitly states rolling or flexible starts.

## `include_undated` (type: `boolean`):

These are labeled unverified, never automatically labeled rolling.

## `include_adjacent` (type: `boolean`):

Include related AI, ML and data science internships.

## `include_unknown_location` (type: `boolean`):

Remote alone does not establish country eligibility.

## `preferred_keywords` (type: `array`):

Transparent keyword ranking bonuses.

## `companies` (type: `array`):

Optional override: 1–250 objects with name, provider (greenhouse/ashby/lever), board. Omit to use the directory.

## `monitor_id` (type: `string`):

History is scoped to this Actor and monitor. Same-name concurrent runs are rejected; change the name for independent tracking.

## `only_changes` (type: `boolean`):

First run establishes a baseline and therefore has no change rows. REPORT still contains the ranked current list.

## `language` (type: `string`):

Default report language. Chinese is also supported; both report files are generated.

## `company_ids` (type: `array`):

Start with six public ATS boards to limit cost. Explicit \[] scans all 100 directory companies. Some searches have limited scopes.

## `company_priority` (type: `object`):

JSON map of company ID to tier 1–5; 1 first. Editable preferences, not objective quality ratings.

## `sort_by` (type: `string`):

Recent publication first, research match, or editable company preference.

## `degrees` (type: `array`):

Empty means unrestricted. A listing can match both Master and PhD; check original requirements.

## `research_topics` (type: `array`):

Empty means all. Multiple selections use OR within this filter; different filters combine with AND.

## `workplace_types` (type: `array`):

Empty means all. Only explicit source fields are classified; unknown is not inferred as remote.

## `cache_max_age_hours` (type: `integer`):

Reuse a complete scan for the same monitor and exact filters in your account. Sources are not checked again and collection time is retained. Set 0 to refresh.

## Actor input object example

```json
{
  "countries": [
    "CA",
    "US"
  ],
  "target_year": 2027,
  "include_rolling": true,
  "include_undated": true,
  "include_adjacent": true,
  "include_unknown_location": false,
  "preferred_keywords": [
    "inference",
    "LLM",
    "reinforcement learning",
    "ML systems",
    "distributed training",
    "GPU"
  ],
  "monitor_id": "default",
  "only_changes": false,
  "language": "en",
  "company_ids": [
    "cohere",
    "waabi",
    "together-ai",
    "pangram-labs",
    "waymo",
    "databricks"
  ],
  "company_priority": {},
  "sort_by": "recent",
  "degrees": [
    "phd"
  ],
  "research_topics": [],
  "workplace_types": [],
  "cache_max_age_hours": 24
}
```

# Actor output Schema

## `candidates` (type: `string`):

No description

## `report` (type: `string`):

No description

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

No description

## `dashboard` (type: `string`):

No description

## `report_en` (type: `string`):

No description

## `report_zh` (type: `string`):

No description

# 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 = {
    "language": "en",
    "company_ids": [
        "cohere",
        "waabi",
        "together-ai",
        "pangram-labs",
        "waymo",
        "databricks"
    ],
    "degrees": [
        "phd"
    ],
    "cache_max_age_hours": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("benlabs/ai-intern-radar").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 = {
    "language": "en",
    "company_ids": [
        "cohere",
        "waabi",
        "together-ai",
        "pangram-labs",
        "waymo",
        "databricks",
    ],
    "degrees": ["phd"],
    "cache_max_age_hours": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("benlabs/ai-intern-radar").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 '{
  "language": "en",
  "company_ids": [
    "cohere",
    "waabi",
    "together-ai",
    "pangram-labs",
    "waymo",
    "databricks"
  ],
  "degrees": [
    "phd"
  ],
  "cache_max_age_hours": 24
}' |
apify call benlabs/ai-intern-radar --silent --output-dataset

```

## MCP server setup

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

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/D80TJFJHk61gDb0ro/builds/s0QIajoXqjf3c0fsj/openapi.json
