Quick start

The Technis API gives you programmatic access to your sites, zones, passages, devices, and the metrics they produce.

This guide walks you through your first authenticated request and the response shape you should expect. For endpoint reference and request examples, see Examples.

📘

v3 supersedes the v2 GraphQL API documented at api-docs.technis.com/v2. v3 is REST-based, scoped to a stable set of resources, and shaped so that you rarely need more than one request per task.

Before you start

You will need:

  • A Technis account with permission to manage API keys in the target organization.
  • An HTTP client. The examples below use curl, but anything that can set a header and parse JSON will work

Step 1: Create an API Key

API keys live on the organization, not on your personal user account, so any key you create can be used by your services until it is revoked.

  1. Sign in to Technis account and go to Settings > Organization page.
  2. Scroll down to the API keys section. If you do not see it, you do not have permission to manage keys — ask an admin in your organization.
  3. Click Create new key, give the key a descriptive name (for example, analytics-pipeline-prod), and confirm.
  4. Copy the generated key immediately. The secret is shown only once. If you lose it, revoke the key and create a new one.

Treat the key like a password: never commit it to source control, never paste it into a shared channel, and store it in your secrets manager of choice.

Step 2: Make your first request

Every request must include an x-api-key header containing your key. The simplest call is a GET against the list of sites you can access:

curl https://api.technis.com/v3/sites \
  -H "x-api-key: $TECHNIS_API_KEY"

A successful response looks like this:

{
  "data": [
    {
      "id": "1",
      "name": "Lausanne flagship",
      "category": "store",
      "address": {
        "street": "Avenue de la Gare 4",
        "postCode": "1005",
        "city": "Lausanne",
        "country": "Switzerland"
      },
      "timezone": "Europe/Zurich",
      "organizationId": "5",
      "archived": false,
      "createdAt": "2026-12-01T11:23:43",
      "updatedAt": "2026-12-01T11:23:43"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "limit": 25,
      "hasNext": true,
      "hasPrevious": false
    },
    "warnings": [],
    "errors": []
  }
}

If you got a 401, double-check that the x-api-key header is present and that the key has not been revoked.

Step 3: Understand response envelope

Every endpoint in the API responds with same top-level shape:

{
  "data":  {/* what you asked for */},
  "meta":  {/* everything that describes data or errors and warnings */}
}

Meta fields are also worth keeping around for support tickets:

  • meta.requestId: Unique identifier for this request. Include it when you contact support.

Error reporting

Errors that the server can recover from (for example, an invalid pagination value) are returned inside meta.errors with an HTTP status that matches the most severe error. Each entry has a stable machine-readable code, a human-readable message, and optionally a details object listing the offending fields:

{
  "meta": {
    "errors": [
      {
        "code": "INVALID_PAGINATION_PARAMS",
        "message": "Pagination params are off the allowed limits",
        "details": {
          "limit": "must be a number less than or equal to 100",
          "offset": "must be a number greater than 0"
        }
      }
    ]
  }
}

Switch on code rather than parsing the message: codes are part of the contract, messages are not.

Troubleshooting

ErrorLikely causeFix
401 UnauthorizedMissing, malformed, or revoked keyRe-check the x-api-key header. Create a new key if revoked.
403 with FORBIDDEN_ACCESS in meta.errorsThe key cannot read this resourceUse a key from an org that owns the site, or update permissions.
Live stream closes immediatelyMissing Accept: text/event-stream header, or proxy buffering responsesSet the header and disable response buffering on intermediaries.
No data returnedInvalid from or to formatsFormat date and time strings using ISO 8601.
No data returnedData not yet availableData is delayed up to a minute, asking for data with from: 1 minute ago will always respond with no data.


What’s Next