Docs / Contact / getting-started/quick-start

Quick Start

Get up and running with Tendrl in just a few minutes.

Prerequisites

Step 1: Create Your First Entity

Entities represent devices, sensors, or any data source in your system.

  1. Navigate to Entities in the sidebar
  2. Click Create Entity
  3. Fill in the entity details:

When you create the entity, Contact automatically issues an API key bound to it.

The Create Entity form with Name, Role, Service, Enabled, and Metadata fields Creating an entity from the dashboard.

Step 2: Get Your API Key

Contact shows the Connection Instructions dialog as soon as the entity is created:

  1. Reveal the API Key Secret with the eye icon, or use the copy button
  2. Store it somewhere safe; it's the token you'll send as Bearer

The Connection Instructions dialog showing the API Key ID and the masked API Key Secret Connection Instructions, shown once when the entity is created.

Caution

The secret is shown once. Store it safely. If you lose it, rotate the entity's key from Access Control → API Keys.

Step 3: Send Your First Message

bash

curl -X POST https://app.tendrl.com/api/entities/message \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "msg_type": "publish",
    "data": {
      "temperature": 23.5,
      "humidity": 65
    },
    "context": {"tags": ["sensor"]}
  }'

A success returns 200 with the stored message id:

json

{"code": 200, "content": "01J8XR4M2K9P7QW3FDNVBZ0HYT"}

msg_type is required (publish, heartbeat, state_new, or state_update). context.tags is what routes the message to connectors and Strand workflows.

Step 4: View Messages

  1. Navigate to Messages in the sidebar
  2. You should see your message in the list
  3. Click on a message to view its details

If it didn't work

Match the reason in the response body against this table before anything else — the status code alone doesn't distinguish a wrong key from a wrong kind of key.

Status reason What it means
401 Access Denied The key is wrong, revoked, or the Bearer prefix is missing.
401 Invalid Authorization header format The header isn't Authorization: Bearer <key>.
401 Only entities can write messages You used an account-level API key. Messages must be sent with the key issued to the entity — the one under its Connection Instructions, not one from Access Control → API Keys.
401 Unauthorized: Missing required permission 'entity:WriteMessages' The entity's role can't publish. DefaultEntity can; a custom role may not.
400 Message type is required msg_type is missing from the body.
400 Invalid message format The JSON is malformed, or data isn't an object.
400 Message size exceeds the 5KB per message limit. Trim the payload; the cap is per message and applies on every plan.
403 Monthly data limit exceeded You've hit the plan's data cap for the billing period. See Pricing.
Tip

The most common first-run failure is the third row. Both key types are valid and both look identical, but only the entity's own key can publish on its behalf.

Next Steps

Connecting real hardware? That's the usual next step:

Building on the platform: