> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://onepin.ai/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://onepin.ai/docs/_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 `<break/>` 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