Leitfaden zur REST API

Mit der NowMetrix REST API verbinden

Erstellen Sie einen API-Schlüssel, senden Sie ihn sicher mit jeder Anfrage und überprüfen Sie die Verbindung anhand einer kleinen Antwort mit Kontokontext, bevor Sie Analysedaten abrufen.

1. API-Schlüssel erstellen und schützen

Melden Sie sich bei NowMetrix an, öffnen Sie Einstellungen → API und erstellen Sie für die Integration einen beschrifteten API-Schlüssel, zum Beispiel Internes Dashboard oder Google Sheets. Sie können bis zu 10 aktive Schlüssel verwalten. Kopieren Sie einen neuen oder neu erstellten Schlüssel sofort: Der vollständige Wert wird nur einmal angezeigt.

Behandeln Sie den Schlüssel wie ein Passwort. Speichern Sie ihn in einer serverseitigen Umgebungsvariablen oder einem Secret Manager, übernehmen Sie ihn niemals in die Versionsverwaltung und legen Sie ihn niemals in browserseitigem JavaScript offen.
NOWMETRIX_API_KEY=nm_YOUR_KEY

Das Umbenennen eines Schlüssels ändert seinen Wert nicht. Das Ersetzen oder Widerrufen eines Schlüssels betrifft nur den jeweils ausgewählten Schlüssel. Alle Schlüssel verwenden die Berechtigungen ihres NowMetrix-Benutzers und teilen sich das Rate-Limit des jeweiligen trackers.

2. Schlüssel mit jeder Anfrage senden

Die REST API ist zustandslos: Es gibt keine separate Anmeldeanfrage und keine dauerhafte Sitzung. Senden Sie den API-Schlüssel bei jeder HTTPS-Anfrage als Bearer-Token.

GET https://api.nowmetrix.com/api/me
Authorization: Bearer nm_YOUR_KEY
Accept: application/json
  • Basis-URL: https://api.nowmetrix.com
  • Authentifizierung: Authorization: Bearer nm_YOUR_KEY
  • Verbindungstest: GET /api/me erfordert keinen Tracker-Parameter.
  • Zeitüberschreitungen: Legen Sie in jedem Client ein endliches Verbindungs- und Antwort-Timeout fest.

3. Verbindung mit cURL überprüfen

Verwenden Sie cURL für die schnellste Verbindungsprüfung in einem Terminal.

API_KEY="nm_YOUR_KEY"

curl --fail-with-body --silent --show-error \
  --header "Authorization: Bearer ${API_KEY}" \
  --header "Accept: application/json" \
  "https://api.nowmetrix.com/api/me"

Eine erfolgreiche Anfrage liefert HTTP 200 sowie die für den API-Schlüssel verfügbaren Tracker:

{
  "authenticated": true,
  "current_tracker": "TRACKER_ID",
  "trackers": [
    {
      "tracker": "TRACKER_ID",
      "host": "example-media.test"
    },
    {
      "tracker": "SECOND_TRACKER_ID",
      "host": "example-studio.test"
    }
  ]
}

PHP 8+

Verwenden Sie die cURL-Erweiterung von PHP und speichern Sie den API-Schlüssel in einer Umgebungsvariablen.

<?php

$apiKey = getenv('NOWMETRIX_API_KEY');
if (!is_string($apiKey) || $apiKey === '') {
    throw new RuntimeException('NOWMETRIX_API_KEY is not set.');
}

$curl = curl_init('https://api.nowmetrix.com/api/me');
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
        'Accept: application/json',
    ],
    CURLOPT_TIMEOUT => 10,
]);

$body = curl_exec($curl);
if ($body === false) {
    $error = curl_error($curl);
    curl_close($curl);
    throw new RuntimeException($error);
}

$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);

if ($status < 200 || $status >= 300) {
    throw new RuntimeException("NowMetrix API returned HTTP {$status}: {$body}");
}

$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($data);

JavaScript (Node.js 18+)

Verwenden Sie die integrierte fetch API auf dem Server. Legen Sie den API-Schlüssel nicht in browserseitigem JavaScript offen.

const apiKey = process.env.NOWMETRIX_API_KEY;
if (!apiKey) throw new Error('NOWMETRIX_API_KEY is not set.');

async function main() {
  const response = await fetch('https://api.nowmetrix.com/api/me', {
    headers: {
      Authorization: `Bearer ${apiKey}`,
      Accept: 'application/json',
    },
    signal: AbortSignal.timeout(10_000),
  });

  const body = await response.text();
  if (!response.ok) {
    throw new Error(`NowMetrix API returned HTTP ${response.status}: ${body}`);
  }

  console.log(JSON.parse(body));
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Python 3

Das Paket requests bietet einen kompakten Client mit expliziter Behandlung von Timeout und Status. Installieren Sie es mit python -m pip install requests.

import os
import requests

api_key = os.environ["NOWMETRIX_API_KEY"]
response = requests.get(
    "https://api.nowmetrix.com/api/me",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Accept": "application/json",
    },
    timeout=10,
)
response.raise_for_status()
print(response.json())

