Programar jobs
Un job ejecuta una tarea asociada a un artifact — con una programación, o cuando algo pasa. Mandá un reporte semanal por email, posteá un snapshot a Slack, refrescá un dataset.
Dos triggers
Sección titulada «Dos triggers»| Trigger | Se dispara |
|---|---|
cron | Según una programación de tiempo (campo schedule) |
event | En artifact.updated, artifact.viewed, comment.added o email.received |
Acciones
Sección titulada «Acciones»| Acción | Hace |
|---|---|
email | Envía a los destinatarios (HTML inline o un template) |
slack | Postea un mensaje, snapshot o PDF a un canal o DM |
discord | Postea a un webhook de Discord |
telegram | Mensaje, snapshot o PDF a un chat de Telegram vinculado |
webhook | Request HTTP a tu URL |
http_get | GET simple |
materialize | Vuelve a correr una query de conexión y guarda el resultado |
enrich_snapshot | Extract de BigQuery + enriquecimiento REST por fila → snapshot JSON (pipelines Teams) |
query_snapshot | Corre queries fijas de warehouse/REST en schedule y escribe cada resultado en json/tabla/dataset |
sheets_append | Corre una query de conexión y agrega filas a una Google Sheet (historial diario creciente) |
Crear un job
Sección titulada «Crear un job»curl -X POST https://shareout.site/v1/jobs \ -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \ -d '{ "artifact_id": "art_abc123", "title": "Email semanal de revenue", "description": "Manda al equipo el resumen de revenue cada lunes 9am UTC.", "action": "email", "trigger_type": "cron", "schedule": "0 9 * * 1", "config": { "recipients": ["team@company.com"], "subject": "Weekly report", "includeArtifactLink": true } }'Siempre definí title y description al crear un schedule — aparecen en Mis
schedules y en Admin → Schedules del workspace. PATCH /v1/jobs/{id} también
acepta title / description (mandá null para borrar).
Formato cron
Sección titulada «Formato cron»┌─ minute (0-59)│ ┌─ hour (0-23)│ │ ┌─ day of month (1-31)│ │ │ ┌─ month (1-12)│ │ │ │ ┌─ day of week (0-6, Sun=0)* * * * *0 9 * * 1 → lunes 9am · */15 * * * * → cada 15 min · 0 9-17 * * 1-5 →
cada hora, horario laboral.
query_snapshot — refresh determinístico de datos
Sección titulada «query_snapshot — refresh determinístico de datos»Corre una lista configurada de queries contra una conexión del workspace — REST o
conectores warehouse inline (Snowflake, BigQuery). Los jobs query_snapshot
programados refrescan sin intervención; no hace falta un paso externo de pre-fetch
para conexiones warehouse genéricas.
{ "artifact_id": "art_dashboard", "action": "query_snapshot", "trigger_type": "cron", "schedule": "0 6 * * *", "config": { "connection": "team_bigquery", "params": { "projectId": "my-gcp-project" }, "queries": [ { "query": "SELECT region, SUM(revenue) AS revenue FROM analytics.daily GROUP BY 1", "target": { "type": "json", "name": "snapshot", "path": "byRegion" } } ] }}sheets_append — warehouse → Google Sheet
Sección titulada «sheets_append — warehouse → Google Sheet»Corre una query de conexión y agrega las filas resultantes a una Google Sheet conectada — un nuevo bloque de filas en cada ejecución, para mantener un historial diario creciente en una hoja de cálculo.
{ "artifact_id": "art_abc123", "title": "Revenue diario a la sheet", "description": "Agrega las filas de ayer del warehouse a la Google Sheet compartida.", "action": "sheets_append", "trigger_type": "cron", "schedule": "0 12 * * *", "config": { "connection": "bigquery", "params": { "projectId": "my-gcp-project" }, "query": "SELECT FORMAT_DATE('%Y-%m-%d', date) AS date, site, revenue FROM `my-gcp-project.analytics.daily` WHERE date = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)", "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1AbCdEf.../edit", "range": "Daily", "columns": ["date", "site", "revenue"] }}Requisitos:
- El dueño del artifact debe tener Google Sheets conectado — sin token → el job falla con “Google Sheets not connected”.
- El dueño necesita acceso de edición a la hoja; la pestaña en
rangedebe existir. - Las filas se agregan sin encabezado — configurá la fila de encabezado una vez.
Usá
columnspara fijar el orden de celdas.
enrich_snapshot — refresh nocturno estilo TS-ML
Sección titulada «enrich_snapshot — refresh nocturno estilo TS-ML»Pipeline desatendido para scorecards: query BigQuery vía conexión platform, enriquece cada fila con una conexión REST genérica y escribe JSON chunked en el artifact. Requiere conectores Teams para BigQuery y la API de enriquecimiento.
Evento email.received
Sección titulada «Evento email.received»Combiná con cualquier acción para reaccionar cuando llega mail al inbox del artifact:
{ "artifact_id": "art_inbox", "action": "slack", "trigger_type": "event", "event_type": "email.received", "config": { "connection": "team_slack", "channelId": "C0123456789" }}Reintentos
Sección titulada «Reintentos»Agregá retry_config para downstreams inestables:
{ "maxAttempts": 3, "backoffType": "exponential", "initialDelay": 60 }fixed · linear (delay × (attempt+1)) · exponential (delay × 2^attempt).
Ejecutar, pausar, inspeccionar
Sección titulada «Ejecutar, pausar, inspeccionar»| Acción | Endpoint |
|---|---|
| Ejecutar ahora | POST /v1/jobs/{id}/run |
| Pausar | PATCH /v1/jobs/{id} → { "enabled": false } |
| Logs recientes | GET /v1/jobs/{id}/logs |
Los admins del workspace también pueden usar el Run Inspector — vista unificada de jobs programados, automatizaciones crew y disparos de alertas de métricas:
GET /v1/workspaces/{id}/runs?surface=job&status=failedGET /v1/workspaces/{id}/runs/{surface}/{runId}Cada run devuelve un RunDetail normalizado con estado, trigger, ledger de pasos
(fases fetch / transform / deliver), resultado de entrega y costo/tokens cuando
aplica. Ver Admin del workspace → Run Inspector.
Mirá el schema completo en la referencia de la API.
Combiná query_snapshot con un Crew en un cron posterior para
narrar y entregar — el patrón refrescar → narrar → entregar.