Execute Miro REST API v2 incident response with triage, mitigation, and postmortem.
Use when responding to Miro-related outages, investigating API errors,
or running post-incident reviews for Miro integration failures.
Trigger with phrases like "miro incident", "miro outage",
"miro down", "miro on-call", "miro emergency", "miro broken".
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Execute Miro REST API v2 incident response with triage, mitigation, and postmortem.
Use when responding to Miro-related outages, investigating API errors,
or running post-incident reviews for Miro integration failures.
Trigger with phrases like "miro incident", "miro outage",
"miro down", "miro on-call", "miro emergency", "miro broken".
allowed-tools
Read, Grep, Bash(curl:*), Bash(jq:*)
version
1.6.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
tags
["saas","miro","incident-response","runbook"]
compatibility
Designed for Claude Code
Miro Incident Runbook
Overview
Rapid incident response for Miro REST API v2 integration failures: triage, mitigation, recovery, and postmortem.
Miro API returning errors?
โโโ YES โ What status code?
โ โโโ 401/403 โ Token issue
โ โ โโโ Token expired? โ Refresh token (see below)
โ โ โโโ Scopes changed? โ Re-authorize via OAuth flow
โ โโโ 429 โ Rate limited
โ โ โโโ Check X-RateLimit-Remaining header
โ โ โโโ Honor Retry-After header
โ โ โโโ Reduce request rate or enable queue
โ โโโ 404 โ Board/item not found
โ โ โโโ Verify IDs haven't changed
โ โโโ 500/502/503 โ Miro platform issue
โ โโโ Check status.miro.com
โ โโโ Enable graceful degradation
โ โโโ Wait for Miro to resolve
โโโ NO โ Is our integration healthy?
โโโ YES โ Intermittent. Monitor for recurrence.
โโโ NO โ Our infrastructure issue
โโโ Check pods/containers
โโโ Check memory/CPU
โโโ Check network/DNS
Immediate Actions by Error Type
401 โ Token Expired
# Refresh access token
curl -s -X POST https://api.miro.com/v1/oauth/token \
-d "grant_type=refresh_token" \
-d "client_id=${MIRO_CLIENT_ID}" \
-d "client_secret=${MIRO_CLIENT_SECRET}" \
-d "refresh_token=${MIRO_REFRESH_TOKEN}" | jq
# If refresh token is also expired, user must re-authorize:# Redirect to: https://miro.com/oauth/authorize?response_type=code&client_id=${MIRO_CLIENT_ID}&redirect_uri=${REDIRECT_URI}
403 โ Insufficient Permissions
# Check what scopes the token has
curl -s -H "Authorization: Bearer ${MIRO_ACCESS_TOKEN}" \
"https://api.miro.com/v1/oauth-token" | jq '.scopes'# Compare with what the failed endpoint requires# boards:read for GET endpoints# boards:write for POST/PATCH/DELETE endpoints# team:read / organizations:read for team/org endpoints
429 โ Rate Limited
# Check current rate limit status
curl -sI -H "Authorization: Bearer ${MIRO_ACCESS_TOKEN}" \
"https://api.miro.com/v2/boards?limit=1" | grep -i ratelimit
# Response headers:# X-RateLimit-Limit: 100000 (credits per minute)# X-RateLimit-Remaining: 0# Retry-After: 30 (seconds)# Immediate mitigation: pause all non-critical API calls# Long-term: implement caching + webhooks (see miro-performance-tuning)
5xx โ Miro Platform Issue
# 1. Confirm it's Miro-side
curl -s "https://status.miro.com/api/v2/status.json" | jq '.status'# 2. Check for ongoing incidents
curl -s "https://status.miro.com/api/v2/incidents/unresolved.json" | \
jq '.incidents[] | {name, status, updated_at}'# 3. Enable graceful degradation in your app# Feature flag: MIRO_FALLBACK_ENABLED=true# Serve cached data, queue writes for retry when Miro recovers
Miro Integration โ Degraded Performance
We are experiencing issues with our Miro integration.
[Board sync / item creation / webhook processing] may be delayed.
Root cause: [Brief technical explanation]
Workaround: [If any โ e.g., "Changes will sync when service recovers"]
Last updated: [timestamp UTC]
Post-Incident Evidence Collection
# Collect evidence for postmortem
INCIDENT_DIR="miro-incident-$(date +%Y%m%d-%H%M%S)"mkdir -p "$INCIDENT_DIR"# API response during incident
curl -s -H "Authorization: Bearer ${MIRO_ACCESS_TOKEN}" \
"https://api.miro.com/v2/boards?limit=1" > "$INCIDENT_DIR/api-response.json"# Miro status page snapshot
curl -s "https://status.miro.com/api/v2/incidents/unresolved.json" > "$INCIDENT_DIR/miro-status.json"# Application metrics (adjust query for your Prometheus)
curl -s "http://prometheus:9090/api/v1/query_range?query=rate(miro_errors_total[5m])&start=$(date -d '2 hours ago' +%s)&end=$(date +%s)&step=60" > "$INCIDENT_DIR/error-metrics.json"# Package (exclude tokens)
tar -czf "$INCIDENT_DIR.tar.gz""$INCIDENT_DIR"echo"Evidence collected: $INCIDENT_DIR.tar.gz"
Postmortem Template
## Incident: Miro [Error Type]**Date:** YYYY-MM-DD
**Duration:** X hours Y minutes
**Severity:** P[1-4]
**Impact:** [Users affected, features impacted]
### Timeline (UTC)- HH:MM โ [First error detected by monitoring]
- HH:MM โ [On-call alerted]
- HH:MM โ [Root cause identified]
- HH:MM โ [Mitigation applied]
- HH:MM โ [Service restored]
### Root Cause
[Technical explanation โ e.g., "Access token expired and refresh logic
had a bug where it used the old refresh token instead of the new one
returned in the last refresh response."]
### What Went Well- [Monitoring detected the issue within 2 minutes]
- [Runbook was accurate and followed]
### What Went Wrong- [Token refresh logic untested in integration tests]
- [No alerting on 401 error rate]
### Action Items- [ ] Add integration test for token refresh flow โ @owner โ Due date
- [ ] Add P1 alert for miro_errors_total{error_type="auth"} > 0 โ @owner โ Due date
- [ ] Document token rotation procedure โ @owner โ Due date