# Publishing and addresses

With **Publishing** switched on for a type, new records start as drafts: nothing reaches your site or the [Objects API](/api/objects/index) until you publish them. With it off, a record is live as soon as you create it. You can also give a type **addresses**, so every record has a readable path such as `/services/kitchen-fitting`.

## Turn publishing on or off for a type

New types you create in the dashboard have **Publishing** on. Types that existed before keep it off until you switch it on.

1. Open the type builder (the gear icon on **Content** → **Objects**, or **Type** on the records list).
2. In the **Publishing and addresses** card, switch **Publishing** on or off ("Records of this type can be published to your public site and API.").
3. Click **Save**.

Switching it on leaves existing records live, with their creation date as **Published at**; only records created from then on start as drafts. You can only switch it off once the type has no drafts: while it has any, **Save** shows "Publish or delete the drafts of this type first." Without Publishing there is no **Publish** button, so publish or delete the drafts, then switch it off.

## Draft, Published and Scheduled

A publishable type adds a **Status** column to the records list, and the record page shows the same badge next to its title:

| Badge | Meaning | On your site and API |
| --- | --- | --- |
| **Draft** | Not published. New records start here. | Hidden. |
| **Published** | Live, with a **Published at** date that is now or in the past. | Visible. |
| **Scheduled** | Published with a **Published at** date in the future. | Hidden until that moment, then it appears on its own. |

The records list also gets a **Status** filter with **Draft** and **Published** (a scheduled record counts as published there).

## Publish, unpublish and reschedule

On a record of a publishable type, the **Published at** card sits above the form. It holds a date and time field and the hint "Leave empty to keep the previous publish date, or publish now if there is none. A future date schedules the record."

- **Publish** (shown on a draft): publishes the record. With the field empty it goes live now (or on the date it was published at before); with a future date it becomes **Scheduled**.
- **Update date** (shown on a published or scheduled record once you change the field): moves the **Published at** date, for example to reschedule a launch.
- **Unpublish**: sets the record back to **Draft**. It disappears from your site and API at once. Its addresses are kept.

Editing a published record does not unpublish it, and your changes are live as soon as you click **Save**. If you need to work on a record privately, unpublish it first.

If the type has addresses, a record needs an address in the default language before it can be published. Publish refuses with "Add an address for {language} before publishing." and shows the message above the **Addresses** card.

## Addresses

An address is the last part of a record's path. The type decides how addresses are built; the record holds one per language.

In the **Publishing and addresses** card of the type builder:

- **Address (slug) source** picks the text property the address comes from ("Each record gets its address from this text property."). **None (no addresses)** switches addresses off. Only text properties are offered.
- **Address prefix per language** appears once a source is chosen, with one field per content language. A prefix is empty, or starts with a slash and has no trailing slash, for example `/services`. The full path of a record is its prefix plus `/` plus its address.
- A prefix can only be used by one type per language. If another type already uses it, saving fails with "Another type already uses this address prefix.".
- If no content language is set, the card says to set one under **Settings** → **Business**. See [Translations](/docs/objects/translations).

On a record, the **Addresses** card lists one row per content language, showing the full path (prefix plus address) or "No address yet". Click **Edit** to type a new address and **Save**. The change applies immediately.

- A new record gets its addresses automatically from the source property, one per language (a language without its own text falls back to the default language's). Addresses are made of lowercase letters, digits and hyphens. When an address is taken in that language, a number is added (`kitchen-fitting-2`).
- Editing the title later does not change the address. Your links stay put unless you edit the address yourself.
- Two records of one type cannot share an address in a language: you get "This address is already used.". An address must be lowercase letters, digits and hyphens ("Use lowercase letters, digits and hyphens.").

### Redirects when an address changes

When you change an address and the language has a prefix, Borkol records a permanent redirect from the old path to the new one, so links and search results keep working. Storefronts read them with the [redirects endpoint](/api/getting-started/seo). A language without a prefix gets no redirect.

## What your storefront sees

Only published records that are live are served, and they carry their `published_at` and, for types with addresses, their `slugs`. Drafts and scheduled records answer "not found". See [Records](/api/objects/records) for the exact shape and [Webhooks](/api/webhooks/index) for the `object_record.*` events that tell your site when to update.
