API de Detección de Música IA — Guía completa para desarrolladores 2026

22 de mayo de 2026 · El equipo de AI Song Checker

Si estás construyendo un DSP, distribuidor, plataforma de submissions A&R o cualquier herramienta que necesite marcar música generada por IA de forma programática, necesitas una API. Esta guía te muestra todo: autenticación, endpoints, ejemplos de código en Python/Node/Java, límites de tasa, formatos de respuesta, manejo de errores y consejos para producción.

Usaremos la API REST de AI Song Checker para los ejemplos de código: es gratis para empezar (sin tarjeta de crédito), admite todos los principales motores de música IA (Suno, Udio, Riffusion, ElevenLabs Music, MusicGen, Stable Audio) y devuelve un JSON completo que incluye puntuaciones de confianza y atribución de plataforma.

Por qué integrar vía API en lugar de la interfaz

Inicio rápido — 60 segundos

  1. Regístrate gratis en aisongchecker.pro (solo un email)
  2. Pasa a Pro (4,99€/mes) para desbloquear el acceso a la API
  3. Ve a Panel → API y copia tu ASC_API_KEY
  4. Haz tu primera llamada (mira el ejemplo en Python más abajo)

Autenticación

Todas las solicitudes a la API usan HTTP Basic Auth o un token Bearer en la cabecera Authorization. Se recomienda Bearer:

Authorization: Bearer ASC_LIVE_xxxxxxxxxxxxxxxx

Tu clave de API tiene acceso completo a tu cuenta: manténla en el servidor, nunca en JS del cliente ni en los bundles de una app móvil.

Resumen de endpoints

EndpointMétodoQué hace
/api/v1/analyze/filePOSTSube un archivo de audio y obtén el resultado de detección de IA
/api/v1/analyze/urlPOSTAnaliza una URL de YouTube/Spotify/SoundCloud
/api/v1/analyze/batchPOSTEnvía hasta 100 pistas en una sola llamada
/api/v1/result/{id}GETRecupera el resultado de un trabajo por lotes asíncrono
/api/v1/certificate/{id}GETObtén el certificado de autenticidad (PDF, firmado)
/api/v1/usageGETUso actual de la cuota + estado del límite de tasa

Analizar un solo archivo — Python

import requests

API_KEY = "ASC_LIVE_your_key_here"
URL = "https://api.aisongchecker.pro/v1/analyze/file"

with open("track.mp3", "rb") as f:
    response = requests.post(
        URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"audio": f},
        data={"return_features": "true", "return_certificate": "true"},
    )

result = response.json()
print(f"AI probability: {result['ai_probability']:.1%}")
print(f"Verdict: {result['verdict']}")  # "ai" | "human" | "uncertain"
print(f"Most likely platform: {result['platform_attribution']['top']}")
print(f"Confidence: {result['confidence']:.2f}")

Ejemplo de respuesta

{
  "id": "asc_anl_2k3jX9pQmR8t",
  "ai_probability": 0.967,
  "verdict": "ai",
  "confidence": 0.94,
  "platform_attribution": {
    "top": "suno",
    "scores": {
      "suno": 0.91,
      "udio": 0.04,
      "riffusion": 0.02,
      "elevenlabs_music": 0.01,
      "musicgen": 0.01,
      "stable_audio": 0.01
    },
    "version_hint": "v5"
  },
  "watermarks": {
    "c2pa_detected": true,
    "synthid_detected": false,
    "c2pa_signer": "suno.ai"
  },
  "features": {
    "spectral_flatness_mean": 0.0182,
    "phase_coherence_entropy": 2.41,
    "mfcc_distance_baseline": 8.93,
    "frame_similarity": 0.78
  },
  "engine_version": "ASC-v8.3",
  "analyzed_at": "2026-05-22T18:42:11Z",
  "certificate_url": "https://aisongchecker.pro/cert/asc_anl_2k3jX9pQmR8t.pdf"
}

Analizar una URL — Node.js

const fetch = require('node-fetch');

const result = await fetch('https://api.aisongchecker.pro/v1/analyze/url', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.ASC_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
    return_features: false
  })
}).then(r => r.json());

