> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://onepin.ai/docs/workflow/script/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://onepin.ai/_mcp/server. # Script > The Onepin Script node (source_script) — the source of every line. Configure inline text or an uploaded .txt/.pdf file, plus the source language. **Family: Source · `type: source_script`** The Script node is where every line begins. It provides the text the rest of the workflow voices — typed inline or read from an uploaded file. Every runnable workflow has at least one. ## Config | Config key | Meaning | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `input_type` | Where the text comes from — `text` (typed inline) or `file` (an uploaded `.txt`/`.pdf`) | | `text` | The script, when `input_type` is `text` | | `source_language` | The script's language (BCP-47, e.g. `en-us`) | | `upload_ids` | Confirmed upload IDs, when the script comes from a file | | `input_mode` | `plain` (default) or `markup` — in markup mode, provider-native inline tags in the script (a `` pause, an SSML subset, inline phonemes) are protected instead of normalized. Models that can't speak a tag strip it with a warning | > **Note** > > The schema also accepts `input_type: "media"` (transcribe audio into a script), but it is not implemented yet — a run using it fails at the Script node. Use `text` or `file` today. ## Type your script inline The simplest source — set the text and its language: ```python node["config"] = {"input_type": "text", "source_language": "en-us", "text": "Hello from Onepin."} ``` ## Read from a file Upload the file first, then point the node at the confirmed upload: ```python node["config"] = {"input_type": "file", "source_language": "en-us", "upload_ids": [upload_id]} ``` The upload is a three-step flow (`client.uploads.create` → PUT the bytes → `client.uploads.confirm` with `context_type="workflow"`). See [Upload a file](/docs/guides/upload-a-file) for the walkthrough. Script uploads are `.txt` and `.pdf` only. The `csv_column` and `csv_has_header` keys still appear in the schema so that definitions saved before CSV support was removed keep loading, but they no longer select anything. ## Inspect this node Get the live config schema straight from the platform: #### Python ```python client.nodes.get_node_detail(node_type="source_script").data ``` #### CLI ```bash onepin nodes show source_script ``` #### API ```bash curl https://api.onepin.ai/api/v2/nodes/source_script \ -H "Authorization: Bearer $ONEPIN_API_KEY" ``` ## Related * [Overview](/docs/workflow/overview) — how a line flows onward * [Upload a file](/docs/guides/upload-a-file) — the three-step upload flow * [Translator](/docs/workflow/translator) — the usual next node > Onepin is a voice workflow platform that orchestrates, validates, and ships production-ready audio across 33 TTS models.