# Get full video info



<MethodPage method="GET" path="/v1/videos/{id}/video-info" credits={1}>
  <MethodSignature name="getVideoInfo" args={[{ name: "id" }, { name: "query", optional: true }, { name: "options", optional: true }]} returns="Video" />

  Complete video metadata lookup. Returns everything in `basic-info`, plus description, view/like counts, publish date, thumbnails, keywords, timestamped chapters, engagement heatmap (most-replayed segments), and richer channel metrics. **1 credit** per successful response.

  <Callout type="info" title="Credits">
    Successful `video-info` responses deduct 1 credit. Failed lookups are not billed.
  </Callout>

  <Security permission="videos:read" />

  <SchemaGroup title="Path Parameters">
    <SchemaField name="id" type="string" location="path" required>
      11-character YouTube video ID or video URL.
    </SchemaField>
  </SchemaGroup>

  <div id="returns" className="mt-8">
    Response (HTTP 200) [#response-http-200]

    ```jsonc
    {
      "video_id": string,            // Echoed YouTube video ID
      "title": string,               // Video title
      "description": string,         // Full video description
      "length_seconds": number,      // Duration in seconds
      "view_count": number,          // Current view count
      "like_count": number,          // Current like count
      "published": number,           // Unix timestamp (seconds) of publish date
      "keywords": string[],          // Video tags / keywords
      "channel": {                   // Channel metadata
        "id": string,                // Canonical channel ID
        "title": string,             // Channel display name
        "url": string,               // Channel URL
        "subscribers": string,       // Subscriber count text (e.g. "1.69M subscribers")
        "avatar_url": string         // Channel avatar image URL
      },
      "thumbnails": [                // Thumbnail variants
        {
          "url": string,
          "width": number,
          "height": number
        }
      ],
      "available_languages": [       // Available caption tracks
        {
          "code": string,            // ISO language code (e.g. "en")
          "name": string,            // Display name
          "kind": string             // "asr" or "manual"
        }
      ],
      "chapters": [                  // Timestamped chapters (omitted if none)
        {
          "title": string,           // Chapter title
          "start_time_seconds": number, // Start offset in seconds
          "time_description": string // Formatted time string (e.g. "0:00")
        }
      ]
    }
    ```
  </div>

  <MethodSamples>
    <LanguageSample language="TypeScript">
      ```ts
      const id = "kCc8FmEb1nY";
      const response = await fetch(
        `https://api.ytapi.dev/v1/videos/${id}/video-info`,
        {
          headers: {
            Authorization: `Bearer ${process.env.YT_API_KEY}`,
          },
        },
      );

      const video = await response.json();
      console.log(video.title, video.like_count, video.chapters?.length);
      ```
    </LanguageSample>

    <LanguageSample language="Python">
      ```python
      import os
      import requests

      video_id = "kCc8FmEb1nY"
      response = requests.get(
          f"https://api.ytapi.dev/v1/videos/{video_id}/video-info",
          headers={"Authorization": f"Bearer {os.environ['YT_API_KEY']}"},
      )

      video = response.json()
      print(video["title"], video.get("like_count"))
      ```
    </LanguageSample>

    <LanguageSample language="cURL">
      ```bash
      curl -X GET "https://api.ytapi.dev/v1/videos/kCc8FmEb1nY/video-info" \
        -H "Authorization: Bearer $YT_API_KEY"
      ```
    </LanguageSample>

    <LanguageSample language="Go">
      ```go
      package main

      import (
      	"fmt"
      	"net/http"
      	"os"
      )

      func main() {
      	req, _ := http.NewRequest("GET", "https://api.ytapi.dev/v1/videos/kCc8FmEb1nY/video-info", nil)
      	req.Header.Set("Authorization", "Bearer "+os.Getenv("YT_API_KEY"))

      	resp, err := http.DefaultClient.Do(req)
      	if err != nil {
      		panic(err)
      	}
      	defer resp.Body.Close()
      	fmt.Println(resp.Status)
      }
      ```
    </LanguageSample>
  </MethodSamples>
</MethodPage>
