# Get batch status



<MethodPage method="GET" path="/v1/batch/{id}">
  <MethodSignature name="getBatchJob" args={[{ name: "id" }]} returns="BatchJobResponse" />

  Poll or inspect the status and results of an asynchronous batch job. While running, status will be `pending` or `processing`. Once finished, status will be `completed` (or `failed`) with populated `results` and exact `credits_deducted`.

  <Security permission="transcripts:read" />

  <SchemaGroup title="Path Parameters">
    <SchemaField name="id" type="string" location="path" required>
      The unique batch job ID returned by [`POST /v1/batch`](/batch/run).
    </SchemaField>
  </SchemaGroup>

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

    ```jsonc
    {
      "id": string,                  // Batch job identifier
      "status": string,              // Lifecycle state: "pending", "processing", "completed", or "failed"
      "total": number,               // Total tasks in the batch
      "successful": number,          // Number of successfully finished tasks (status: 200)
      "failed": number,              // Number of failed tasks
      "credits_deducted": number,    // Actual billable credits deducted
      "duration_ms": number,         // Execution time in milliseconds
      "results": [                   // Array of individual task results once completed
        {
          "id": string,              // Caller-specified task id
          "type": string,            // "transcript" or "basic_info"
          "video_id": string,        // YouTube video ID
          "status": number,          // HTTP status code (200, 404, etc.)
          "data": any,               // Extracted transcript or video metadata payload (when status=200)
          "error": {                 // Structured error envelope (when status != 200)
            "code": string,
            "message": string
          }
        }
      ],
      "created_at": string,          // ISO 8601 creation timestamp
      "completed_at": string | null  // ISO 8601 completion timestamp
    }
    ```
  </div>

  <MethodSamples>
    <LanguageSample language="TypeScript">
      ```ts
      const res = await fetch("https://api.ytapi.dev/v1/batch/batch_1789995131572858354_84b12de0", {
        headers: {
          Authorization: `Bearer ${process.env.YT_API_KEY}`,
        },
      });

      const data = await res.json();
      console.log(`Status: ${data.status}, Completed ${data.successful}/${data.total} tasks`);
      ```
    </LanguageSample>

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

      res = requests.get(
          "https://api.ytapi.dev/v1/batch/batch_1789995131572858354_84b12de0",
          headers={"Authorization": f"Bearer {os.environ['YT_API_KEY']}"},
      )

      data = res.json()
      print(f"Status: {data['status']}, Credits Deducted: {data['credits_deducted']}")
      ```
    </LanguageSample>

    <LanguageSample language="cURL">
      ```bash
      curl https://api.ytapi.dev/v1/batch/batch_1789995131572858354_84b12de0 \
        -H "Authorization: Bearer $YT_API_KEY"
      ```
    </LanguageSample>

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

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

      func main() {
      	req, _ := http.NewRequest("GET", "https://api.ytapi.dev/v1/batch/batch_1789995131572858354_84b12de0", 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()

      	var result map[string]any
      	_ = json.NewDecoder(resp.Body).Decode(&result)
      	fmt.Println("Batch Status:", result["status"])
      }
      ```
    </LanguageSample>
  </MethodSamples>
</MethodPage>
