> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nohead.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get started

> Create a project, publish a record and fetch it from your code.

**1. Create an organization and a project**

Sign in to the web app at [app.nohead.io](https://app.nohead.io). The first time, it asks you to create an organization and a project. A project holds one site's or app's content.

**2. Create a collection**

Under **Collections**, choose **New collection**. Start from a template (blog posts, pages, products, team members or FAQ) or from a blank collection, and adjust the fields to your needs. [Content modelling](https://docs.nohead.io/guides/content-modelling.md) explains the field types.

**3. Add and publish a record**

Open the collection, choose **New record**, fill in its fields and choose **Create and publish** from the **Create** button's menu. Records start unpublished; only published records are visible to published-only keys.

**4. Create an API key**

Under **API keys**, choose **New API key** and give it the **Read records** scope (`records:read`). Leave **Published records only** on (the default) for a key your live site uses, so unpublished records never reach it; turn it off for a key that writes. A published-only key starts `nohead_pk_`, and any other key `nohead_sk_`. [API keys](https://docs.nohead.io/guides/api-keys.md) lists every scope.

> [!WARNING]
>
> The key is shown only once. If you lose it, create a new one and revoke the old one.

Store the key somewhere safe, for example as `NOHEAD_API_KEY` in your app's environment:

```bash theme={null}
export NOHEAD_API_KEY=nohead_pk_...
```

The SDKs read the key from `NOHEAD_API_KEY` when you don't pass one. They don't read the key that `nohead login` saves for the [CLI](https://docs.nohead.io/cli/overview.md), so even after signing in there, your app needs a key like this one.

**5. Fetch your content**

List the collection's records: a published-only key sees only the published ones. With an API key, you can use the collection's slug instead of its ID.

```bash curl theme={null}
curl "https://api.nohead.io/v1/collections/blog-posts/records" \
  -H "Authorization: Bearer $NOHEAD_API_KEY"
```

```ts TypeScript theme={null}
import { Nohead } from "@nohead/sdk"

const nohead = new Nohead() // reads NOHEAD_API_KEY
const page = await nohead.records.list("blog-posts")
```

```python Python theme={null}
from nohead import Nohead

nohead = Nohead()  # reads NOHEAD_API_KEY
page = nohead.records.list("blog-posts")
```

```ruby Ruby theme={null}
require "nohead"

nohead = Nohead::Client.new # reads NOHEAD_API_KEY
page = nohead.records.list("blog-posts")
```

The [SDKs](https://docs.nohead.io/sdks/overview.md) also page through results, retry safely and verify webhooks.

## The response

Lists return the records under `data`, with a cursor for the next page under `meta`. Each record's values are under its own `data`, keyed by field key. A record is published when it has a `published_at`:

```json theme={null}
{
  "data": [
    {
      "id": "rec_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
      "object": "record",
      "collection_id": "col_01J9ZQ3F8X5W2K7M4N6P0ATHRS",
      "collection": "blog-posts",
      "published_at": "2026-09-27T12:00:00Z",
      "revision": 2,
      "schema_version": 1,
      "history_pruned_through": null,
      "deleted_at": null,
      "purge_after": null,
      "data": {
        "title": "Hello, world",
        "summary": "Our first post."
      },
      "created_at": "2026-09-27T11:58:10Z",
      "updated_at": "2026-09-27T12:00:00Z"
    }
  ],
  "meta": { "next_cursor": null, "has_more": false }
}
```

## Next steps

* Pass `limit` (1 to 100) and `cursor` to page through long lists, and `sort` (for example `-published_at`) to order them.
* Filter on a field with `filter[<key>]=value`, for example `filter[tags]=news` (on a field with several values, it matches records whose list includes the value).
* Embed assets or related records with `expand`, for example `expand=cover_image`. Asset and rich text fields need the key's **Read assets** scope (`assets:read`) too.
* Fetch one record with `GET /v1/records/{record_id}`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.