# Software

URL: /business/nouns/software · Id: `noun:software`

> Software is a Product a Customer uses through Interfaces, from a headless API to a full App.

Software is a [Product](/business/nouns/product) a [Customer](/business/nouns/customer) uses through [Interfaces](/business/nouns/interface), from a headless API to a full [App](/business/nouns/app).

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `headless` | `boolean` | No | True when it ships without screens of its own. |

<details>
<summary>Inherited from [Product](/business/nouns/product): 3 properties</summary>

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | Yes | The name of the Product. |
| `promise` | `text` | Yes | What the Customer can rely on. |
| `status` | `string` | Yes | One of `draft`, `selling` or `retired`, set by its Offers. |

</details>

## Object
```json
{
  "$id": "https://api.sb/patentpad.com/software/software_1",
  "$type": "Software",
  "name": "PatentPad",
  "promise": "A filing-ready draft within two days.",
  "status": "draft",
  "headless": true
}
```

## Relationships
- <a id="rel-packages"></a>A Software **packages** many [Systems](/business/nouns/system): Software ships [Systems](/business/nouns/system) to its [Customers](/business/nouns/customer) as one [Product](/business/nouns/product), headless or with an [App](/business/nouns/app). `packages`, inverse [`packagedAs`](/business/nouns/system#rel-packaged-as).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| <a id="create"></a>[Software.create](/business/nouns/software/create) | Creates a Software. Inherited from [Noun](/business/nouns/noun). | None. | `Software.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Software.get](/business/nouns/software/get) | Returns one Software by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Software.list](/business/nouns/software/list) | Returns Software, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Software.update](/business/nouns/software/update) | Changes the given properties of a Software. Inherited from [Noun](/business/nouns/noun). | None. | `Software.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Software.delete](/business/nouns/software/delete) | Deletes a Software; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Software.deleted` | One-way: `send`, `do` |

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Software.create` | Yes | Yes | Yes | No |
| `Software.get` | Yes | Yes | Yes | Yes |
| `Software.list` | Yes | Yes | Yes | Yes |
| `Software.update` | Yes | Yes | Yes | No |
| `Software.delete` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Add a software to ShiftNote.
```

**API**

```bash
curl -X POST https://api.sb/shiftnote.app/software \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"ShiftNote","promise":"Every open shift filled 48 hours ahead."}'
```

```json
{
  "api": "https://api.sb/shiftnote.app",
  "software": {
    "$id": "https://api.sb/shiftnote.app/software/software_1",
    "$type": "Software",
    "name": "ShiftNote",
    "promise": "Every open shift filled 48 hours ahead.",
    "status": "draft"
  },
  "action": {
    "$id": "https://api.sb/shiftnote.app/actions/action_1",
    "operation": "Software.create",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/shiftnote.app/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const software = await $.Software.create({ name: 'ShiftNote', promise: 'Every open shift filled 48 hours ahead.' })
```

**CLI**

```bash
npx startup-builder do Software.create --json '{"name":"ShiftNote","promise":"Every open shift filled 48 hours ahead."}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Software.create({ name: 'ShiftNote', promise: 'Every open shift filled 48 hours ahead.' })"
  }
}
```

## Example
An invoicing API is Software. Customers call it headless, and the same Product adds an App for bookkeepers.