Pods
Pods are the core building blocks in Lettercast. On this page, we'll explore the different pod endpoints you can use to manage pods programmatically. We'll look at how to list, retrieve, and create pods.
The pod model
The pod model contains all the information about the pods you create and manage in Lettercast.
Properties
- Name
 id- Type
 - string
 - Description
 Unique identifier for the pod.
- Name
 title- Type
 - string
 - Description
 The title of the pod.
- Name
 source- Type
 - string
 - Description
 Source of the content used to generate the pod.
- Name
 content_publication_date- Type
 - string
 - Description
 The publication date of the original content.
- Name
 created_at- Type
 - string
 - Description
 The date and time when the pod was created.
- Name
 generation_status- Type
 - string
 - Description
 The current status of the pod generation process.
- Name
 table_of_contents- Type
 - array
 - Description
 An array of objects containing timestamps and descriptions of the pod's contents.
- Name
 authors- Type
 - array
 - Description
 An array of strings representing the authors of the original content.
- Name
 summary- Type
 - string
 - Description
 A summary of the pod's content.
- Name
 instructions- Type
 - string
 - Description
 The user instructions provided during pod creation.
- Name
 host_configs- Type
 - array
 - Description
 Optional. An array of host configurations for the pod. Each item should contain a
name(string, can be null) and avoice_configobject withvoice_name(string) property.
- Name
 has_music- Type
 - boolean
 - Description
 Optional. Whether to include intro and outro music in the pod. Default is true.
- Name
 video_image_file- Type
 - File
 - Description
 Optional. The image file to be used as a thumbnail for the video. This should be uploaded when
create_videoistrue.
List all pods
This endpoint allows you to retrieve a list of all your pods.
Request
export default async function handler(req, res) {
  const API_KEY = process.env.LETTERCAST_API_KEY;
  try {
    const response = await fetch('https://app.lettercast.ai/v1/pods', {
      headers: { Authorization: `Bearer ${API_KEY}` },
    });
    if (!response.ok) throw new Error('API request failed');
    const data = await response.json();
    res.status(200).json(data);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}
[
  {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "title": "My First Pod",
    "source": "https://example.com/article",
    "content_publication_date": "2023-01-01T00:00:00",
    "created_at": "2023-01-01T12:00:00Z",
    "generation_status": "done",
    "table_of_contents": [
      {
        "timestamp_s": 0,
        "description": "Introduction"
      },
      {
        "timestamp_s": 60,
        "description": "Main Points"
      }
    ],
    "authors": ["John Doe", "Jane Smith"],
    "summary": "This pod covers...",
    "instructions": "Summarize the main points"
  }
]
Retrieve a pod
This endpoint allows you to retrieve a specific pod by providing its ID.
Request
export default async function handler(req, res) {
  const API_KEY = process.env.LETTERCAST_API_KEY;
  const { id } = req.query;
  try {
    const response = await fetch(`https://app.lettercast.ai/v1/pods/${id}`, {
      headers: { Authorization: `Bearer ${API_KEY}` },
    });
    if (!response.ok) throw new Error('API request failed');
    const data = await response.json();
    res.status(200).json(data);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "title": "My First Pod",
  "source": "https://example.com/article",
  "content_publication_date": "2023-01-01T00:00:00",
  "created_at": "2023-01-01T12:00:00Z",
  "generation_status": "done",
  "table_of_contents": [
    {
      "timestamp_s": 0,
      "description": "Introduction"
    },
    {
      "timestamp_s": 60,
      "description": "Main Points"
    }
  ],
  "authors": ["John Doe", "Jane Smith"],
  "summary": "This pod covers...",
  "instructions": "Summarize the main points"
}
Create a pod
This endpoint allows you to generate a new pod from different types of content sources: URL, PDF, or HTML content.
Common Parameters
- Name
 pod_type- Type
 - string
 - Description
 The type of pod to generate. Options: "summary_single_host", "summary_discussion", "full_single_host", "full_discussion".
- Name
 user_instructions- Type
 - string
 - Description
 Optional. User instructions to guide the pod generation. Right now this only supports questions about the content.
- Name
 intro_plug_text- Type
 - string
 - Description
 Optional. Text to be used as an introduction plug for the pod.
- Name
 outro_plug_text- Type
 - string
 - Description
 Optional. Text to be used as an outro plug for the pod.
- Name
 host_configs- Type
 - array
 - Description
 Optional. An array of host configurations for the pod. Each item should contain a
name(string, can be null) and avoice_configobject withvoice_name(string) property.
- Name
 has_music- Type
 - boolean
 - Description
 Optional. Whether to include background music in the pod. Default is true.
- Name
 create_video- Type
 - boolean
 - Description
 Optional. Whether to create a video for the pod. Default is false. This only applies to PDF inputs.
- Name
 video_image_file- Type
 - File
 - Description
 Optional. The image file to be used as a thumbnail for the video. This should be uploaded when
create_videoistrue.
Source-Specific Parameters
- Name
 url- Type
 - string
 - Description
 Required for URL source. The URL of the content to generate a pod from.
- Name
 file- Type
 - File
 - Description
 Required for PDF source. The PDF file to generate a pod from.
- Name
 html_content- Type
 - string
 - Description
 Required for HTML source. The HTML content to generate a pod from.
Request
const data = {
  url: 'https://example.com/article',
  pod_type: 'summary_discussion',
  host_configs: [
    {
      name: "Alice",
      voice_config: { voice_name: "mira" }
    },
    {
      name: null,
      voice_config: { voice_name: "jensen" }
    }
  ],
  has_music: true
};
const response = await fetch('https://app.lettercast.ai/v1/pods', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data),
});
{
  "pod_id": "123e4567-e89b-12d3-a456-426614174000"
}
Notes
- When uploading a file or HTML content, the request must use 
multipart/form-dataencoding. - When sending URL data, use 
Content-Type: application/jsonheader. - The pod generation process may take some time. You'll need to poll the API to check the pod's status after creation.
 - For single-host pods, provide one item in the 
