Skill: shared-api-integration
APIs REST. Traé datos de afuera sin morir en el intento.
Trigger
- Necesitás datos de una API externa
- Hay que autenticarse (Bearer token, API key, OAuth)
- La API tiene rate limiting y tenés que manejarlo
- Querés integrar un servicio (Slack, GitHub, Notion) en un pipeline
Workflow LEND
1. ANALIZAR
├── Endpoint: ¿URL base? ¿documentación?
├── Auth: ¿API key, Bearer, OAuth, Basic?
├── Límites: ¿rate limit? ¿por minuto, por hora?
└── Datos: ¿JSON, XML, CSV? ¿paginación?
2. OFRECER (Menú del Senior)
├── A) requests — simple, síncrono, para scripts y pipelines
├── B) httpx — async, HTTP/2, cliente moderno
└── C) SDK oficial — si el servicio tiene SDK, usalo (pygithub, slack-sdk, etc.)
3. ELEGIR → confirmación
4. HACER
├── Cliente: session = requests.Session() (reusa conexión, headers)
├── Headers: {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}
├── Manejo de errores: response.raise_for_status() + try/except
├── Rate limiting: time.sleep(60/requests_per_minute) o tenacity para retry
├── Paginación: while next_page: fetch + append
├── Timeout: timeout=30 siempre. Nunca requests sin timeout.
└── .env para credenciales, nunca hardcodeadas
5. VERIFICAR
├── La respuesta tiene el formato esperado (validar contra schema)
├── El rate limiting se respeta
└── Los errores se manejan con mensajes claros
Patrones
- Session > requests.get(): reusa conexión TCP, headers, cookies
- Timeout siempre:
timeout=30 o la app cuelga para siempre
- Retry con backoff: tenacity o urllib3 Retry para errores transitorios (429, 503)
- .env para secrets: credenciales nunca en el código
- SDK > raw requests: si el servicio tiene SDK, usalo. Maneja auth, rate limits, etc.
Anti-patrones
- ❌ requests sin timeout — si la API no responde, tu app se cuelga para siempre
- ❌ Hardcodear tokens — .env o secrets manager, nunca en el código
- ❌ No manejar rate limit — 401 por exceder el límite y toda la integración rota
- ❌ Ignorar errores HTTP — response.ok sin verificar el status code
- ❌ Una conexión nueva por request — usá Session() para reusar conexiones
1---2name: shared-api-integration3description: Integrate REST APIs in Python using requests, httpx, or official SDKs, handling authentication, rate limiting, pagination, and errors.4license: MIT5---67# Skill: shared-api-integration89APIs REST. Traé datos de afuera sin morir en el intento.1011## Trigger1213- Necesitás datos de una API externa14- Hay que autenticarse (Bearer token, API key, OAuth)15- La API tiene rate limiting y tenés que manejarlo16- Querés integrar un servicio (Slack, GitHub, Notion) en un pipeline1718## Workflow LEND1920```211. ANALIZAR22 ├── Endpoint: ¿URL base? ¿documentación?23 ├── Auth: ¿API key, Bearer, OAuth, Basic?24 ├── Límites: ¿rate limit? ¿por minuto, por hora?25 └── Datos: ¿JSON, XML, CSV? ¿paginación?26272. OFRECER (Menú del Senior)28 ├── A) requests — simple, síncrono, para scripts y pipelines29 ├── B) httpx — async, HTTP/2, cliente moderno30 └── C) SDK oficial — si el servicio tiene SDK, usalo (pygithub, slack-sdk, etc.)31323. ELEGIR → confirmación33344. HACER35 ├── Cliente: session = requests.Session() (reusa conexión, headers)36 ├── Headers: {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}37 ├── Manejo de errores: response.raise_for_status() + try/except38 ├── Rate limiting: time.sleep(60/requests_per_minute) o tenacity para retry39 ├── Paginación: while next_page: fetch + append40 ├── Timeout: timeout=30 siempre. Nunca requests sin timeout.41 └── .env para credenciales, nunca hardcodeadas42435. VERIFICAR44 ├── La respuesta tiene el formato esperado (validar contra schema)45 ├── El rate limiting se respeta46 └── Los errores se manejan con mensajes claros47```4849## Patrones5051- **Session > requests.get()**: reusa conexión TCP, headers, cookies52- **Timeout siempre**: `timeout=30` o la app cuelga para siempre53- **Retry con backoff**: tenacity o urllib3 Retry para errores transitorios (429, 503)54- **.env para secrets**: credenciales nunca en el código55- **SDK > raw requests**: si el servicio tiene SDK, usalo. Maneja auth, rate limits, etc.5657## Anti-patrones5859- ❌ requests sin timeout — si la API no responde, tu app se cuelga para siempre60- ❌ Hardcodear tokens — .env o secrets manager, nunca en el código61- ❌ No manejar rate limit — 401 por exceder el límite y toda la integración rota62- ❌ Ignorar errores HTTP — response.ok sin verificar el status code63- ❌ Una conexión nueva por request — usá Session() para reusar conexiones