Skip to content

← Back to External API Connector Guide

SKILL.md

v1.0.0 · 2385 B · text/markdown

---
name: external-api-connector-guide
description: Use when a task needs to talk to an external SaaS API (Slack, GitHub, email, calendars, etc.) - a checklist for choosing auth strategy, scoping permissions, and handling failures safely
---

# External API Connector Guide

Wiring an agent up to a third-party API has predictable failure modes that
are easy to skip under time pressure. This skill is a checklist to run
before writing the integration code.

## Before writing any request code

1. **Check for an existing, official SDK/client library first** — hand-
   rolled HTTP calls against a REST API tend to drift from the real
   contract (pagination, rate limits, error shapes) that a maintained SDK
   already handles correctly.
2. **Scope credentials to the minimum permission the task needs.** A
   read-only task should never hold a write-capable token; a single-channel
   Slack integration shouldn't request workspace-wide access.
3. **Never hardcode credentials or embed them in generated code** — read
   from environment variables or a secrets manager, and confirm the
   .gitignore actually excludes wherever they might land locally.

## Handling the request lifecycle

- **Rate limits are not exceptional cases** — assume they'll be hit and
  handle 429s with backoff, not just a try/catch that surfaces an error to
  the user.
- **Distinguish retryable failures (timeouts, 5xx, rate limits) from
  permanent ones (4xx auth/validation errors)** — retrying a permanent
  failure just wastes calls and can trigger stricter rate limiting.
- **Treat every external response as untrusted input** — validate shape
  before using it, don't assume a documented schema is what actually comes
  back.

## OAuth-specific

- Store refresh tokens securely, never in plaintext logs.
- Handle token expiry proactively (refresh before a call fails) rather than
  reactively (catch the 401, then refresh, then retry) when the SDK
  supports it — the reactive path still works but costs an extra round
  trip on every expiry.

## When integrating multiple services

Keep each connector's auth/error-handling logic isolated per service rather
than one shared abstraction that has to accommodate every provider's
quirks — a shared interface for "call the external thing" is fine; a shared
implementation of auth/retry logic across genuinely different APIs usually
isn't.