host_configsarray. - For two-host pods, provide two items in the 
host_configsarray. - If a host's 
nameis set tonull, they won't be referred to by name in the podcast. 
Get pod audio
This endpoint allows you to retrieve the audio file for a specific pod.
Request
Curl -X GET https://app.lettercast.ai/v1/pods/123e4567-e89b-12d3-a456-426614174000/audio \
  -H "Authorization: Bearer {API_KEY}"
HTTP/1.1 302 Found
Location: https://storage.lettercast.ai/path/to/audio/file.mp3
Get pod video
This endpoint allows you to retrieve the video file for a specific pod, if available.
Request
Curl -X GET https://app.lettercast.ai/v1/pods/123e4567-e89b-12d3-a456-426614174000/video \
  -H "Authorization: Bearer {API_KEY}"
HTTP/1.1 302 Found
Location: https://storage.lettercast.ai/path/to/video/file.mp4
Polling for pod status
After creating a new pod, you'll need to poll the API to check its status. This process involves repeatedly calling the "Retrieve a pod" endpoint until the pod's status is either "done" or "failed".
Key points
- Poll the API every 10 seconds
 - Check the 
generation_statusfield - Stop polling when status is "done" or "failed"
 
Request
const API_KEY = 'API_KEY'
const POD_ID = 'pod_id_returned_from_creation'
async function checkPodStatus() {
  while (true) {
    try {
      const response = await fetch(
        `https://app.lettercast.ai/v1/pods/${POD_ID}`,
        {
          headers: { Authorization: `Bearer ${API_KEY}` },
        },
      )
      if (!response.ok) throw new Error('API request failed')
      const data = await response.json()
      const status = data.generation_status
      if (status === 'done' || status === 'failed') {
        console.log(`Pod status: ${status}`)
        break
      } else {
        console.log(`Pod is still being created. Status: ${status}`)
        await new Promise((resolve) => setTimeout(resolve, 10000))
      }
    } catch (error) {
      console.error('Error checking pod status:', error.message)
      break
    }
  }
}
checkPodStatus()
Notes on host_configs
- For single-host pods, provide one item in the 
host_configsarray. - For two-host pods, provide two items in the 
host_configsarray. - The first item in 
host_configscorresponds to the main host, the second item (if present) corresponds to the co-host. - If a host's 
nameis set tonull, the corresponding host or co-host will not be referred to by name in the podcast. 
Notes on has_music
- When set to 
true, intro and outro music will be included in the pod. - When set to 
false, the pod will be generated without intro and outro music. - If not specified, the default value is 
true.