Introducción
Todas las solicitudes van a la URL base de abajo por HTTPS. Las respuestas son JSON (UTF-8), salvo que pidas format=csv o format=ndjson.
https://onemetrics.co/api/v1- Las fechas usan el formato
YYYY-MM-DDy son días de calendario inclusivos en la zona horaria de cada fuente. - Las marcas de tiempo usan ISO 8601 en UTC.
- Los importes monetarios vienen en unidades mayores (por ejemplo
12.5= 12,50 USD). - Los ID de fuentes, clientes y consultas guardadas son UUID de OneMetrics, no los ID de la plataforma.
Autenticación
Envía un token en la cabecera Authorization de cada solicitud:
Authorization: Bearer mk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Clave de API (
mk_live_…): créala en Claves de API. Pertenece a un espacio de trabajo y puede limitarse a algunos clientes. Ideal para scripts, ETL y BigQuery. - Token de acceso OAuth (
mko_…): lo emite nuestro servidor OAuth 2.0 a integraciones como Looker Studio, Google Sheets o Power BI. Dura 1 hora.
Los tokens tienen alcances (scopes): read permite listar conectores, fuentes, clientes y consultas guardadas; query permite ejecutar consultas. Las claves nuevas incluyen ambos.
Guarda tus claves en secreto
Cabecera de destino
Opcional. Indica desde qué herramienta llega la solicitud para que veas el uso por destino en la app. Valor por defecto: api.
X-OneMetrics-Destination: api | looker_studio | google_sheets | power_bi | excel | bigqueryErrores
Los errores devuelven el código HTTP correspondiente y un sobre JSON con un code estable que puedes usar en tu lógica. message está pensado para personas y puede cambiar.
{
"error": {
"code": "INVALID_REQUEST",
"message": "Unknown field: foo",
"details": {}
}
}Límites de velocidad y uso
Por defecto se admiten 120 solicitudes por minuto por token. Si lo superas recibirás 429 RATE_LIMITED con la cabecera Retry-After. Los feeds secretos admiten 30 solicitudes por minuto por consulta.
Cada respuesta de consulta incluye cabeceras con el uso del mes. Si falta la cabecera -Limit, ese recurso es ilimitado en tu plan.
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
X-Usage-Queries: 1824
X-Usage-Queries-Limit: 100000
X-Usage-Rows: 245120
X-Usage-Rows-Limit: 20000000Endpoints
Todas las rutas son relativas a la URL base. Las rutas que lo requieren aceptan la cabecera Authorization.
Token actual
/meDevuelve el usuario, el espacio de trabajo, el plan con sus límites y el uso del mes para el token. Útil para probar credenciales.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/me" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
{
"user": { "id": "8c1d…", "email": "ana@agency.com", "fullName": "Ana Gómez", "locale": "es" },
"workspace": { "id": "4f9c…", "name": "Acme Agency", "slug": "acme", "timezone": "America/Bogota", "currency": "COP" },
"auth": { "kind": "api_key", "scopes": ["query", "read"], "clientRestricted": false },
"plan": { "code": "pro", "kind": "connectors", "status": "active", "limits": { "max_queries_month": 100000, "…": "…" } },
"usage": { "queries": 1824, "rows": 245120 }
}Listar conectores
/connectorsConectores activos en el espacio de trabajo con sus opciones (por ejemplo, ventanas de atribución) y el número de campos.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/connectors" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
[
{
"id": "meta_ads",
"name": "Meta Ads",
"description": "Facebook & Instagram ads performance",
"category": "ads",
"icon": "/connectors/meta_ads.svg",
"options": [{ "id": "attribution_windows", "type": "multiselect", "…": "…" }],
"fieldCount": 182
}
]Campos de un conector
/connectors/{id}/fieldsLista de campos públicos (PublicField) del conector, incluidas las dimensiones de plataforma.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/connectors/meta_ads/fields?locale=es&destination=looker_studio" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
{
"fields": [
{ "id": "spend", "kind": "metric", "dataType": "currency", "label": "Importe gastado", "group": "Rendimiento",
"aggregation": "sum", "isDefault": true,
"looker": { "dataType": "NUMBER", "semanticType": "CURRENCY_USD" } },
{ "id": "ctr", "kind": "metric", "dataType": "percent", "label": "CTR", "group": "Rendimiento",
"aggregation": "ratio", "isDefault": false,
"derived": { "numerator": "clicks", "denominator": "impressions" } }
]
}Listar clientes
/clientsClientes del espacio de trabajo visibles para el token.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/clients" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
[
{ "id": "0b7e…", "name": "Tienda Andina", "color": "#1a73e8" }
]Listar fuentes de datos
/sourcesCuentas publicitarias, tiendas y demás fuentes conectadas, con su moneda, zona horaria, cliente y estado de la conexión.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/sources?connector=meta_ads" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
[
{
"id": "4f9c…",
"connector": "meta_ads",
"name": "Tienda Andina – Ads",
"externalId": "act_123456789",
"currency": "COP",
"timezone": "America/Bogota",
"client": { "id": "0b7e…", "name": "Tienda Andina" },
"connection": { "id": "a1d2…", "name": "Meta – ana@agency.com", "status": "active" },
"lastSyncedAt": "2026-10-26T13:00:00Z"
}
]Ejecutar una consulta
/queryEjecuta un QueryRequest y devuelve un QueryResult. Es el endpoint principal de la API.
limit y offset: meta.totalRows indica el total de filas antes de paginar.Ejemplo de solicitud
curl -X POST "https://onemetrics.co/api/v1/query?format=json" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"connector": "meta_ads",
"fields": ["date", "campaign_name", "spend", "impressions", "ctr", "actions_purchase"],
"dateRange": { "preset": "last_30_days" },
"filters": [{ "field": "campaign_name", "op": "contains", "value": "Black Friday" }],
"sort": [{ "field": "spend", "direction": "desc" }],
"limit": 1000,
"currency": "USD"
}'Ejemplo de respuesta
{
"columns": [
{ "id": "date", "label": "Date", "kind": "dimension", "dataType": "date" },
{ "id": "campaign_name", "label": "Campaign name", "kind": "dimension", "dataType": "string" },
{ "id": "spend", "label": "Amount spent", "kind": "metric", "dataType": "currency" },
{ "id": "ctr", "label": "CTR", "kind": "metric", "dataType": "percent" }
],
"rows": [
{ "date": "2026-10-01", "campaign_name": "Black Friday – Prospecting", "spend": 412.5, "ctr": 0.0183 }
],
"totals": { "spend": 12840.32 },
"meta": {
"connector": "meta_ads",
"range": { "start": "2026-09-26", "end": "2026-10-25" },
"rowCount": 30,
"totalRows": 30,
"servedFrom": "stored",
"currency": "USD",
"durationMs": 120,
"dataFreshness": "2026-10-26T13:00:00Z",
"warnings": []
}
}Ejecutar una consulta (GET)
/queryIgual que POST /query, con los parámetros en la URL. Útil para herramientas que solo hacen GET.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/query?connector=meta_ads&fields=date,campaign_name,spend&preset=last_7_days&sort=-spend&format=csv" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
date,campaign_name,spend
2026-10-25,Black Friday – Prospecting,412.5
2026-10-25,Retargeting – Cart,188.1Listar consultas guardadas
/saved-queriesConsultas guardadas del espacio de trabajo. Cada elemento incluye connector y la request completa para que puedas abrirla o modificarla.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/saved-queries" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
[
{
"id": "6a3b…",
"name": "Meta Ads · Rendimiento mensual",
"connector": "meta_ads",
"clientId": null,
"request": { "connector": "meta_ads", "fields": ["date", "spend"], "dateRange": { "preset": "last_month" } },
"lastRunAt": "2026-10-26T08:00:00Z",
"updatedAt": "2026-10-20T15:12:00Z"
}
]Ejecutar una consulta guardada
/saved-queries/{id}/runEjecuta una consulta guardada. Puedes reemplazar su rango de fechas con preset o con start y end.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/saved-queries/6a3b…/run?format=json&preset=last_month" \
-H "Authorization: Bearer $ONEMETRICS_API_KEY"Ejemplo de respuesta
{
"columns": [
{ "id": "date", "label": "Date", "kind": "dimension", "dataType": "date" },
{ "id": "campaign_name", "label": "Campaign name", "kind": "dimension", "dataType": "string" },
{ "id": "spend", "label": "Amount spent", "kind": "metric", "dataType": "currency" },
{ "id": "ctr", "label": "CTR", "kind": "metric", "dataType": "percent" }
],
"rows": [
{ "date": "2026-10-01", "campaign_name": "Black Friday – Prospecting", "spend": 412.5, "ctr": 0.0183 }
],
"totals": { "spend": 12840.32 },
"meta": {
"connector": "meta_ads",
"range": { "start": "2026-09-26", "end": "2026-10-25" },
"rowCount": 30,
"totalRows": 30,
"servedFrom": "stored",
"currency": "USD",
"durationMs": 120,
"dataFreshness": "2026-10-26T13:00:00Z",
"warnings": []
}
}Feed secreto
/feeds/{token}.{csv|json}Sin autenticaciónURL secreta de una consulta guardada en CSV o JSON, sin cabecera Authorization: el token de la URL es la credencial. Pensada para Excel, Power BI y la función IMPORTDATA de Google Sheets.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/feeds/Xk3…9pQ.csv?preset=last_30_days"Ejemplo de respuesta
date,campaign_name,spend,impressions
2026-10-25,Black Friday – Prospecting,412.5,38120Documento OpenAPI
/openapi.jsonSin autenticaciónEspecificación OpenAPI 3.1 de la API, pública. Impórtala en Postman, Insomnia o tu generador de clientes.
Ejemplo de solicitud
curl "https://onemetrics.co/api/v1/openapi.json"Ejemplo de respuesta
{ "openapi": "3.1.0", "info": { "title": "OneMetrics API", "version": "1" }, "paths": { "…": "…" } }QueryRequest
Describe qué datos quieres. Es el mismo contrato para la API, Looker Studio, Sheets, Power BI, Excel y las exportaciones a BigQuery.
{
"connector": "meta_ads",
"sources": ["4f9c…"],
"fields": ["date", "campaign_name", "spend", "impressions", "ctr", "actions_purchase"],
"dateRange": { "preset": "last_30_days" },
"filters": [{ "field": "campaign_name", "op": "contains", "value": "Black Friday" }],
"sort": [{ "field": "spend", "direction": "desc" }],
"limit": 1000,
"currency": "USD",
"options": { "attribution_windows": ["7d_click", "1d_view"] }
}Periodos predefinidos
Úsalos en dateRange.preset o en el parámetro preset. Se calculan en la zona horaria de cada fuente; las semanas empiezan el lunes.
todayHoyyesterdayAyerlast_7_daysÚltimos 7 díaslast_14_daysÚltimos 14 díaslast_28_daysÚltimos 28 díaslast_30_daysÚltimos 30 díaslast_90_daysÚltimos 90 díaslast_365_daysÚltimos 365 díasthis_weekEsta semanalast_weekSemana pasadathis_monthEste meslast_monthMes pasadothis_quarterEste trimestrelast_quarterTrimestre pasadothis_yearEste añolast_yearAño pasadomonth_to_dateMes en cursoyear_to_dateAño en cursomaximumMáximo disponible
Filtros
Cada filtro es { field, op, value }. Todos los filtros se combinan con Y. in y not_in reciben un arreglo; is_null e is_not_null no llevan valor.
[
{ "field": "campaign_name", "op": "contains", "value": "Black Friday" },
{ "field": "spend", "op": "gte", "value": 100 },
{ "field": "data_source_id", "op": "in", "value": ["4f9c…", "7d21…"] },
{ "field": "adset_name", "op": "is_not_null" }
]QueryResult
columns describe cada columna en el orden de fields; rows trae un objeto por fila; totals aparece si pediste totals: true.
meta.servedFrom:stored(datos sincronizados),live(consulta en vivo),cacheomixed.meta.dataFreshness: cuándo se actualizaron por última vez los datos guardados.meta.totalRows: filas antes de aplicaroffsetylimit.meta.warnings: avisos no bloqueantes, por ejemplo métricas que no se pudieron combinar.
{
"columns": [
{ "id": "date", "label": "Date", "kind": "dimension", "dataType": "date" },
{ "id": "campaign_name", "label": "Campaign name", "kind": "dimension", "dataType": "string" },
{ "id": "spend", "label": "Amount spent", "kind": "metric", "dataType": "currency" },
{ "id": "ctr", "label": "CTR", "kind": "metric", "dataType": "percent" }
],
"rows": [
{ "date": "2026-10-01", "campaign_name": "Black Friday – Prospecting", "spend": 412.5, "ctr": 0.0183 }
],
"totals": { "spend": 12840.32 },
"meta": {
"connector": "meta_ads",
"range": { "start": "2026-09-26", "end": "2026-10-25" },
"rowCount": 30,
"totalRows": 30,
"servedFrom": "stored",
"currency": "USD",
"durationMs": 120,
"dataFreshness": "2026-10-26T13:00:00Z",
"warnings": []
}
}Formatos de salida
{
"schema": [{ "name": "date", "dataType": "STRING" }, { "name": "spend", "dataType": "NUMBER" }],
"rows": [{ "values": ["20261001", 412.5] }]
}PublicField
{
id: string,
kind: "dimension" | "metric",
dataType: "string" | "integer" | "number" | "currency" | "percent" | "boolean" | "date" | "datetime" | "json",
label: string,
description?: string,
group: string,
aggregation: "sum" | "avg" | "min" | "max" | "count" | "count_distinct" | "ratio" | "none",
isDefault: boolean,
derived?: { numerator: string, denominator: string, multiplier?: number }, // ratio metrics
looker?: { dataType: "STRING" | "NUMBER" | "BOOLEAN", semanticType: string } // destination=looker_studio
}Las métricas de tipo ratio (CTR, CPC, ROAS…) incluyen derived: { numerator, denominator, multiplier? } para que puedas recalcularlas correctamente al agrupar: SUM(numerator) / SUM(denominator) × multiplier.
Todos los conectores incluyen además estas dimensiones de plataforma: data_source_id, data_source_name, data_source_external_id, client_id, client_name y source_currency.
Consultas guardadas y feeds secretos
Guarda una consulta en el Explorador de la app y ejecútala por ID con GET /saved-queries/{id}/run. Si necesitas una URL sin cabeceras, genera su URL del feed:
https://onemetrics.co/api/v1/feeds/{token}.csvServidor OAuth 2.0
- GET
https://onemetrics.co/oauth/authorizePágina de inicio de sesión, elección de espacio de trabajo y consentimiento. Parámetros:response_type=code,client_id,redirect_uri,state,scope,code_challenge,code_challenge_method=S256. - POST
https://onemetrics.co/api/oauth/tokenCanjea el código o un token de actualización (application/x-www-form-urlencoded):grant_type=authorization_code | refresh_token,code,redirect_uri,client_id,client_secretocode_verifier,refresh_token. - POST
https://onemetrics.co/api/oauth/revokeRevoca un token de acceso o de actualización:token=.
Para integraciones que actúan en nombre de un usuario usamos el flujo authorization code con PKCE (S256). Los tokens de acceso duran 1 hora y los de actualización 180 días; estos últimos rotan en cada uso.
curl -X POST "https://onemetrics.co/api/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d grant_type=authorization_code \
-d code=$CODE \
-d redirect_uri=https://example.com/callback \
-d client_id=$CLIENT_ID \
-d code_verifier=$CODE_VERIFIER{
"access_token": "mko_…",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "…",
"scope": "query read"
}Los usuarios pueden revisar y revocar las aplicaciones autorizadas en Cuenta → Autorizaciones. ¿Quieres registrar tu propia integración? Escríbenos.
OpenAPI
La especificación completa está disponible en formato OpenAPI 3.1 para generar clientes o probar la API en tu herramienta favorita.
¿Necesitas ayuda con la integración?
Nuestro equipo técnico responde en español e inglés.