console.log(`AI: ${(result.ai_probability * 100).toFixed(1)}%`);
if (result.verdict === 'ai') {
  console.log(`Platform: ${result.platform_attribution.top}`);
}

Análisis por lotes — Java

import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();

String json = """
{
  "tracks": [
    {"id": "t1", "url": "https://soundcloud.com/artist/track-1"},
    {"id": "t2", "url": "https://open.spotify.com/track/abc123"},
    {"id": "t3", "url": "https://youtu.be/xyz789"}
  ],
  "webhook_url": "https://your-app.com/asc-webhook"
}""";

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.aisongchecker.pro/v1/analyze/batch"))
    .header("Authorization", "Bearer " + System.getenv("ASC_API_KEY"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
// Devuelve: {"job_id": "asc_job_xyz", "status": "queued", "estimated_completion": "..." }

Límites de tasa

PlanSolicitudes/minSolicitudes/díaTamaño de lote
Free10501
Pro605.000100
Business30050.000500
EnterprisePersonalizadoIlimitadoPersonalizado

Cabeceras de límite de tasa en cada respuesta:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1716422400

Manejo de errores

Código HTTPSignificadoQué hacer
400Solicitud incorrecta (formato de archivo inválido, URL no admitida)Revisa la entrada, reintenta con datos válidos
401Clave de API inválidaRevisa la clave en el panel, rótala si se ha filtrado
402Cuota superada (plan gratuito)Mejora el plan o espera al reinicio
413Archivo demasiado grande (máx. 50 MB)Comprime el audio (aún válido con MP3 a 320 kbps)
429Límite de tasa alcanzadoImplementa backoff exponencial (mira abajo)
500/503Error del servidorReintenta con backoff. Tenemos un SLA del 99,9%.

Patrón de backoff exponencial

import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
retries = Retry(
    total=5, backoff_factor=2,
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods=["POST"]
)
session.mount("https://", HTTPAdapter(max_retries=retries))

# Luego usa session.post(...) — reintenta automáticamente a los 2s, 4s, 8s, 16s, 32s

Webhooks para trabajos por lotes asíncronos

Para lotes de más de 10 pistas, los resultados llegan por webhook (más rápido que el polling). Configura webhook_url en la solicitud del lote. Payload del webhook:

POST https://your-app.com/asc-webhook
Content-Type: application/json
X-ASC-Signature: t=1716422400,v1=abc123...

{
  "event": "batch.completed",
  "job_id": "asc_job_xyz",
  "results": [
    { "id": "t1", "ai_probability": 0.97, "verdict": "ai", "platform": "suno" },
    { "id": "t2", "ai_probability": 0.04, "verdict": "human" },
    { "id": "t3", "ai_probability": 0.81, "verdict": "ai", "platform": "udio" }
  ],
  "stats": { "processed": 3, "errors": 0, "duration_ms": 12450 }
}

Verifica la cabecera X-ASC-Signature en el servidor usando HMAC-SHA256 con tu secreto de webhook (el mismo esquema que los webhooks de Stripe).

Casos de uso — ejemplos reales

1. Plataforma de streaming — marcar subidas automáticamente

Al subir una pista, llama a /analyze/file de forma asíncrona. Si ai_probability > 0.85, añade automáticamente una etiqueta "Generada por IA" (según los requisitos de la EU AI Act). Etiqueta platform_attribution.top en los metadatos para mayor transparencia.

2. Filtrado de submissions A&R

Las plataformas tipo SubmitHub llaman a la API en cada demo subida. Las pistas con ai_probability > 0.7 reciben prioridad de revisión humana. Ahorra horas a los curadores.

3. Supervisor musical — due diligence de licencias

Antes de licenciar una pista para cine/TV, pásala por /analyze/file y solicita el certificado firmado (HMAC-SHA256). Adjunta el certificado al contrato de licencia como prueba de autoría humana.

4. Auditoría de catálogo para sellos

Envía tu catálogo histórico (de 10K a 1M de pistas) vía /analyze/batch. Obtén un informe CSV de las pistas sospechosas para revisión humana. Precio: ~0,01 $ por pista en el plan Business.

SDKs disponibles

Checklist de producción

Related