skills/api-onboarding/SKILL.md
Reduce time-to-first-API-call (TTFAC) by optimizing every step of the developer onboarding journey. This skill covers authentication simplification, sandbox environments, interactive documentation, and identifying and eliminating common failure points. Trigger phrases: "API onboarding", "time to first API call", "TTFAC", "developer onboarding", "first API call", "auth simplification", "sandbox environment", "interactive docs", "try it now", "API playground", "developer activation", "onboarding friction"
npx skillsauth add jonathimer/devmarketing-skills api-onboardingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The time between a developer discovering your API and successfully making their first call is the most critical window in your entire developer journey. Every minute of friction here costs you potential users.
Time-to-First-API-Call (TTFAC) is the single most predictive metric for developer adoption. Developers who succeed quickly become active users. Developers who struggle leave—often silently.
This skill covers:
Review the developer-audience-context skill to understand:
Your onboarding should meet developers where they are.
Time-to-First-API-Call measures the elapsed time from a developer's first interaction to their first successful API response. This includes:
| Rating | TTFAC | Developer Experience | |--------|-------|---------------------| | Excellent | < 5 min | "This is amazing" | | Good | 5-15 min | "Pretty straightforward" | | Acceptable | 15-30 min | "Got there eventually" | | Poor | 30-60 min | "This is frustrating" | | Failing | > 60 min | "I'll try something else" |
Instrumentation points:
// Track these events with timestamps
analytics.track('docs_quickstart_viewed');
analytics.track('signup_started');
analytics.track('signup_completed');
analytics.track('api_key_created');
analytics.track('sdk_installed'); // Via package manager data
analytics.track('first_api_call'); // Via API logs
analytics.track('first_successful_call');
Calculate:
Authentication is the #1 source of onboarding friction. Simplify ruthlessly.
The Approval Queue
❌ "Your API access request has been submitted.
You'll receive access within 2-3 business days."
Developers leave and find an alternative.
The Hidden Key
❌ Settings → Team → API → Credentials → Keys → Show Key
Make keys visible on dashboard home.
The Complex Token
❌ OAuth flow requiring:
- Client ID
- Client secret
- Redirect URI configuration
- Token exchange
- Token refresh handling
For getting started, provide simple API keys.
The Verification Gauntlet
❌ Sign up → Verify email → Verify phone →
Add payment → Verify payment → Then API key
Minimize friction for first API call.
Provide Test Keys Immediately
✅ "Here's your test API key: sk_test_abc123...
Use this in sandbox mode—no charges, no setup."
Support Multiple Auth Methods
✅ Quickstart: API key header
Production: OAuth when they need it
Pre-populate Examples
✅ # Your API key is pre-filled in these examples
curl -H "Authorization: Bearer sk_test_YOUR_KEY" ...
Delay Production Requirements
✅ Test mode: Instant access
Production mode: Add payment, verify identity (later)
A sandbox removes the fear of "breaking something" and lets developers experiment freely.
Instant Access: No approval, no payment, no complex setup
Realistic Behavior: Same API, same responses, same errors
Clear Boundaries: Obvious when in sandbox vs. production
Reset Capability: Easy way to start fresh
Generous Limits: Don't rate-limit experimentation
Separate Endpoints
Production: api.example.com
Sandbox: sandbox-api.example.com
Key Prefixes
Production key: sk_live_abc123...
Sandbox key: sk_test_xyz789...
Environment Parameter
curl -X POST https://api.example.com/v1/messages \
-H "Authorization: Bearer $API_KEY" \
-d '{"sandbox": true, ...}'
Pre-populated Test Data
// Sandbox comes with test users
const testUsers = await client.users.list();
// Returns: [
// { id: "usr_test_alice", name: "Alice (Test)" },
// { id: "usr_test_bob", name: "Bob (Test)" }
// ]
Magic Values
// Special values trigger specific behaviors
client.payments.create({
amount: 1000,
card: "4242424242424242" // Always succeeds
});
client.payments.create({
amount: 1000,
card: "4000000000000002" // Always declines
});
Documented Test Scenarios
## Test Card Numbers
| Number | Behavior |
|-----------------|----------------------|
| 4242424242424242 | Successful charge |
| 4000000000000002 | Declined |
| 4000000000009995 | Insufficient funds |
| 4000000000000069 | Expired card |
Let developers make API calls without leaving the browser.
Essential Features:
Implementation:
<div class="api-explorer">
<h3>Try it: Send a Message</h3>
<div class="request-editor">
<label>To Phone Number</label>
<input type="text" value="+15551234567" />
<label>Message Body</label>
<textarea>Hello from the API Explorer!</textarea>
<button onclick="sendRequest()">Send Request</button>
</div>
<div class="response-viewer">
<h4>Response</h4>
<pre><code id="response"></code></pre>
</div>
</div>
OpenAPI-Based:
Custom Platforms:
Go beyond single requests:
## Interactive Tutorial: Send Your First Message
### Step 1: Check your balance
<api-explorer endpoint="GET /account/balance" />
### Step 2: Send a message
<api-explorer endpoint="POST /messages"
body='{"to": "+15551234567", "body": "Hello!"}' />
### Step 3: Check message status
<api-explorer endpoint="GET /messages/{id}"
params='{"id": "{{previous.id}}"}' />
Track where developers fail and why:
// Instrument error events
api.on('request_error', (error, request) => {
analytics.track('api_error', {
error_type: error.type,
error_code: error.code,
endpoint: request.endpoint,
time_since_signup: timeSinceSignup(),
is_first_call: isFirstCall()
});
});
1. Authentication Errors (40% of first-call failures)
Problem: Wrong key, malformed header, missing auth
Fix:
- Clearer error messages: "API key should start with 'sk_test_'"
- Pre-filled code examples with actual key
- Auth header format shown with example
2. Request Format Errors (25%)
Problem: Wrong content type, malformed JSON, missing fields
Fix:
- Accept flexible content types on simple endpoints
- Return specific field-level errors
- Show exactly what was expected vs. received
3. Environment/Setup Errors (20%)
Problem: SDK not installed, wrong SDK version, missing dependencies
Fix:
- Version-specific installation instructions
- Compatibility matrix clearly visible
- Quick environment check script
4. Rate Limiting (10%)
Problem: Aggressive rate limits during exploration
Fix:
- Generous sandbox limits (or none)
- Clear rate limit errors with retry-after
- Don't count failed requests against limits
5. Networking Errors (5%)
Problem: Firewall, proxy, SSL issues
Fix:
- Connectivity test endpoint
- Clear networking troubleshooting guide
- Alternative ports/protocols if possible
Design error messages that recover the onboarding:
{
"error": {
"type": "authentication_error",
"message": "Invalid API key provided",
"code": "invalid_api_key",
"recovery": {
"steps": [
"Check that your API key starts with 'sk_test_' or 'sk_live_'",
"Ensure there are no extra spaces or newlines",
"Generate a new key at https://dashboard.example.com/keys"
],
"docs": "https://docs.example.com/authentication",
"support": "https://support.example.com/auth-issues"
}
}
}
Perform this audit quarterly (or after any onboarding changes):
As a New Developer:
Questions to Answer:
| Friction | Impact | Priority | |----------|--------|----------| | Must verify email before API key | High | Fix immediately | | API key buried in settings | High | Fix immediately | | No copy button on code examples | Medium | Fix this quarter | | Quickstart assumes specific OS | Medium | Fix this quarter | | Example uses outdated SDK version | Low | Fix when updating docs |
development
When the user wants to create developer YouTube content, technical screencasts, or video tutorials. Trigger phrases include "YouTube," "developer video," "screencast," "video tutorial," "live coding," "YouTube for developers," "tech YouTube," or "YouTube thumbnails."
development
When the user wants to build a developer following on Twitter/X, write technical threads, or understand what works for dev audiences on X. Trigger phrases include "Twitter," "X," "developer Twitter," "tech Twitter," "technical threads," "building dev following," or "Twitter for developers."
development
Design pricing models that developers understand, accept, and can predict. Trigger phrases: usage-based pricing, API pricing, metered billing, developer pricing, pricing page, cost calculator, pay as you go, pricing transparency, competitive pricing, developer billing
development
When the user wants to create step-by-step technical tutorials, quickstarts, or code walkthroughs. Trigger phrases include "tutorial," "quickstart," "getting started guide," "walkthrough," "step by step," "how to guide," "hands-on guide," or "code tutorial."