Créditos y facturación de la API
Consulta tarifas por plataforma, cargos por restricciones confirmadas, errores gratuitos, cabeceras de saldo y facturación de caché.
Los análisis correctos se cobran según la plataforma. La mayoría de las demás plataformas compatibles: 1 crédito; YouTube: 3 créditos; Threads: 2 créditos; Kuaishou / Kwai: 2 créditos; RedNote / Xiaohongshu: 10 créditos. Un error, una respuesta vacía o contenido no disponible no bastan para cobrar. Sin archivos, solo se cobra si se confirman tanto el coste de procesamiento como una restricción clara del contenido. Esta excepción se aplica actualmente solo a Douyin y Toutiao. Las URL no compatibles, los errores de validación, los tokens inválidos o sin permiso de plataforma, los fallos temporales, los tiempos de espera agotados y los resultados vacíos sin explicación cuestan 0 créditos. El contenido no disponible sin coste confirmado también es gratuito.
| Plataforma | Créditos por solicitud cobrada |
|---|---|
| La mayoría de las demás plataformas compatibles | 1 crédito |
| YouTube | 3 créditos |
| Threads | 2 créditos |
| Kuaishou / Kwai | 2 créditos |
| RedNote / Xiaohongshu | 10 créditos |
Fuente de verdad: GET /api/v1/capabilities → data.billing.
Cuándo se consumen créditos
| Resultado de la solicitud | Créditos cobrados |
|---|---|
| Archivos descargables devueltos, incluida la caché | Tarifa de la plataforma, una vez |
| Coste de procesamiento Y restricción clara confirmados (Douyin / Toutiao) | Tarifa de la plataforma, una vez |
| Token inválido, caducado, revocado o sin permiso de plataforma | 0 |
| URL no compatible o error de validación | 0 |
| Fallo temporal, tiempo de espera agotado o resultado vacío sin explicación | 0 |
| Contenido no disponible sin coste de procesamiento confirmado | 0 |
La falta de permisos del token de API no es una restricción del contenido y no se cobra. Cobrar el procesamiento no significa que EasyDown pueda obtener contenido privado, eliminado o restringido.
Cada solicitud se cobra una vez a la tarifa de la plataforma, sin multiplicar por archivos, calidades o intentos internos. La caché que devuelve archivos usa la misma tarifa. Un nuevo envío es una nueva solicitud, no un reintento gratuito.
Respuesta
Las respuestas comerciales cobradas incluyen el cargo real y el saldo, incluso si el contenido no está disponible:
X-Credits-Charged: {actual_credits_charged}X-Credits-Remaining: {balance}X-EasyDown-Cache: HIT | MISS | SUPABASE | BYPASS
X-Credits-Charged indica el cargo real, incluidos los fallos cobrados; X-Credits-Remaining indica el saldo devuelto. Los fallos de contenido no disponible cobrados incluyen X-Credits-Charge-Reason: content_unavailable.
REST y MCP usan las mismas tarifas y la misma excepción por restricción confirmada. MCP devuelve el cargo real en billing.creditsCharged, también cuando el resultado falla.
No deduzcas un cargo cero a partir del estado HTTP, data: null o content_unavailable. Si falta la cabecera de cobro o se interrumpe la conexión, el cargo es desconocido: consulta el historial de uso antes de reenviar.
Para dudas de facturación, escribe a [email protected] con la plataforma, fecha y hora, código de error y registro de uso. Nunca envíes el token de API. Los cargos históricos se revisan con sus registros originales; esta aclaración no modifica transacciones pasadas.
Ejemplos ilustrativos de errores
Estos ejemplos muestran el formato, no son nuevas llamadas de pago reales. Corresponden a /api/v1/platforms/douyin/parse y usan saldos ilustrativos. Los estados del endpoint común pueden ser distintos.
Contenido no disponible tras un coste confirmado: 1 crédito cobrado
HTTP/1.1 404
Content-Type: application/json
X-Credits-Charged: 1
X-Credits-Remaining: 9
X-Credits-Charge-Reason: content_unavailable
{
"status": 404,
"data": null,
"msg": "Content unavailable after processing",
"code": "content_unavailable"
}Créditos insuficientes: 0 créditos cobrados
HTTP/1.1 402
Content-Type: application/json
X-Credits-Charged: 0
X-Credits-Remaining: 0
{
"status": 402,
"data": null,
"msg": "Insufficient credits",
"code": "insufficient_credits"
}Comprueba el cobro antes de gestionar el error
Lee las cabeceras de cobro antes de gestionar el error. No reintentes automáticamente un fallo de contenido restringido ya cobrado; otro envío puede generar otro cargo.
const response = await fetch('https://api.easydown.org/api/v1/platforms/douyin/parse', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EASYDOWN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: "https://v.douyin.com/f-QpBB_oD9Y/" }),
});
const chargedHeader = response.headers.get('X-Credits-Charged');
const creditsCharged = chargedHeader === null ? null : Number(chargedHeader);
const chargeReason = response.headers.get('X-Credits-Charge-Reason');
const payload = await response.json();
console.log({ httpStatus: response.status, creditsCharged, chargeReason });
if (!response.ok || payload.status !== 200) {
if (creditsCharged === null || !Number.isFinite(creditsCharged)) {
console.warn('Charge unknown: check dashboard usage before resubmitting.');
}
// No automatic retry: another submission is a new request.
throw new Error(payload.code || 'parse_failed');
}