# Metadata

Read TaskBot and agent details.

**API** `zw.getTaskbotInfo()`, `zw.getAgentInfo()`

```javascript
const taskbotInfo = await zw.getTaskbotInfo();
await zw.log("variables", taskbotInfo.variables);

const agent = zw.getAgentInfo();
await zw.log("agent version", agent.version);
```

***

#### At a Glance

* `zw.getAgentInfo()` \
  → returns `{ version: string }` (for example, `{ version: "1.1.72" }`).
* <mark style="color:$info;">async/sync\*</mark> \
  `await zw.getTaskbotInfo()` → returns:

  ```ts
  {
    id: number,
    name: string, // TaskBot name
    runType: "immediate" | "scheduled" | "webhook",
    currentRunResult: "success" | "warning" | "error" | "manually_stopped",
    variables: { ref_id: number, variableNames: string[] },
    tables: Array<{
      ref_id: number,
      type: "G_SHEETS" | "ZW_NATIVE",
      columnNames: string[]
    }>,
    webhookURL: string | null,
  }
  ```

\*`async` in browser, `sync` locally (see [Broken link](https://docs.zerowork.io/using-zerowork/using-building-blocks/write-javascript/broken-reference "mention")).

***

#### **Examples**

**Branch behavior by run type**

```js
const info = await zw.getTaskbotInfo();
if (info.runType === "scheduled") {
  await zw.log("Running in scheduled mode");
}
```

**Get tables by type**

```js
const info = await zw.getTaskbotInfo();
const gSheets = info.tables.filter(t => t.type === "G_SHEETS");
await zw.log("Google Sheets tables", gSheets);
```

**Add webhook URL to state and reuse later**

```js
// @zw-run-locally
import axios from "axios";

// Add TaskBot webhook to global state
const info = await zw.getTaskbotInfo();
const webhookURL = info.webhookURL;
if (webhookURL) {
  (zw.globalState.access().webhooksToTrigger ||=[]).push(webhookURL);
}

// In another TaskBot, access global state and trigger webhooks
const webhooks = zw.globalState.access().webhooksToTrigger || [];
for (const url of webhooks) {
  await axios.post(url);
}
```

***

#### Notes

* **Column/vatiables names, not values.**\
  For tables and variables, metadata returns **names** (variable names and column names). To read values, use `zw.getRef()`.
* **Async behavior.**\
  In the browser, `zw.getTaskbotInfo()` is async — use `await`. When Write JS code runs locally, `await` is optional (examples use `await` for consistency). `zw.getAgentInfo()` is sync everywhere.
