> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.laposta.org/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.laposta.org/_mcp/server.

# Geschiedenis van een relatie

GET https://api.laposta.nl/v2/member/{member_id}/history

Geeft de gebeurtenissen van een relatie terug: aanmeldingen, wijzigingen, afmeldingen en wat er met verzonden campagnes gebeurde. Dezelfde geschiedenis zie je in de applicatie bij de details van een relatie. Gebruik `cursor` uit `pagination` om de volgende pagina op te halen.The full event history of a subscriber, similar to the details shown in the application.Gibt die Ereignisse eines Abonnenten zurück: Anmeldungen, Änderungen, Abmeldungen und was mit versendeten Kampagnen passiert ist. Denselben Verlauf siehst du in der Anwendung bei den Details eines Abonnenten. Nutze `cursor` aus `pagination`, um die nächste Seite abzurufen.Devuelve los eventos de un contacto: registros, modificaciones, bajas y lo que ha pasado con las campañas enviadas. Ese mismo historial lo ves en la aplicación en los detalles de un contacto. Usa `cursor` de `pagination` para consultar la página siguiente.

Reference: https://docs.laposta.org/relaties/relatiegeschiedenis-opvragen

## Authentication

- `Authorization` header (basic auth, required) — Vul je API-sleutel in bij `api_key` en laat `leave_empty` leeg. De API gebruikt basic auth, waarbij je sleutel de plaats van de gebruikersnaam inneemt. In curl schrijf je dat als `-u JOUW_SLEUTEL:`, met een dubbele punt en niets erachter.Enter your API key at `api_key` and leave `leave_empty` empty. The API uses basic auth, with your key in place of the username. In curl that reads `-u YOUR_KEY:`, with a colon and nothing after it.Trage deinen API-Schlüssel bei `api_key` ein und lass `leave_empty` leer. Die API nutzt Basic Auth, wobei dein Schlüssel an die Stelle des Benutzernamens tritt. In curl schreibst du das als `-u DEIN_SCHLUESSEL:`, mit einem Doppelpunkt und nichts dahinter.Introduce tu clave API en `api_key` y deja `leave_empty` vacío. La API usa basic auth, con tu clave en lugar del nombre de usuario. En curl se escribe como `-u TU_CLAVE:`, con dos puntos y nada después.

## Request

### Path parameters

- `member_id` (string, required) — Het id van de relatie, of gewoon haar e-mailadres. Allebei werken.The id of the subscriber, or simply their email address. Both work.Die ID des Abonnenten oder einfach seine E-Mail-Adresse. Beides funktioniert.El id del contacto, o simplemente su dirección de correo. Ambos funcionan.

### Query parameters

