AI 음악 탐지 API — 개발자 완전 가이드 2026

2026년 5월 22일 · AI Song Checker 팀

DSP, 배급사, A&R 제출 플랫폼, 또는 AI 생성 음악을 프로그래밍 방식으로 표시해야 하는 도구를 구축하고 있다면 API가 필요합니다. 이 가이드는 인증, 엔드포인트, Python/Node/Java 코드 샘플, 요청 제한, 응답 형식, 오류 처리, 프로덕션 팁까지 모든 것을 안내합니다.

코드 예제에는 AI Song Checker REST API를 사용합니다. 무료로 시작할 수 있고(신용카드 불필요), 모든 주요 AI 음악 엔진(Suno, Udio, Riffusion, ElevenLabs Music, MusicGen, Stable Audio)을 지원하며, 신뢰도 점수와 플랫폼 귀속 정보를 포함한 풍부한 JSON을 반환합니다.

UI 대신 API로 통합하는 이유

빠른 시작 — 60초

  1. aisongchecker.pro에서 무료로 가입(이메일만 필요)
  2. Pro(4,99€/월)로 업그레이드하여 API 접근 권한 잠금 해제
  3. 대시보드 → API로 이동하여 ASC_API_KEY 복사
  4. 첫 호출 실행(아래 Python 샘플 참고)

인증

모든 API 요청은 Authorization 헤더에서 HTTP Basic Auth 또는 Bearer 토큰을 사용합니다. Bearer 방식을 권장합니다:

Authorization: Bearer ASC_LIVE_xxxxxxxxxxxxxxxx

API 키는 계정에 대한 전체 접근 권한을 가집니다. 반드시 서버 측에 보관하고, 클라이언트 JS나 모바일 앱 번들에는 절대 포함하지 마세요.

엔드포인트 개요

엔드포인트메서드기능
/api/v1/analyze/filePOST오디오 파일 업로드, AI 탐지 결과 반환
/api/v1/analyze/urlPOSTYouTube/Spotify/SoundCloud URL 분석
/api/v1/analyze/batchPOST한 번의 호출로 최대 100개 트랙 제출
/api/v1/result/{id}GET비동기 일괄 작업 결과 조회
/api/v1/certificate/{id}GET진위 인증서 획득(서명된 PDF)
/api/v1/usageGET현재 할당량 사용량 + 요청 제한 상태

단일 파일 분석 — 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}")

응답 예시

{
  "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"
}

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}`);
}

일괄 분석 — 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());
// Returns: {"job_id": "asc_job_xyz", "status": "queued", "estimated_completion": "..." }

요청 제한

등급분당 요청 수일일 요청 수일괄 크기
Free10501
Pro605,000100
Business30050,000500
Enterprise맞춤형무제한맞춤형

모든 응답에 포함되는 요청 제한 헤더:

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

오류 처리

HTTP 코드의미대처 방법
400잘못된 요청(유효하지 않은 파일 형식, 지원되지 않는 URL)입력 확인 후 유효한 데이터로 재시도
401유효하지 않은 API 키대시보드에서 키 확인, 유출 시 교체
402할당량 초과(무료 등급)플랜 업그레이드 또는 초기화까지 대기
413파일 너무 큼(최대 50 MB)오디오 압축(MP3 320 kbps로 전달 가능)
429요청 제한 도달지수 백오프 구현(아래 참고)
500/503서버 오류백오프로 재시도. 99.9% SLA 보장.

지수 백오프 패턴

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))

# Then use session.post(...) — auto retries with 2s, 4s, 8s, 16s, 32s

비동기 일괄 작업을 위한 웹훅

10개 초과 트랙의 일괄 작업에서는 결과가 웹훅을 통해 전달됩니다(폴링보다 빠름). 일괄 요청에 webhook_url을 설정하세요. 웹훅 페이로드:

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 }
}

웹훅 시크릿과 HMAC-SHA256을 사용해 서버 측에서 X-ASC-Signature 헤더를 검증하세요(Stripe 웹훅과 동일한 방식).

사용 사례 — 실제 예시

1. 스트리밍 플랫폼 — 업로드 자동 표시

트랙 업로드 시 /analyze/file을 비동기로 호출합니다. ai_probability > 0.85이면 자동으로 "AI 생성" 라벨을 추가합니다(EU AI Act 요건에 따라). 투명성을 위해 메타데이터에 platform_attribution.top을 태그합니다.

2. A&R 제출 필터링

SubmitHub 스타일 플랫폼은 각 데모 업로드 시 API를 호출합니다. ai_probability > 0.7인 트랙은 사람의 검토 우선순위를 받습니다. 큐레이터의 시간을 크게 절약합니다.

3. 음악 감독 — 라이선싱 실사

영화/TV용으로 트랙을 라이선싱하기 전에 /analyze/file을 실행하고 서명된 인증서(HMAC-SHA256)를 요청하세요. 인증서를 인간 저작권 증명으로 라이선싱 계약서에 첨부합니다.

4. 레이블을 위한 카탈로그 감사

백 카탈로그(1만~100만 트랙)를 /analyze/batch로 전송하세요. 사람의 검토를 위한 의심 트랙 CSV 리포트를 받습니다. 가격: Business 등급에서 트랙당 약 $0.01.

제공되는 SDK

프로덕션 체크리스트

관련 읽을거리

Related