Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create a minimal working Flexport example — list shipments and track containers. Use when starting a new Flexport integration, testing your setup, or learning the Flexport REST API v2 patterns. Trigger: "flexport hello world", "flexport example", "flexport quick start".
.claude/skills/jeremylongshore-flexport-hello-world/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 20% | 0% |
List shipments and retrieve tracking milestones using the Flexport REST API v2. Flexport has no npm SDK -- you call https://api.flexport.com directly with bearer token auth and a Flexport-Version: 2 header.
FLEXPORT_API_KEY environment variable setflexport-install-auth setupfetch)typescript// src/flexport/hello.ts const BASE = 'https://api.flexport.com'; const headers = { 'Authorization': `Bearer ${process.env.FLEXPORT_API_KEY}`, 'Flexport-Version': '2', 'Content-Type': 'application/json', }; // List shipments with pagination const res = await fetch(`${BASE}/shipments?per=5&page=1`, { headers }); const { data } = await res.json(); data.records.forEach((shipment: any) => { console.log(`${shipment.id} | ${shipment.status} | ${shipment.freight_type}`); console.log(` Origin: ${shipment.origin_port?.name ?? 'N/A'}`); console.log(` Dest: ${shipment.destination_port?.name ?? 'N/A'}`); });
typescript// Retrieve a single shipment with tracking milestones const shipmentId = data.records[0].id; const detail = await fetch(`${BASE}/shipments/${shipmentId}`, { headers }).then(r => r.json()); console.log(`\nShipment ${detail.data.id}:`); console.log(` Status: ${detail.data.status}`); console.log(` Cargo ready: ${detail.data.cargo_ready_date}`); console.log(` Containers: ${detail.data.containers?.length ?? 0}`);
typescript// Get container details for ocean freight shipments const containers = await fetch( `${BASE}/shipments/${shipmentId}/containers`, { headers } ).then(r => r.json()); containers.data.records.forEach((c: any) => { console.log(`Container ${c.container_number} | ${c.container_type} | ${c.status}`); });
shp_abc123 | in_transit | ocean
Origin: Shanghai Port
Dest: Los Angeles Port
Shipment shp_abc123:
Status: in_transit
Cargo ready: 2025-03-01
Containers: 2
Container MSKU1234567 | 40ft_hc | in_transit| Error | Cause | Solution | |-------|-------|----------| | 401 Unauthorized | Invalid API key | Check FLEXPORT_API_KEY env var | | 404 Not Found | Wrong shipment ID | Verify ID from /shipments list | | 422 Unprocessable | Bad query params | Check per/page are integers | | Empty records array | No shipments yet | Create a booking first or use sandbox |
pythonimport os, requests BASE = 'https://api.flexport.com' headers = { 'Authorization': f'Bearer {os.environ["FLEXPORT_API_KEY"]}', 'Flexport-Version': '2', } shipments = requests.get(f'{BASE}/shipments', headers=headers, params={'per': 5}).json() for s in shipments['data']['records']: print(f"{s['id']} | {s['status']} | {s['freight_type']}")
bashcurl -s -H "Authorization: Bearer $FLEXPORT_API_KEY" \ -H "Flexport-Version: 2" \ https://api.flexport.com/shipments?per=3 | jq '.data.records[] | {id, status, freight_type}'
Proceed to flexport-local-dev-loop for development workflow setup.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 14,634 | 11,414 | -22% | 1 | 1 | 0% | 3,174 | 2,457 | -23% | 0 | 0 | — |
case-02 | fail→pass | 20,503 | 7,890 | -62% | 1 | 1 | 0% | 3,352 | 2,961 | -12% | 0 | 0 | — |
case-03 | fail→pass | 13,421 | 10,075 | -25% | 1 | 1 | 0% | 1,726 | 2,180 | +26% | 0 | 0 | — |
case-04 | fail→pass | 6,789 | 2,407 | -65% | 1 | 1 | 0% | 1,369 | 1,510 | +10% | 0 | 0 | — |
case-05 | fail→pass | 12,032 | 7,414 | -38% | 1 | 1 | 0% | 1,294 | 1,549 | +20% | 0 | 0 | — |
case-06 | pass→pass | 15,730 | 7,086 | -55% | 1 | 1 | 0% | 1,907 | 1,428 | -25% | 0 | 0 | — |
case-07 | pass→pass | 9,325 | 11,758 | +26% | 1 | 1 | 0% | 1,597 | 2,187 | +37% | 0 | 0 | — |
case-08 | fail→pass | 9,276 | 2,518 | -73% | 1 | 1 | 0% | 705 | 1,509 | +114% | 0 | 0 | — |
case-09 | fail→pass | 11,398 | 1,524 | -87% | 1 | 1 | 0% | 1,117 | 1,342 | +20% | 0 | 0 | — |
case-10 | fail→pass | 17,269 | 8,501 | -51% | 1 | 1 | 0% | 2,230 | 1,750 | -22% | 0 | 0 | — |
case-11 | pass→pass | 12,061 | 6,638 | -45% | 1 | 1 | 0% | 1,399 | 1,909 | +36% | 0 | 0 | — |
case-12 | fail→pass | 20,299 | 14,764 | -27% | 1 | 1 | 0% | 2,853 | 3,114 | +9% | 0 | 0 | — |
case-13 | pass→pass | 12,881 | 3,466 | -73% | 1 | 1 | 0% | 1,494 | 1,727 | +16% | 0 | 0 | — |
case-14 | pass→pass | 16,064 | 9,245 | -42% | 1 | 1 | 0% | 1,912 | 1,840 | -4% | 0 | 0 | — |
case-15 | pass→pass | 9,474 | 6,646 | -30% | 1 | 1 | 0% | 755 | 1,346 | +78% | 0 | 0 | — |
case-16 | pass→pass | 6,777 | 8,633 | +27% | 1 | 1 | 0% | 1,143 | 1,802 | +58% | 0 | 0 | — |
case-17 | fail→pass | 11,209 | 2,301 | -79% | 1 | 1 | 0% | 1,167 | 1,462 | +25% | 0 | 0 | — |
case-18 | pass→pass | 4,605 | 1,376 | -70% | 1 | 1 | 0% | 818 | 1,291 | +58% | 0 | 0 | — |
case-19 | pass→pass | 13,134 | 2,651 | -80% | 1 | 1 | 0% | 1,479 | 1,557 | +5% | 0 | 0 | — |
case-20 | fail→fail | 11,812 | 15,680 | +33% | 1 | 1 | 0% | 2,432 | 3,295 | +35% | 0 | 0 | — |
case-21 | fail→fail | 9,326 | 13,904 | +49% | 1 | 1 | 0% | 1,942 | 2,944 | +52% | 0 | 0 | — |
case-22 | fail→fail | 14,063 | 6,546 | -53% | 1 | 1 | 0% | 1,729 | 2,513 | +45% | 0 | 0 | — |
case-23 | fail→pass | 13,028 | 1,464 | -89% | 1 | 1 | 0% | 1,295 | 1,254 | -3% | 0 | 0 | — |
case-24 | fail→pass | 10,630 | 1,953 | -82% | 1 | 1 | 0% | 1,128 | 1,403 | +24% | 0 | 0 | — |
case-25 | pass→pass | 9,234 | 7,107 | -23% | 1 | 1 | 0% | 775 | 1,422 | +83% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +48 percentage points is the difference between those two pass rates over the 25 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.