# Carrier Risk Check: FMCSA vetting verdict + flags (`pelicanlabs/carrier-risk-check`) Actor

Should I tender this load to this MC/DOT number? Pass, review or fail with the flags behind it: authority status and age, revocations, insurance on file and cancellations, out-of-service orders and rates, safety rating, name/address changes. From FMCSA public files. $0.02 per check.

- **URL**: https://apify.com/pelicanlabs/carrier-risk-check.md
- **Developed by:** [Jacob](https://apify.com/pelicanlabs) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 88.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 carrier checkeds

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/actors/running/actors-in-store.md#pay-per-event

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

## Carrier Risk Check: FMCSA vetting verdict + flags

Should you tender this load to this MC or DOT number? Paste USDOT or MC numbers and get back **pass**, **review** or **fail** for each, with the flags behind the verdict. Everything comes from FMCSA's own public files on data.transportation.gov; no carrier website or login page is scraped.

### What each row has

- `verdict` and `reasons` (code, severity, detail, date)
- USDOT and every MC/MX/FF number, legal and DBA names, physical address, phone
- USDOT status, operating authority status per docket, authority grant date and age, suspensions and revocations in the last 24 months
- BI\&PD liability required and on file, cargo and bond flags, insurance policies and recent cancellations
- 24-month vehicle and driver out-of-service rates next to FMCSA's national averages, 24-month crash counts, safety rating, out-of-service orders
- `match_confidence`, `source_url` (the carrier's SAFER snapshot), `source_as_of` and the date of every FMCSA file used

### Verdict rules

**fail:** not found; USDOT not active; no active motor-carrier authority; an out-of-service order with no rescind date; BI\&PD on file below the required amount; safety rating Unsatisfactory.

**review:** authority younger than 6 months; a BI\&PD cancellation in the last 90 days or pending; a suspension or revocation pending, or one in the last 12 months; vehicle or driver out-of-service rate above 1.5 times the national average (with at least 5 inspections); safety rating Conditional; a recent name or address change.

### Data currency

FMCSA moved licensing and insurance into its MOTUS system in 2026. The legacy licensing and insurance files say they were "last refreshed on 05/14/2026 and will no longer be updated". This actor reads the MOTUS files, which update daily. For dockets FMCSA has not yet carried into MOTUS, it uses the 2026-05-14 authority status and labels it that way. Inspection counts come from FMCSA's monthly SMS files. The data is rebuilt each time the actor is built.

### Pricing

$0.02 per check (found or not found). Rows with an invalid number are free.

### Integrations

Use this actor from n8n, Make, Google Sheets, Clay or Zapier with your own Apify token (Apify Console > API & Integrations). Every integration makes the same call:

```
POST https://api.apify.com/v2/acts/pelicanlabs~carrier-risk-check/run-sync-get-dataset-items?memory=2048
Authorization: Bearer <your Apify token>
Content-Type: application/json

{"carriers":["3262418","MC-1409700"],"maxItems":2}
```

The response is a JSON array with one item per input row. The main fields are `verdict`, `reason_codes`, `legal_name`, `usdot`, `mc_numbers`, `authority_status`, `authority_age_days`, `bipd_on_file_usd`, `safety_rating`, `vehicle_oos_rate`, `driver_oos_rate`, `crashes_24m`, `source_url`, `source_as_of`.

**Send a list in one request.** Each request is one actor run, and each run has a start-up time of several seconds and a small Apify start fee. A batch of 500 rows costs the same start-up as a batch of 1. The n8n workflow and the Google Sheets menu send batches. Clay, Zapier and the Sheets formula send one row per run, which suits small volumes.

| Tool | What you get | Download |
|---|---|---|
| n8n | Workflow to import: reads a Google Sheet, sends up to 500 unchecked rows in one run, writes the results back | [carrier-risk-check.json](https://carrier-risk-check.pages.dev/integrations/n8n/carrier-risk-check.json) |
| Make | Blueprint (HTTP module, one run per batch); setup steps for the new HTTP app are below | [carrier-risk-check.blueprint.json](https://carrier-risk-check.pages.dev/integrations/make/carrier-risk-check.blueprint.json) |
| Google Sheets | Apps Script: `=CARRIER_CHECK("MC-1409700")` (USDOT or MC number) for single cells, and a menu item that checks a selected range in batches of 200 | [pelican-checks.gs](https://carrier-risk-check.pages.dev/integrations/google-sheets/pelican-checks.gs) |
| Clay | HTTP API enrichment column (steps below) | - |
| Zapier | Webhooks by Zapier, Custom Request (steps below) | - |

**n8n:** in the workflow menu (three dots), choose Import from File, or Import from URL with the link above. Open *Run actor (run-sync)* and create a **Header Auth** credential with Name `Authorization` and Value `Bearer <your token>`. In *Read rows* and *Write results*, choose your sheet. Row 1 needs the columns `MC or USDOT` plus the result columns listed in the workflow's note.

**Make:** create a scenario, open the three-dots menu, choose Import Blueprint and select the file. In the HTTP module, add an API key keychain that sends `Authorization: Bearer <your token>` in the header. Edit `input_json` in the first module, or map it from your sheet. Then add an Iterator on the HTTP module's `Data` to get one bundle per row. To build the same flow on the new HTTP app (version 4) instead, use the *Make a request* module with the method, URL, header and body shown above.

**Google Sheets:** in your sheet, open Extensions > Apps Script, paste the file and save, then reload the sheet. Choose *Pelican checks > Set Apify token*. Then either type the formula, or select your rows and choose *Check selected rows: carrier* (select one column of MC or USDOT numbers). Results are written to the columns to the right of your selection. Rows that already have a result are skipped, so you can run it again to continue. A formula must finish within Google's 30-second limit for custom functions, so use the menu for anything more than a few rows.

**Clay:** Add enrichment > HTTP API > Configure.

- Method: `POST`
- Endpoint: `https://api.apify.com/v2/acts/pelicanlabs~carrier-risk-check/run-sync-get-dataset-items?memory=2048&timeout=60`
- Headers: `Authorization` = `Bearer <your token>`. You can save this as a header account so the token is not shown in the table.
- Body: `{"carriers": ["/MC or USDOT"]}`. Replace the `/Column Name` parts with your own columns: type `/` to insert one.
- Clay sends one request, and so one actor run, per row. The response is an array with one item. Run a single row first, then add the fields you want (`verdict` first) as columns.

**Zapier:** use the *Webhooks by Zapier* action *Custom Request*.

- Method: `POST`
- URL: `https://api.apify.com/v2/acts/pelicanlabs~carrier-risk-check/run-sync-get-dataset-items?memory=2048&timeout=25`
- Data: the JSON body above, with your Zap's fields mapped in.
- Headers: `Authorization` = `Bearer <your token>` and `Content-Type` = `application/json`.
- Zapier stops a step after about 30 seconds, so send one row per Zap run. Apify's own Zapier app also has *Run Actor and Fetch Results*, which works if you prefer it.

Pricing: $0.02 per check (rows with an invalid number are free), billed by Apify to the account that owns the token.

### Limits

- Informational only. Not a certification, safety rating or approval of any carrier, and not legal advice. Status can change at any time; confirm on the carrier's SAFER snapshot before tendering.
- No live FMCSA call unless the actor's owner sets an `FMCSA_WEBKEY` environment variable (then each row also carries a QCMobile live check).

# Actor input Schema

## `carriers` (type: `array`):

One per line: a USDOT number (3262418) or a docket (MC-1409700, MX-..., FF-...).

## `queries` (type: `array`):

Each item: {"usdot": 3262418} or {"mc": "MC-1409700"}. Give both to also check that the MC belongs to that USDOT.

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

Stop after this many checks (cap 10,000).

## Actor input object example

```json
{
  "carriers": [
    "3262418",
    "MC-1409700"
  ],
  "maxItems": 1000
}
```

# Actor output Schema

## `verdicts` (type: `string`):

One row per carrier query: pass/review/fail with reasons, carrier record, source links.

## `verdictsTable` (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 = {
    "carriers": [
        "3262418",
        "MC-1409700"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pelicanlabs/carrier-risk-check").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 = { "carriers": [
        "3262418",
        "MC-1409700",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pelicanlabs/carrier-risk-check").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 '{
  "carriers": [
    "3262418",
    "MC-1409700"
  ]
}' |
apify call pelicanlabs/carrier-risk-check --silent --output-dataset

```

## MCP server setup

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

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/mOhq0sx2VUFC9ajga/builds/pST2oVxF56ro7EXn8/openapi.json
