1. Configuración y Autenticación
Base URL: https://protocols.io/api/v3
python
novabio_client.py — Clase base
# NovaBio Labs — Cliente protocols.io
# Generado por CULTIVA IA para NovaBio Labs
import requests
import os
import time
import logging
from typing import Optional, Dict, Any
class ProtocolsIOClient:
"""Cliente modular para la API v3 de protocols.io."""
BASE_URL = "https://protocols.io/api/v3"
WORKSPACE_ID = 78432 # NovaBio Labs workspace
def __init__(self):
self.token = os.getenv("PROTOCOLS_IO_TOKEN")
if not self.token:
raise ValueError("PROTOCOLS_IO_TOKEN no configurado")
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {self.token}",
"Content-Type": "application/json"
})
def _request(self, method: str, path: str,
**kwargs) -> Dict[str, Any]:
"""Request con reintentos y rate-limit handling."""
url = f"{self.BASE_URL}{path}"
for attempt in range(3):
resp = self.session.request(method, url, **kwargs)
if resp.status_code == 429:
retry = int(resp.headers.get('Retry-After', 60))
time.sleep(retry)
continue
resp.raise_for_status()
return resp.json()
raise Exception("Max retries excedido")
Configuración segura: El token se lee desde variable de entorno
PROTOCOLS_IO_TOKEN. Nunca hardcodear en el código. Usar .env + python-dotenv en desarrollo.
🔒 Rate Limits por endpoint
Endpoints estándar
100 req/min
Generación PDF (autenticado)
5 req/min
Generación PDF (anónimo)
3 req/min
📝 Formatos de contenido disponibles
json
Draft.js JSON (por defecto)
html
HTML renderizable
markdown
Markdown plano
Usar como query param:
?content_format=html
Para NovaBio: Implementar caché local de protocolos frecuentes para reducir llamadas API. Protocolos CRISPR de referencia rara vez cambian.
2. Endpoints Principales — Referencia Rápida
REST
Base URL: https://protocols.io/api/v3
| Método | Endpoint | Descripción | Módulo |
|---|---|---|---|
| GET | /protocols | Buscar protocolos públicos/privados con filtros | Protocolos |
| GET | /protocols/{id} | Obtener protocolo completo con pasos y materiales | Protocolos |
| POST | /protocols | Crear nuevo protocolo con título, descripción y tags | Protocolos |
| POST | /protocols/{id}/steps | Añadir paso al protocolo (título, descripción, componentes) | Protocolos |
| POST | /protocols/{id}/publish | Publicar protocolo y obtener DOI | Protocolos |
| GET | /workspaces | Listar workspaces del usuario | Workspaces |
| GET | /workspaces/{id}/protocols | Listar todos los protocolos del workspace | Workspaces |
| POST | /workspaces/{id}/files/upload | Subir archivo (CSV, imagen, PDF) al workspace | Archivos |
| GET | /protocols/{id}/comments | Ver discusiones y comentarios del protocolo | Discusiones |
| POST | /protocols/{id}/runs | Registrar ejecución del protocolo en laboratorio | Experimentos |
3. Workflows para NovaBio Labs
🧬 Crear y Publicar Protocolo CRISPR
1
Crear protocolo base
POST /protocols con título, descripción y tags del experimento
POST /protocols → protocol_id: 94521
2
Añadir pasos del procedimiento
Preparación guía ARN, electroporación, cultivo y análisis
POST /protocols/94521/steps × 7 pasos
3
Documentar materiales y reactivos
Cas9, sgRNA, medio de cultivo, concentraciones exactas
PUT /protocols/94521 + components[]
4
Publicar con DOI
Emisión de DOI para cita en publicaciones científicas
POST /protocols/94521/publish → doi: 10.17504/protocols.io.xyz
💾 Backup Mensual del Workspace
1
Listar todos los protocolos
Paginar sobre GET /workspaces/78432/protocols hasta obtenerlos todos
GET /workspaces/78432/protocols?page_size=50
2
Exportar contenido completo
Para cada protocolo, descargar contenido en markdown y PDF
GET /protocols/{id}?content_format=markdown
3
Descargar archivos adjuntos
Imágenes de gel, CSVs de resultados, documentos suplementarios
GET /workspaces/78432/files → download each
4
Comprimir y archivar
Guardar en S3/local con timestamp. Ejecutar vía cron mensual.
novabio_backup_2026-06.tar.gz
4. Implementación Python — NovaBio Labs
python
Búsqueda de protocolos CRISPR en el workspace
def buscar_protocolos_crispr(self, keywords: str = "CRISPR") -> list:
"""Busca protocolos del workspace NovaBio por palabra clave."""
result = self._request("GET", "/protocols", params={
"filter": "workspace",
"workspace_id": self.WORKSPACE_ID,
"key": keywords,
"order_field": "date",
"order_dir": "desc",
"page_size": 20,
"content_format": "html"
})
protocolos = result.get("items", [])
for p in protocolos:
logging.info(f" [{p['id']}] {p['title']} — DOI: {p.get('doi', 'sin DOI')}")
return protocolos
# Ejemplo de resultado para NovaBio Labs:
# [94521] CRISPR-Cas9 T-Cell Editing v2.1 — DOI: 10.17504/protocols.io.nb001
# [91234] Lipofección sgRNA HEK293 — DOI: 10.17504/protocols.io.nb002
# [88901] Base Editing ABE8e Neurona — sin DOI (borrador)
python
Crear protocolo CRISPR con pasos y publicar
def crear_protocolo_crispr(self, titulo: str, pasos: list) -> dict:
"""Crea un protocolo CRISPR, añade pasos y lo publica."""
# 1. Crear el protocolo base
data = {
"title": titulo,
"description": "Protocolo de edición génica para laboratorio NovaBio Labs",
"tags": ["CRISPR", "gene-editing", "NovaBio", "molecular-biology"],
"workspace_id": self.WORKSPACE_ID
}
resp = self._request("POST", "/protocols", json=data)
protocol_id = resp["item"]["id"]
logging.info(f"Protocolo creado: #{protocol_id}")
# 2. Añadir pasos del procedimiento
for i, paso in enumerate(pasos, 1):
step_data = {
"title": paso["titulo"],
"description": paso["descripcion"],
"duration": paso.get("duracion_min", 0),
"components": paso.get("materiales", [])
}
self._request("POST",
f"/protocols/{protocol_id}/steps", json=step_data)
logging.info(f" Paso {i}/{len(pasos)}: {paso['titulo']}")
# 3. Publicar y obtener DOI
pub = self._request("POST", f"/protocols/{protocol_id}/publish")
doi = pub["item"].get("doi", "pendiente")
logging.info(f"Publicado. DOI: {doi}")
return {"id": protocol_id, "doi": doi}
# Uso con datos reales de NovaBio Labs:
client = ProtocolsIOClient()
resultado = client.crear_protocolo_crispr(
titulo="Protocolo Electroporación CAR-T NovaBio v3.0",
pasos=[
{"titulo": "Preparación células T", "duracion_min": 60,
"materiales": [{"name": "Células T CD8+", "amount": "5x10^6"}]},
{"titulo": "Transfección sgRNA-Cas9", "duracion_min": 30,
"materiales": [{"name": "Cas9 RNP", "amount": "10 µg"}]},
{"titulo": "Cultivo post-edición 72h", "duracion_min": 4320},
{"titulo": "Análisis por citometría de flujo", "duracion_min": 90}
]
)
python
Subir resultados experimentales al workspace
def subir_resultados_experimento(self,
ruta_archivo: str,
experimento_id: str) -> str:
"""Sube CSV/imagen de resultados al workspace NovaBio."""
headers_upload = {"Authorization": f"Bearer {self.token}"}
with open(ruta_archivo, "rb") as f:
resp = requests.post(
f"{self.BASE_URL}/workspaces/{self.WORKSPACE_ID}/files/upload",
headers=headers_upload,
files={"file": (f.name, f, "text/csv")},
data={
"folder_id": "experimentos-2026",
"description": f"Resultados experimento {experimento_id}",
"tags": f"experimento,{experimento_id},NovaBio,2026"
}
)
file_id = resp.json()["item"]["id"]
logging.info(f"Archivo subido: {file_id} — {ruta_archivo}")
return file_id
# Registrar la ejecución del experimento vinculada al archivo
def registrar_experimento(self, protocol_id: int,
file_id: str, notas: str) -> dict:
"""Crea registro de ejecución del protocolo."""
data = {
"title": f"Ejecución {time.strftime('%Y-%m-%d')}",
"notes": notas,
"attached_files": [file_id]
}
return self._request("POST",
f"/protocols/{protocol_id}/runs", json=data)
5. Módulos de la Integración
Autenticación
- Bearer token desde variable de entorno
- OAuth flow para multi-usuario
- Refresh automático de tokens
- Rate limit con exponential backoff
Gestión de Protocolos
- Búsqueda por keyword, DOI, filtros
- CRUD completo + ordenación de pasos
- Materiales y reactivos en pasos
- Publicación con emisión de DOI
- Generación de PDF para referencia
Discusiones
- Comentarios a nivel protocolo
- Comentarios a nivel paso
- Respuestas en hilo
- Análisis de feedback del equipo
Workspaces
- Gestión de workspace NovaBio #78432
- Listado de miembros y roles
- Protocolos privados del equipo
- Control de permisos granular
Gestión de Archivos
- Upload CSVs de resultados
- Imágenes de gel de electroforesis
- Jerarquía de carpetas por experimento
- Búsqueda y descarga en bulk
Experimentos
- Registro de ejecuciones (runs)
- Vinculación de archivos resultado
- Tracking de modificaciones
- Análisis de reproducibilidad
6. Protocolos Actuales — Workspace NovaBio Labs
Simulación de respuesta GET /workspaces/78432/protocols
🧬
CRISPR-Cas9 T-Cell Gene Editing — CAR-T Terapia v2.1
CRISPRCAR-Tgene-editingT-cells
Publicado
42 vistas · 3 citas
⚗️
Lipofección sgRNA en Células HEK293 — Protocolo Estándar
lipofecciónHEK293transfección
Publicado
28 vistas · 1 cita
🔬
Base Editing ABE8e en Neuronas Primarias — Borrador Interno
base-editingABE8eneuronasprivado
Borrador
Solo workspace
7. Mejores Prácticas para NovaBio Labs
Seguridad del token: Almacenar
PROTOCOLS_IO_TOKEN en el gestor de secretos del servidor (Vault, AWS Secrets Manager o simplemente .env fuera del repo). Rotar cada 90 días.
Rate limiting: El cliente ya implementa backoff exponencial en HTTP 429. Para el backup mensual, añadir
time.sleep(0.5) entre llamadas para no alcanzar el límite de 100 req/min.
Nomenclatura de tags: Usar siempre
NovaBio + año como tags para facilitar filtrado futuro en búsquedas: ["CRISPR", "NovaBio", "2026", "CAR-T"]
Publicación irreversible: Una vez publicado un protocolo con DOI, no se puede despublicar. Revisar todos los pasos antes de llamar a
POST /protocols/{id}/publish. Crear siempre como borrador primero.
Backup automático: Configurar cron mensual para ejecutar el script de backup. Los protocolos con DOI son permanentes en la plataforma, pero los borradores y archivos adjuntos pueden eliminarse accidentalmente.
PDF rate limit bajo: Solo 5 PDFs/minuto con token autenticado. Para backup en bulk, generar PDFs de forma asíncrona con delay de 15 segundos entre cada llamada.