- `list_id` (string, required) — Het id van de lijst. Dat vind je in het antwoord van [Alle lijsten opvragen](/lijsten/alle-lijsten-opvragen), en in de applicatie in de URL van de lijst.The id of the list. You find it in the response of [Get all lists](/lijsten/alle-lijsten-opvragen), and in the application in the URL of the list.Die ID der Liste. Du findest sie in der Antwort von [Alle Listen abrufen](/lijsten/alle-lijsten-opvragen) und in der Anwendung in der URL der Liste.El id de la lista. Lo encuentras en la respuesta de [Obtener todas las listas](/lijsten/alle-lijsten-opvragen) y en la aplicación, en la URL de la lista.
- `campaign_id` (string, optional) — Het id van de campagne. Dat vind je in het antwoord van [Alle campagnes opvragen](/campagnes/alle-campagnes-opvragen).The id of the campaign. You find it in the response of [Get all campaigns](/campagnes/alle-campagnes-opvragen).Die ID der Kampagne. Du findest sie in der Antwort von [Alle Kampagnen abrufen](/campagnes/alle-campagnes-opvragen).El id de la campaña. Lo encuentras en la respuesta de [Obtener todas las campañas](/campagnes/alle-campagnes-opvragen).
- `event_date_from` (string, optional) — Geef alleen events vanaf dit moment terug, inclusief. Gebruik het gewone formaat of ISO-formaat zoals hierboven beschreven.Only return events from this date and time, inclusive. Use the regular format or ISO format described above.Gib nur Events ab diesem Zeitpunkt zurück, inklusive. Verwende das normale Format oder das ISO-Format wie oben beschrieben.Devuelve solo los eventos a partir de este momento, incluido. Usa el formato normal o el formato ISO descrito arriba.
- `event_date_to` (string, optional) — Geef alleen events voor dit moment terug, exclusief. Gebruik het gewone formaat of ISO-formaat zoals hierboven beschreven.Only return events before this date and time, exclusive. Use the regular format or ISO format described above.Gib nur Events vor diesem Zeitpunkt zurück, exklusive. Verwende das normale Format oder das ISO-Format wie oben beschrieben.Devuelve solo los eventos anteriores a este momento, excluido. Usa el formato normal o el formato ISO descrito arriba.
- `limit` (integer, optional) — Maximum aantal history-items dat wordt teruggegeven. Standaard 100, maximaal 1000.Maximum number of history items to return. Default is 100, maximum is 1000Maximale Anzahl an history-Items, die zurückgegeben werden. Standard 100, maximal 1000.Número máximo de elementos de historial que se devuelven. Por defecto 100, máximo 1000.
- `cursor` (string, optional) — Cursor uit pagination.next_cursor om de volgende pagina op te vragen. Interpreteer deze waarde niet zelf; stuur hem ongewijzigd terug.Cursor from pagination.next_cursor to request the next page. Do not interpret this value yourself; send it back unchanged.Cursor aus pagination.next_cursor, um die nächste Seite abzurufen. Interpretiere diesen Wert nicht selbst; schicke ihn unverändert zurück.Cursor de pagination.next_cursor para consultar la página siguiente. No interpretes tú mismo este valor; devuélvelo sin cambios.
- `order_by` (string, optional) — Veld waarop gesorteerd wordt. Op dit moment wordt alleen event_date ondersteund.Field to order by. Currently only event_date is supportedFeld, nach dem sortiert wird. Zurzeit wird nur event_date unterstützt.Campo por el que se ordena. Por ahora solo se admite event_date.
- `order` (enum, optional) — Sorteerrichting: desc of asc. Standaard desc.Sort direction: desc or asc. Default is descSortierrichtung: desc oder asc. Standard desc.Dirección de ordenación: desc o asc. Por defecto desc.
  - Allowed values: `desc`, `asc`

## Response

### 200

De aanvraag is gelukt.The request succeeded.Die Anfrage war erfolgreich.La solicitud se ha realizado correctamente.

- `pagination` (HistoryPagination, optional)
- `order` (HistoryOrder, optional)
- `filters` (HistoryFilters, optional)
- `data` (list of HistoryDataItems, optional)

## Errors

### 400 Bad Request Error

De aanvraag klopt niet. Het antwoord bevat een `type`, een `message` en meestal een `code` en de `parameter` die de fout veroorzaakte. Een object dat niet bestaat valt ook hieronder, met code 203.The request is not valid. The response contains a `type`, a `message` and usually a `code` plus the `parameter` that caused it. An object that does not exist also falls under this, with code 203.Die Anfrage stimmt nicht. Die Antwort enthält einen `type`, eine `message` und meistens einen `code` und den `parameter`, der den Fehler verursacht hat. Ein Objekt, das nicht existiert, fällt ebenfalls hierunter, mit Code 203.La solicitud no es correcta. La respuesta contiene un `type`, un `message` y normalmente un `code` y el `parameter` que ha causado el error. Un objeto que no existe también entra aquí, con el código 203.

- `error` (ErrorError, optional)

### 401 Unauthorized Error

Er is geen geldige API-sleutel meegestuurd, of dit endpoint staat niet aan voor dit account.No valid API key was provided, or this endpoint is not enabled for this account.Es wurde kein gültiger API-Schlüssel mitgeschickt, oder dieser Endpunkt ist für dieses Konto nicht aktiv.No se ha enviado una clave API válida, o este endpoint no está activado para esta cuenta.

- `error` (ErrorError, optional)

### 429 Too Many Requests Error

