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".
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
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