Documentación de API Hop
Referencia de endpoints de YouTube
Consulta vídeos, canales, Shorts, comentarios, publicaciones de la comunidad, búsquedas y metadatos de flujos de YouTube mediante 34 endpoints autenticados: 32 GET y 2 POST.
Envía únicamente los campos documentados para el endpoint elegido. En cada grupo de alternativas, proporciona al menos un campo. Los cursores proceden de la respuesta anterior; no hay paginación automática.
Las operaciones GET utilizan parámetros de consulta sin cuerpo. El flujo V3 usa POST con un cuerpo application/json y sin parámetros de consulta; envía proxy_url únicamente en ese cuerpo. El segmento de versión selecciona la interfaz de YouTube. Los campos desconocidos o repetidos se rechazan. Conserva los identificadores y cursores como cadenas, incluso cuando superen el rango entero seguro de JavaScript.
Para solicitudes síncronas: Se factura por solicitud correcta, no por elemento devuelto. Cada página es una solicitud independiente. La mayoría de las operaciones cuestan $0.001. Las dos variantes de búsqueda V2 cuestan $0.002 y la variante de flujos V2 $0.004. Consulta el precio de cada endpoint. Prevalecen las tarifas específicas de la cuenta. Los descuentos por volumen del proveedor no se trasladan automáticamente. Los fallos del proveedor liberan la reserva; un fallo de liquidación devuelve un error sin repetir la llamada al proveedor.
Tareas de subtítulos
POST https://api.apihop.ai/v1/youtube/web-v2/videos/captions devuelve HTTP 202, un ID de tarea de la plataforma y Location: /v1/jobs/\{id\}. Consulte GET https://api.apihop.ai/v1/youtube/web-v2/videos/captions/result?job_id=\{id\} cada 2–5 segundos. Solo el tenant propietario puede acceder. Las consultas son gratuitas; la creación cuesta $0.008 según tarifa de lista. Un resultado sin subtítulos se considera correcto y se factura. El formato se fija al crear (srt por defecto); el format opcional de consulta debe coincidir o se devuelve HTTP 400. data.result es null hasta COMPLETED; también puede terminar en FAILED. Se recuperan subtítulos existentes, no se generan transcripciones con IA.
Si no se puede confirmar la aceptación, no se repite la solicitud y la reserva puede mantenerse hasta el plazo de 30 minutos de la tarea. El resultado puede quedar pendiente mientras se concilia la facturación. Un error temporal de consulta no implica el fallo definitivo de la tarea.
{"success":true,"data":{"id":"9007199254740993001","status":"PROCESSING","result":null},"requestId":"example"}Alcance y límites
web y web-v2 seleccionan la familia de interfaces. El flujo V3 admite POST con tu propio proxy HTTP de salida fija. Los flujos devuelven metadatos y URL, no archivos ni garantías de descarga. La descripción de un canal puede requerir otra solicitud facturada con continuation_token. No hay reintentos automáticos.
web-get_relate_video
GET https://api.apihop.ai/v1/youtube/web/videos/related
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | Sí | string |
continuation_token | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web/videos/related" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=LuIL5JATZsc"web-search_video
GET https://api.apihop.ai/v1/youtube/web/search/videos
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
search_query | Sí | string |
language_code | No | string; default: "en" |
order_by | No | string; default: "this_month" |
country_code | No | string; default: "us" |
continuation_token | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web/search/videos" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "search_query=Minecraft"web-get_channel_id
GET https://api.apihop.ai/v1/youtube/web/channels/id
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_name | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/id" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_name=LinusTechTips"web-get_channel_id_v2
GET https://api.apihop.ai/v1/youtube/web/channels/id/by-url
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_url | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/id/by-url" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_url=https://www.youtube.com/@CozyCraftYT"web-get_channel_url
GET https://api.apihop.ai/v1/youtube/web/channels/url
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/url" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCeu6U67OzJhV1KwBansH3Dg"web-get_channel_info
GET https://api.apihop.ai/v1/youtube/web/channels/info
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/info" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCXuqSBlHAE6Xw-yeJA0Tunw"web-get_channel_short_videos
GET https://api.apihop.ai/v1/youtube/web/channels/shorts
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
continuation_token | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/shorts" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCXuqSBlHAE6Xw-yeJA0Tunw"web-search_channel
GET https://api.apihop.ai/v1/youtube/web/channels/search
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
search_query | Sí | string |
language_code | No | string; default: "en" |
country_code | No | string; default: "us" |
continuation_token | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web/channels/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCXuqSBlHAE6Xw-yeJA0Tunw" \
--data-urlencode "search_query=AMD"web_v2-get_video_info
GET https://api.apihop.ai/v1/youtube/web-v2/videos/info
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | Sí | string; minLength: 11; maxLength: 11 |
language_code | No | string; default: "zh-CN" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/info" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=oaSNBz4qMQY"web_v2-get_video_info_v2
GET https://api.apihop.ai/v1/youtube/web-v2/videos/info-v2
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/info-v2" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=dQw4w9WgXcQ"web_v2-get_video_comments
GET https://api.apihop.ai/v1/youtube/web-v2/videos/comments
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | Sí | string; minLength: 11; maxLength: 11 |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
sort_by | No | string; top, newest; default: "top" |
continuation_token | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/comments" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=LuIL5JATZsc"web_v2-get_video_comment_replies
GET https://api.apihop.ai/v1/youtube/web-v2/videos/comments/replies
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
continuation_token | Sí | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/comments/replies" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "continuation_token=example"web_v2-get_channel_description
GET https://api.apihop.ai/v1/youtube/web-v2/channels/description
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: channel_id, continuation_token.
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | No | string |
continuation_token | No | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/description" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCeu6U67OzJhV1KwBansH3Dg"web_v2-get_general_search
GET https://api.apihop.ai/v1/youtube/web-v2/search
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
search_query | Sí | string; maxLength: 200 |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
time_zone | No | string; default: "America/Los_Angeles" |
upload_time | No | string; hour, today, week, month, year |
duration | No | string; short, medium, long |
content_type | No | string; video, channel, playlist, movie |
feature | No | string; live, 4k, hd, subtitles, creative_commons, 360, vr180, 3d, hdr, location, purchased |
sort_by | No | string; relevance, upload_date, view_count, rating |
continuation_token | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "search_query=Python编程"web_v2-get_general_search_v2
GET https://api.apihop.ai/v1/youtube/web-v2/search-v2
Precio por solicitud correcta: $0.002 (2000 credits).
Al menos uno: keyword, continuation_token.
| Campo | Obligatorio | Contrato |
|---|---|---|
keyword | No | string; maxLength: 200 |
continuation_token | No | string |
upload_date | No | string; last_hour, today, this_week, this_month, this_year |
type | No | string; video, channel, playlist, movie |
duration | No | string; short, medium, long |
features | No | string |
sort_by | No | string; relevance, upload_date, view_count, rating |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search-v2" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "keyword=Python tutorial"web_v2-get_shorts_search
GET https://api.apihop.ai/v1/youtube/web-v2/search/shorts
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
search_query | Sí | string; maxLength: 200 |
language_code | No | string; default: "en-US" |
country_code | No | string; default: "US" |
time_zone | No | string; default: "America/Los_Angeles" |
upload_time | No | string; hour, today, week, month, year |
sort_by | No | string; relevance, upload_date, view_count, rating |
continuation_token | No | string |
filter_mixed_content | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search/shorts" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "search_query=Python编程"web_v2-get_shorts_search_v2
GET https://api.apihop.ai/v1/youtube/web-v2/search/shorts-v2
Precio por solicitud correcta: $0.002 (2000 credits).
Al menos uno: keyword, continuation_token.
| Campo | Obligatorio | Contrato |
|---|---|---|
keyword | No | string; maxLength: 200 |
continuation_token | No | string |
upload_date | No | string; last_hour, today, this_week, this_month, this_year |
sort_by | No | string; relevance, upload_date, view_count, rating |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search/shorts-v2" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "keyword=coding tips"web_v2-get_channel_id
GET https://api.apihop.ai/v1/youtube/web-v2/channels/id
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_url | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/id" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_url=https://www.youtube.com/@CozyCraftYT"web_v2-get_channel_url
GET https://api.apihop.ai/v1/youtube/web-v2/channels/url
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/url" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCeu6U67OzJhV1KwBansH3Dg"web_v2-get_channel_videos
GET https://api.apihop.ai/v1/youtube/web-v2/channels/videos
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
continuation_token | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/videos" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCJHBJ7F-nAIlMGolm0Hu4vg"web_v2-get_video_streams
GET https://api.apihop.ai/v1/youtube/web-v2/videos/streams
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/streams" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=dQw4w9WgXcQ"web_v2-get_video_streams_v2
GET https://api.apihop.ai/v1/youtube/web-v2/videos/streams-v2
Precio por solicitud correcta: $0.004 (4000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/streams-v2" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=dQw4w9WgXcQ"web_v2-get_signed_stream_url
GET https://api.apihop.ai/v1/youtube/web-v2/videos/streams/signed-url
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
itag | Sí | integer |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/streams/signed-url" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "itag=18" \
--data-urlencode "video_id=dQw4w9WgXcQ"web_v2-get_video_captions
POST https://api.apihop.ai/v1/youtube/web-v2/videos/captions
Precio por solicitud correcta: $0.008 (8000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
language_code | No | string |
format | No | string; srt, xml, json3, txt; default: "srt" |
curl -X POST "https://api.apihop.ai/v1/youtube/web-v2/videos/captions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{"format":"srt","video_id":"dQw4w9WgXcQ"}'web_v2-get_video_captions_result
GET https://api.apihop.ai/v1/youtube/web-v2/videos/captions/result
Precio por solicitud correcta: $0 (0 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
job_id | Sí | string; ^[1-9][0-9]{0,18}$ |
format | No | string; srt, xml, json3, txt; default: "srt" |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/captions/result" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "job_id=9007199254740993001"web_v2-get_related_videos
GET https://api.apihop.ai/v1/youtube/web-v2/videos/related
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: video_id, video_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | No | string |
video_url | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/videos/related" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "video_id=dQw4w9WgXcQ"web_v2-get_channel_shorts
GET https://api.apihop.ai/v1/youtube/web-v2/channels/shorts
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: channel_id, channel_url.
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | No | string |
channel_url | No | string |
continuation_token | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/shorts" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCuAXFkgsw1L7xaCfnd5JJOw"web_v2-get_search_suggestions
GET https://api.apihop.ai/v1/youtube/web-v2/search/suggestions
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
keyword | Sí | string; maxLength: 200 |
language | No | string; default: "en" |
region | No | string; default: "US" |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search/suggestions" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "keyword=Rick Astley"web_v2-search_channels
GET https://api.apihop.ai/v1/youtube/web-v2/search/channels
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: keyword, continuation_token.
| Campo | Obligatorio | Contrato |
|---|---|---|
keyword | No | string; maxLength: 200 |
continuation_token | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/search/channels" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "keyword=Rick Astley"web_v2-get_channel_community_posts
GET https://api.apihop.ai/v1/youtube/web-v2/channels/posts
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
channel_id | Sí | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
continuation_token | No | string |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/channels/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "channel_id=UCkRfArvrzheW2E7b6SVT7vQ"web_v2-get_post_detail
GET https://api.apihop.ai/v1/youtube/web-v2/posts/detail
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
post_id | Sí | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/posts/detail" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "post_id=UgkxiCSRfD6g7SPlWGPDa3vbP7aIsytXRkvy"web_v2-get_post_comments
GET https://api.apihop.ai/v1/youtube/web-v2/posts/comments
Precio por solicitud correcta: $0.001 (1000 credits).
Al menos uno: post_id, continuation_token.
| Campo | Obligatorio | Contrato |
|---|---|---|
post_id | No | string |
continuation_token | No | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/posts/comments" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "post_id=UgkxiCSRfD6g7SPlWGPDa3vbP7aIsytXRkvy"web_v2-get_post_comment_replies
GET https://api.apihop.ai/v1/youtube/web-v2/posts/comments/replies
Precio por solicitud correcta: $0.001 (1000 credits).
| Campo | Obligatorio | Contrato |
|---|---|---|
continuation_token | Sí | string |
language_code | No | string; default: "zh-CN" |
country_code | No | string; default: "US" |
need_format | No | boolean; default: true |
curl --get "https://api.apihop.ai/v1/youtube/web-v2/posts/comments/replies" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode "continuation_token=example"web_v2-get_video_streams_v3
POST https://api.apihop.ai/v1/youtube/web-v2/videos/streams-v3
Precio por solicitud correcta: $0.003 (3000 credits).
El flujo V3 usa POST JSON por HTTPS y cuesta $0.003 por solicitud correcta. Proporciona video_id y proxy_url (http:// con puerto explícito y host público). No se permiten destinos privados, de bucle local o enlace local; codifica los caracteres reservados de las credenciales. Usa salida fija o sesión persistente. itags es ["137", "140"] por defecto; los formatos ausentes fallan sin sustitución. verify_download es false por defecto. Descarga con la misma sesión proxy, la misma IP pública real y streams[].download_headers. La extracción correcta de URL (HTTP 200) se factura aunque all_selected_streams_verified o streams[].verified sea false. La verificación toma pequeñas muestras de bytes, no el archivo completo. URL y sesiones caducan por separado; une los flujos de audio y vídeo en el cliente.
| Campo | Obligatorio | Contrato |
|---|---|---|
video_id | Sí | string; ^[A-Za-z0-9_-]{11}$ |
proxy_url | Sí | string; minLength: 1; maxLength: 2048; writeOnly: true |
itags | No | array; items: string ^[0-9]+$; minItems: 1; maxItems: 4; uniqueItems: true; default: ["137","140"] |
verify_download | No | boolean; default: false |
curl -X POST "https://api.apihop.ai/v1/youtube/web-v2/videos/streams-v3" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{"video_id":"phlZ2J3x4hI","proxy_url":"http://USERNAME:PASSWORD@proxy.example.com:1000","itags":["137","140"],"verify_download":false}'Respuestas
Los endpoints síncronos conservan la respuesta JSON original. Los de subtítulos devuelven success, data.id, data.status, data.result y requestId. Los ejemplos son ilustrativos, no resultados reales.
{"code":200,"data":{"channel_id":"UCXuqSBlHAE6Xw-yeJA0Tunw"}}Errores
HTTP 400 indica parámetros inválidos, 401 autenticación inválida, 402 saldo insuficiente, 403 acceso denegado, 429 límites de frecuencia y 5xx fallos del servicio o proveedor. Conserva X-Request-Id para investigar problemas. Un HTTP 200 con un código de negocio fallido no es un éxito.
Fuentes
Los endpoints y precios se comprobaron el 2026-10-31 con el esquema oficial y los metadatos de precios actuales. Los metadatos actuales prevalecen ante precios contradictorios en el texto.