---
url: https://simpledatalogs.com/docs/guide/quick-start.md
description: >-
  Create a key and send your first event and log line with curl in about two
  minutes.
---

# Quick start

In this guide you create an ingest key, send one event and one log line with curl, and watch them arrive on the dashboard. It takes about two minutes.

## Pick your stack

The fastest path is one command in your project folder. It detects the framework, shows a diff of the few lines it adds, and sends a test event:

```sh
npx simpledatalogs init
```

Or follow the page for your stack:

| Web | Mobile and games | Servers |
|---|---|---|
| [Next.js](/quickstarts/nextjs) · [React (Vite)](/quickstarts/react-vite) · [Vue and Nuxt](/quickstarts/vue-nuxt) · [SvelteKit](/quickstarts/sveltekit) · [Plain HTML](/quickstarts/html) | [React Native / Expo](/quickstarts/react-native) · [iOS and macOS](/quickstarts/ios-swift) · [Flutter](/quickstarts/flutter) · [Android](/quickstarts/android) · [Unity](/quickstarts/unity) | [Node](/quickstarts/node) · [Laravel](/quickstarts/laravel) · [Python](/quickstarts/python) · [Go](/quickstarts/go) · [Rails](/quickstarts/rails) (HTTP recipe) |

On WordPress or Shopify, install the [WordPress plugin](/integrations/wordpress) or the [Shopify app](/integrations/shopify) instead.

The rest of this page does the same with curl, so you can see exactly what goes over the wire.

## Before you begin

You need an account at [simpledatalogs.com](https://simpledatalogs.com) and a terminal with `curl`. The Free plan needs no card.

::: info Early access
While sign-up is closed, accounts are by invitation: choose **Ask for early access** on the site.
:::

## 1. Create a project and an environment

1. Sign in and choose **New project**. Name it after your app, for example `Screenshotter`.
2. Open the project and choose **New environment**, for example `production` or `development`.

Every environment starts with one deployment called `default`. You can add more later, one per build or source (see [Core concepts](/guide/concepts#deployments)).

## 2. Create an ingest key

1. Open the environment and go to the **Deployments & keys** tab.
2. Choose **Create key**, keep the `default` deployment, and pick a kind:
   * **Public** (`sdl_pub_…`) for apps and websites. It is write-only and safe to ship.
   * **Secret** (`sdl_sec_…`) for servers.
3. Choose **Create key** and copy the key.

::: warning Copy it now
Only a hash of the key is stored, so the dialog is the only time you see the full key. A new key starts working within a few seconds.
:::

## 3. Send your first event

Replace `sdl_pub_…` with your key and run:

```sh
curl -X POST https://edge.simpledatalogs.com/v1/ingest \
  -H "Authorization: Bearer sdl_pub_…" \
  -H "Content-Type: application/json" \
  -d '{"event": "hello_world", "device_id": "my-laptop"}'
```

You should see:

```json
{"accepted":"0199f0c4-…"}
```

A `202` with an `accepted` id means the event is durably stored. If you see `{"error":"invalid_key"}` instead, wait a few seconds and try again: a brand-new key takes a moment to go live.

## 4. Send a log line

Log lines don't need a special format. Send plain text, one entry per line:

```sh
curl -X POST https://edge.simpledatalogs.com/v1/ingest \
  -H "Authorization: Bearer sdl_pub_…" \
  -H "Content-Type: text/plain" \
  --data-binary $'2026-10-17 09:14:00 ERROR Payment failed for order 7\n2026-10-17 09:14:02 INFO Retried order 7'
```

Each line becomes a row with a time, a level and a message. See [Text log lines](/api/log-lines) for every format that is recognized.

## 5. Watch it arrive

Open the environment's **Dashboard**. The first event shows up live, with a "first event received" note. `hello_world` appears in the events table, `my-laptop` counts as one active device, and the two log lines are on the **Logs** tab.

## Make it retry-safe

The first example is fine for a test. In a real app, give every event an `event_id` and a `ts` when it happens, so a retried request never counts twice:

```sh
curl -X POST https://edge.simpledatalogs.com/v1/ingest \
  -H "Authorization: Bearer sdl_pub_…" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "signup",
    "event_id": "'"$(uuidgen)"'",
    "ts": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
    "device_id": "my-laptop",
    "props": {"plan": "pro", "is_trial": true}
  }'
```

Send the same request twice and the dashboard still counts one `signup`.

::: tip Let an SDK do this
The SDKs for [JavaScript](/sdks/javascript), [Swift](/sdks/swift), [Laravel](/sdks/laravel), [Flutter](/sdks/flutter), [Android](/sdks/android), [Unity](/sdks/unity), [Python](/sdks/python) and [Go](/sdks/go) set `event_id` and `ts` for you, batch, keep an outbox and retry. Or paste the setup prompt from the key dialog into your [coding agent](/agents/).
:::

## Next steps

* [Core concepts](/guide/concepts): how keys, environments and deployments fit together.
* [Events and log objects](/api/events): every field you can send.
* [Responses](/api/responses): what each status code means and what your client should do.