Je hebt te veel aanvragen in een minuut gedaan. De header `Retry-After` vertelt na hoeveel seconden het weer mag.Too many requests in one minute. The `Retry-After` header tells you how many seconds to wait.Du hast zu viele Anfragen in einer Minute gestellt. Der Header `Retry-After` sagt, nach wie vielen Sekunden es wieder erlaubt ist.Has hecho demasiadas solicitudes en un minuto. La cabecera `Retry-After` indica después de cuántos segundos puedes volver a intentarlo.

- `error` (ErrorError, optional)

## Types

### HistoryPagination

- `limit` (integer, optional)
- `has_more` (boolean, optional)
- `next_cursor` (string, optional, nullable)

### HistoryOrder

- `order_by` (string, optional)
- `order` (enum, optional)
  - Allowed values: `desc`, `asc`

### HistoryFilters

- `timezone` (string, optional)
- `campaign_id` (string, optional, nullable)
- `event_date_from` (string, optional, nullable)
- `event_date_from_iso` (string, optional, nullable)
- `event_date_to` (string, optional, nullable)
- `event_date_to_iso` (string, optional, nullable)

### HistoryDataItems

- `event` (HistoryDataItemsEvent, optional)

### ErrorError

- `type` (enum, required)
  - Allowed values: `invalid_request`, `invalid_input`, `internal`
- `message` (string, required)
- `code` (integer, optional)
- `parameter` (string, optional)

### HistoryDataItemsEvent

- `type` (string, optional)
- `timezone` (string, optional)
- `event_date` (string, optional)
- `event_date_iso` (string, optional)
- `campaign` (HistoryDataItemsEventCampaign, optional, nullable)
- `details` (HistoryDataItemsEventDetails, optional)

### HistoryDataItemsEventCampaign

### HistoryDataItemsEventDetails

## Examples

**Response**

```json
{
  "pagination": {
    "limit": 100,
    "has_more": true,
    "next_cursor": "string"
  },
  "order": {
    "order_by": "event_date",
    "order": "desc"
  },
  "filters": {
    "timezone": "Europe/Amsterdam",
    "campaign_id": "string",
    "event_date_from": "string",
    "event_date_from_iso": "string",
    "event_date_to": "string",
    "event_date_to_iso": "string"
  },
  "data": [
    {
      "event": {
        "type": "unsubscribed",
        "timezone": "string",
        "event_date": "2026-05-18 14:30:00",
        "event_date_iso": "2026-05-18T14:30:00+02:00",
        "campaign": {},
        "details": {}
      }
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.laposta.nl/v2/member/ZKfjhLJHfl/history"

querystring = {"campaign_id":"njhgaf61ye","cursor":"opaque_cursor_value","event_date_from":"2026-04-01 00:00:00","event_date_to":"2026-05-01 00:00:00","limit":"100","list_id":"BaImMu3JZA","order":"desc","order_by":"event_date"}

response = requests.get(url, params=querystring, auth=("<api_key>", "<leave_empty>"))

print(response.json())
```

```javascript
const url = 'https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date';
const credentials = btoa("<api_key>:<leave_empty>");

const options = {method: 'GET', headers: {Authorization: `Basic ${credentials}`}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date"

	req, _ := http.NewRequest("GET", url, nil)

	req.SetBasicAuth("<api_key>", "<leave_empty>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request.basic_auth("<api_key>", "<leave_empty>")

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date")
  .basicAuth("<api_key>", "<leave_empty>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date', [
  'headers' => [
  ],
    'auth' => ['<api_key>', '<leave_empty>'],
]);

echo $response->getBody();
```

```csharp
using RestSharp;
using RestSharp.Authenticators;

var client = new RestClient("https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date");
client.Authenticator = new HttpBasicAuthenticator("<api_key>", "<leave_empty>");
var request = new RestRequest(Method.GET);

IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let credentials = Data("<api_key>:<leave_empty>".utf8).base64EncodedString()

let headers = ["Authorization": "Basic \(credentials)"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.laposta.nl/v2/member/ZKfjhLJHfl/history?campaign_id=njhgaf61ye&cursor=opaque_cursor_value&event_date_from=2026-04-01+00%3A00%3A00&event_date_to=2026-05-01+00%3A00%3A00&limit=100&list_id=BaImMu3JZA&order=desc&order_by=event_date")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```