> ## Documentation Index
> Fetch the complete documentation index at: https://developers.marko.fr/llms.txt
> Use this file to discover all available pages before exploring further.

# Premier appel

> Créez un bearer puis listez les opérations accessibles à votre clé MARKO.

## Prérequis

Un administrateur technique de votre entité crée une clé dans la section **API** de MARKO et vous transmet son `key_id` et son secret par un canal sécurisé. La clé doit inclure le scope `operations:read` pour l'exemple ci-dessous. Conservez le secret uniquement côté serveur.

Définissez `MARKO_KEY_ID` et `MARKO_API_SECRET` dans l'environnement de votre processus. Pour une clé de préproduction, définissez également `MARKO_API_BASE_URL=https://partner-api-preprod.marko.fr/v1`.

## Choisir votre langage

Les [programmes Python, Node.js et PHP](/code-examples) sont téléchargeables et s'exécutent sans dépendance supplémentaire. Ils prennent en charge l'échange signé, la conservation du bearer et les erreurs JSON.

L'exemple Python ci-dessous montre l'échange directement, sans client auxiliaire.

## Échanger la clé et appeler l'API

L'exemple utilise seulement la bibliothèque standard Python. Il crée un nonce unique, signe le message canonique, récupère un bearer court, puis lit une page d'opérations.

```python theme={null}
import hashlib
import hmac
import json
import os
import secrets
import time
import urllib.request

base_url = os.getenv("MARKO_API_BASE_URL", "https://partner-api.marko.fr/v1").rstrip("/")
key_id = os.environ["MARKO_KEY_ID"]
secret = os.environ["MARKO_API_SECRET"]
timestamp = int(time.time())
nonce = secrets.token_urlsafe(24)
message = f"MARKO-EXTERNAL-API-TOKEN-V1\n{key_id}\n{timestamp}\n{nonce}"
signature = hmac.new(secret.encode(), message.encode(), hashlib.sha256).hexdigest()

payload = json.dumps({
    "key_id": key_id,
    "timestamp": timestamp,
    "nonce": nonce,
    "signature": signature,
}).encode()
token_request = urllib.request.Request(
    f"{base_url}/auth/token",
    data=payload,
    headers={"Content-Type": "application/json"},
    method="POST",
)
with urllib.request.urlopen(token_request, timeout=30) as response:
    access_token = json.load(response)["access_token"]

operations_request = urllib.request.Request(
    f"{base_url}/operations?limit=1",
    headers={"Authorization": f"Bearer {access_token}"},
)
with urllib.request.urlopen(operations_request, timeout=30) as response:
    print(json.dumps(json.load(response), indent=2, ensure_ascii=False))
```

Une réponse `403` sur le second appel indique notamment que le scope ou la route n'est pas autorisé pour cette clé. Consultez [les erreurs et les reprises](/errors-and-retries) et la référence de l'endpoint concerné.

Pour une écriture, suivre [CRM vers MARKO](/tutorials/crm-sync). Pour comprendre les identifiants et les rattachements avant d'intégrer plusieurs familles, lire [Comprendre les ressources](/concepts).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.