Schnellstart#
Von null zum ersten erfolgreichen Aufruf.
1. Get credentials#
Anbindungs-Clients werden von uns registriert, nicht im Selbstbedienungsverfahren. Schreib an support@shiftavo.com und nenn:
für welches Unternehmen die Anbindung ist,
was sie können muss — wir erteilen nur die Scopes, die das abdeckt (siehe Scopes).
Du bekommst drei Dinge zurück:
|
z. B. |
|
einmal angezeigt, bei uns gehasht gespeichert — nicht wiederherstellbar, sichere es also sofort |
Scopes |
z. B. |
Ein Satz Zugangsdaten gehört zu genau einem Unternehmen und erreicht kein anderes, selbst wenn du mehreren angehörst.
2. Get an access token#
POST an den Token-Endpunkt des Identitätsanbieters. Die Zugangsdaten stehen im Formular-Body:
curl -X POST https://auth.shiftavo.com/identity/o/api/token \
-d grant_type=client_credentials \
-d client_id=cust-acme-integration \
-d client_secret=$CLIENT_SECRET \
-d scope=shifts.read
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 1800,
"scope": "shifts.read"
}
Wichtig
Speichere das Token zwischen und verwende es bis kurz vor seinem Ablauf. Das ist eine Anforderung, keine Optimierung — ruf den Token-Endpunkt nicht einmal pro Anfrage auf.
3. Find out which host to call#
Das Zugriffstoken ist ein JWT mit einem Claim api_base, der den Shard deines Unternehmens nennt:
{ "api_base": "https://app.shiftavo.com", "tenant_id": "0194d1c0-…", "…": "…" }
Lies den Host aus dem Token, statt ihn fest zu verdrahten — das erlaubt uns, Shards hinzuzufügen oder zu verschieben, ohne dass du etwas änderst. Dekodier die Nutzlast nur als Routing-Hinweis; dein eigenes Token musst du nicht prüfen.
4. Make a call#
curl "$API_BASE/api/public/v1/locations/?page_size=100" \
-H "Authorization: Bearer $ACCESS_TOKEN"
{
"object": "list",
"data": [
{ "object": "location", "id": "0194d1c0-…", "name": "Bar — Hamptons" }
],
"has_more": false,
"next": null
}
Kommen deine eigenen Standorte zurück, stimmen Zugangsdaten, Scopes und Unternehmensbindung.
Dasselbe in Python#
import requests
AUTH = "https://auth.shiftavo.com"
token = requests.post(
f"{AUTH}/identity/o/api/token",
data={
"grant_type": "client_credentials",
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"scope": "shifts.read",
},
timeout=30,
).json()
# `api_base` is a routing hint from the token — decode, don't verify.
import base64, json
payload = token["access_token"].split(".")[1]
api_base = json.loads(base64.urlsafe_b64decode(payload + "=" * (-len(payload) % 4)))["api_base"]
shifts = requests.get(
f"{api_base}/api/public/v1/shifts/",
headers={"Authorization": f"Bearer {token['access_token']}"},
timeout=30,
).json()
Weiter#
Authentifizierung — der Token-Ablauf in voller Länge, samt Ablaufzeit und Umgang mit
401.Konventionen — Paginierung, Fehler, Idempotenz. Lies das, bevor du einen Client schreibst.
API-Referenz — jeder Endpunkt.