Java 11+

Der standardmässige HttpClient von Java reicht für die authentifizierte Anfrage aus.

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class NowMetrixExample {
    public static void main(String[] args) throws Exception {
        String apiKey = System.getenv("NOWMETRIX_API_KEY");
        if (apiKey == null || apiKey.isBlank()) {
            throw new IllegalStateException("NOWMETRIX_API_KEY is not set.");
        }

        HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .build();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.nowmetrix.com/api/me"))
            .timeout(Duration.ofSeconds(10))
            .header("Authorization", "Bearer " + apiKey)
            .header("Accept", "application/json")
            .GET()
            .build();

        HttpResponse<String> response = client.send(
            request, HttpResponse.BodyHandlers.ofString()
        );
        if (response.statusCode() < 200 || response.statusCode() >= 300) {
            throw new IllegalStateException(
                "NowMetrix API returned HTTP " + response.statusCode() + ": " + response.body()
            );
        }

        System.out.println(response.body());
    }
}

C# (.NET 6+)

Verwenden Sie HttpClient mit einem Bearer-Authentifizierungsheader und einem Timeout auf Anwendungsebene.

using System.Net.Http.Headers;

var apiKey = Environment.GetEnvironmentVariable("NOWMETRIX_API_KEY")
    ?? throw new InvalidOperationException("NOWMETRIX_API_KEY is not set.");

using var client = new HttpClient
{
    BaseAddress = new Uri("https://api.nowmetrix.com"),
    Timeout = TimeSpan.FromSeconds(10),
};
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", apiKey);
client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json")
);

using var response = await client.GetAsync("/api/me");
var body = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
    throw new HttpRequestException(
        $"NowMetrix API returned HTTP {(int)response.StatusCode}: {body}"
    );
}
Console.WriteLine(body);

Go 1.20+

Verwenden Sie den standardmässigen net/http-Client und dekodieren Sie die JSON-Antwort in eine generische Struktur oder in Ihre eigenen Typen.

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

func main() {
	apiKey := os.Getenv("NOWMETRIX_API_KEY")
	if apiKey == "" {
		panic("NOWMETRIX_API_KEY is not set")
	}

	request, err := http.NewRequest(http.MethodGet, "https://api.nowmetrix.com/api/me", nil)
	if err != nil {
		panic(err)
	}
	request.Header.Set("Authorization", "Bearer "+apiKey)
	request.Header.Set("Accept", "application/json")

	client := &http.Client{Timeout: 10 * time.Second}
	response, err := client.Do(request)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()

	if response.StatusCode < 200 || response.StatusCode >= 300 {
		panic("NowMetrix API returned " + response.Status)
	}

	var data map[string]any
	if err := json.NewDecoder(response.Body).Decode(&data); err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", data)
}

Ruby 3+

Mit der Standardbibliothek von Ruby lässt sich die Anfrage ohne zusätzliches HTTP-Paket senden.

require 'json'
require 'net/http'

api_key = ENV.fetch('NOWMETRIX_API_KEY')
uri = URI('https://api.nowmetrix.com/api/me')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = "Bearer #{api_key}"
request['Accept'] = 'application/json'

response = Net::HTTP.start(
  uri.hostname,
  uri.port,
  use_ssl: true,
  open_timeout: 10,
  read_timeout: 10
) { |http| http.request(request) }

unless response.is_a?(Net::HTTPSuccess)
  raise "NowMetrix API returned HTTP #{response.code}: #{response.body}"
end

puts JSON.pretty_generate(JSON.parse(response.body))

Authentifizierungs- und Transportfehler behandeln

Prüfen Sie den HTTP-Status, bevor Sie eine erfolgreiche Antwort dekodieren. Fehlerantworten verwenden eine stabile JSON-Struktur mit einem maschinenlesbaren error.code.

  • 401 missing_token: Der Authorization-Header fehlt.
  • 401 invalid_token: Der Schlüssel ist ungültig, widerrufen oder wurde ersetzt.
  • 403 site_not_authorized: Der Schlüssel darf nicht auf den angeforderten Tracker zugreifen.
  • 429 rate_limit_exceeded: Warten Sie vor einem erneuten Versuch das Retry-After-Intervall ab.
  • 503: Wiederholen Sie vorübergehende Backend-Fehler mit begrenztem exponentiellem Backoff.
{
  "error": {
    "code": "invalid_token",
    "message": "Bearer token is invalid or revoked."
  }
}

Einen Tracker-spezifischen Endpoint verwenden

Lesen Sie aus der Antwort von current_tracker den Wert von trackers[].tracker oder /api/me aus und übergeben Sie diese Tracker-ID anschliessend als site-Query-Parameter.

GET https://api.nowmetrix.com/v1/realtime?site=TRACKER_ID
Authorization: Bearer nm_YOUR_KEY
Accept: application/json