---
updatedAt: 2026-08-27T09:05:50.000Z
agentTools:
  projectIndex: https://docs.soulclick.ch/llms.txt
---

# Spenden-Konfiguration eines Kampagnen-Links abrufen

Öffentliche, nur lesende Spenden-Konfiguration eines Kampagnen-Links: die hinterlegten Beträge, Spendenarten, Intervalle, Zahlungsarten und die Checkout-URL pro publizierter Sprache.

Gedacht für selbst gebaute Spenden-Teaser, damit der Kampagnen-Link die einzige Quelle der Beträge bleibt. Die Auswahl der besuchenden Person wird über die GET-Parameter `amount`, `payment_type` und `interval` einer `checkout_urls`-Adresse an den Checkout übergeben.

## Zugriff

Keine Authentifizierung (die Daten stehen ohnehin öffentlich auf der Checkout-Seite), CORS für alle Herkünfte, 5 Minuten Cache und maximal 60 Anfragen pro Minute und IP.

## Beträge bei Dauerspenden

`recurring.amounts` gelten für das **kürzeste Intervall in `recurring.intervals`**, nicht pro Monat. Der Checkout rechnet längere entsprechend hoch: bei `[3, 12]` sind 50 also 50 pro Quartal und 200 pro Jahr. Ein Teaser muss gleich hochrechnen, wenn er die Intervalle anzeigt, und den nicht hochgerechneten Betrag als `amount` übergeben.

# OpenAPI definition

```json
{
  "openapi": "3.0.3",
  "info": {
    "title": "Soulclick API v2",
    "version": "v2",
    "description": "## Soulclick API\n\nDie öffentliche API einer Soulclick-Plattform: Spenden- und Kontaktdaten für Drittsysteme sowie die\nSpenden-Konfiguration von Kampagnen-Links für selbst gebaute Spenden-Teaser.\n\n**Dieses Dokument beschreibt `/api/v2/`** und listet genau die Felder auf, die diese Version\nzurückgibt. Die Versionsauswahl oben auf `/api/swagger/` wechselt zwischen den Dokumenten.\n\n### API-Root\n\nAlle öffentlichen Endpunkte liegen unter einem gemeinsamen, versionierten Root und sind nach Bereich\ngruppiert:\n\n- `/api/v2/crm/*` – Spenden- und Kontaktdaten (Authentifizierung erforderlich)\n- `/api/v2/campaign-links/<id>/config/` – öffentliche Spenden-Konfiguration eines Kampagnen-Links\n\nDie CRM-Endpunkte sind weiterhin auch unter ihrem früheren Prefix `/crm-api/*` erreichbar, das genau\nwie bisher antwortet – `v1`-Payloads – und für laufende Integrationen bestehen bleibt. Neue\nIntegrationen verwenden die neuste Version.\n\n### Authentifizierung\n\nDie CRM-Endpunkte unterstützen zwei Methoden:\n\n1. **JWT Bearer Token**\n   - Token über `/authentication/create` beziehen\n   - Header: `Authorization: Bearer <token>`\n\n2. **HTTP Basic Auth**\n   - Header: `Authorization: Basic <base64(benutzername:passwort)>`\n   - Praktisch für einfache Integrationen und externe Anbieter\n\nBeide setzen ein Konto mit Admin-Rechten voraus. Die Konfiguration eines Kampagnen-Links ist\nöffentlich und benötigt keine Zugangsdaten.\n\n### Umgebungen\n\nDie CRM-Endpunkte lesen aus zwei Umgebungen:\n- `TEST` – Testdaten\n- `PRODUCTION` – echte Daten\n\n### Seitenweises Lesen\n\n`next` und `previous` verweisen auf dasselbe Prefix wie die Anfrage: ein Aufruf von\n`/api/v2/crm/contacts/` erhält wieder `/api/v2/crm/contacts/`-Links zurück, ein Aufruf\nüber das alte Prefix entsprechend alte Links.\n\n### Versionierung und Kompatibilität\n\nDie Version steht im Pfad. Jede Version bleibt verfügbar und antwortet weiterhin genau so wie zum\nZeitpunkt der Integration: ein später eingeführtes Feld kommt nicht mehr dazu.\n\n| Version | Root | Eingeführt |\n|:---|:---|:---|\n| `v1` | `/api/v1/` | Die ursprüngliche Antwort. Das liefert auch `/crm-api/*`. |\n| `v2` | `/api/v2/` | `custom_fields`: die Antworten der spendenden Person auf die eigenen Checkout-Felder der Plattform, am Kontakt einer Spende. |\n| `v2.1` | `/api/v2.1/` | `checkout` an jedem Spendeneintrag und `positions` an jeder Spende eines Kontakts: ein Multi-Checkout ist ein Eintrag mit allen Positionen. Jeder Betrag ist, was bezahlt wurde, inklusive der Gebühren, die die spendende Person übernommen hat, in der Währung der Spende. Zeitangaben stehen in UTC mit `Z`. |\n\nEin Wechsel auf eine höhere Version heisst, einen anderen Root aufzurufen; an der Anfrage ändert\nsich sonst nichts, und Endpunkte, Parameter und Authentifizierung sind über alle Versionen gleich.\n\nEine Integration **muss** trotzdem:\n- unbekannte JSON-Felder ignorieren statt die Antwort abzulehnen\n- sich nicht auf die Reihenfolge der Felder verlassen\n- nicht davon ausgehen, dass die Feldliste abgeschlossen ist\n\nManche Änderungen lassen sich nicht über eine Version zurückhalten – ein neuer Enum-Wert in einem als\nerweiterbar dokumentierten Feld oder ein neuer Endpunkt – und können jederzeit erscheinen. Ein\n**Breaking Change** (ein Feld entfernen oder umbenennen, den Typ eines Feldes ändern, ein Feld\nerforderlich oder optional machen, die Authentifizierung ändern) kommt in die nächste Version und\nwird vorab über den vereinbarten Support-Kanal angekündigt und abgestimmt."
  },
  "paths": {
    "/api/v2/campaign-links/{campaign_link_id}/config/": {
      "get": {
        "operationId": "campaign_link_config_retrieve",
        "summary": "Spenden-Konfiguration eines Kampagnen-Links abrufen",
        "description": "Öffentliche, nur lesende Spenden-Konfiguration eines Kampagnen-Links: die hinterlegten Beträge, Spendenarten, Intervalle, Zahlungsarten und die Checkout-URL pro publizierter Sprache.\n\nGedacht für selbst gebaute Spenden-Teaser, damit der Kampagnen-Link die einzige Quelle der Beträge bleibt. Die Auswahl der besuchenden Person wird über die GET-Parameter `amount`, `payment_type` und `interval` einer `checkout_urls`-Adresse an den Checkout übergeben.\n\n## Zugriff\n\nKeine Authentifizierung (die Daten stehen ohnehin öffentlich auf der Checkout-Seite), CORS für alle Herkünfte, 5 Minuten Cache und maximal 60 Anfragen pro Minute und IP.\n\n## Beträge bei Dauerspenden\n\n`recurring.amounts` gelten für das **kürzeste Intervall in `recurring.intervals`**, nicht pro Monat. Der Checkout rechnet längere entsprechend hoch: bei `[3, 12]` sind 50 also 50 pro Quartal und 200 pro Jahr. Ein Teaser muss gleich hochrechnen, wenn er die Intervalle anzeigt, und den nicht hochgerechneten Betrag als `amount` übergeben.",
        "tags": [
          "Kampagnen-Links"
        ],
        "security": [],
        "parameters": [
          {
            "in": "path",
            "name": "campaign_link_id",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Numerische ID des Kampagnen-Links, sichtbar in der Übersicht im Admin."
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CampaignLinkConfig"
                }
              }
            }
          },
          "403": {
            "description": "Unbekannte oder ungültige ID, deaktivierte Kampagne, keine publizierte Sprache oder Kampagnen-Links sind ausgeschaltet. Bewusst kein 404: daraus macht die Locale-Middleware eine Weiterleitung ohne CORS-Header, die ein Aufruf von einer anderen Domain nicht lesen könnte.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CampaignLinkConfigError"
                },
                "example": {
                  "error": "not_found"
                }
              }
            }
          },
          "405": {
            "description": "Andere Methode als GET, HEAD oder OPTIONS.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CampaignLinkConfigError"
                },
                "example": {
                  "error": "method_not_allowed"
                }
              }
            }
          },
          "429": {
            "description": "Zu viele Anfragen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CampaignLinkConfigError"
                },
                "example": {
                  "error": "rate_limited"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CampaignLinkPaymentMethod": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Auswahlwert des Checkouts, z. B. `TWI`."
          },
          "name": {
            "type": "string",
            "description": "Übersetzter Anzeigename."
          },
          "icon_url": {
            "type": "string"
          }
        }
      },
      "CampaignLinkOnetimeConfig": {
        "type": "object",
        "nullable": true,
        "properties": {
          "amounts": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Feste Beträge in der Basiswährung. Bei Dauerspenden gelten sie für das kürzeste Intervall in `recurring.intervals`; der Checkout rechnet längere entsprechend hoch."
          },
          "allow_custom_amount": {
            "type": "boolean"
          },
          "payment_methods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CampaignLinkPaymentMethod"
            },
            "description": "Die Zahlungsarten, die der Checkout dieses Abschnitts anbietet, in Anzeigereihenfolge.\n\n**Bei Stripe leer.** Stripe hat einen dynamischen Checkout: das Payment Element entscheidet erst beim Anzeigen, welche Zahlungsarten es je Gerät, Land, Währung und Betrag anbietet. Es gibt also keine feste Liste. Ist das Array leer, zeige im Teaser keine Zahlungsarten an - sie könnten nicht mit dem übereinstimmen, was die spendende Person danach sieht."
          }
        }
      },
      "CampaignLinkRecurringConfig": {
        "type": "object",
        "nullable": true,
        "properties": {
          "amounts": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Feste Beträge in der Basiswährung. Bei Dauerspenden gelten sie für das kürzeste Intervall in `recurring.intervals`; der Checkout rechnet längere entsprechend hoch."
          },
          "allow_custom_amount": {
            "type": "boolean"
          },
          "payment_methods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CampaignLinkPaymentMethod"
            },
            "description": "Die Zahlungsarten, die der Checkout dieses Abschnitts anbietet, in Anzeigereihenfolge.\n\n**Bei Stripe leer.** Stripe hat einen dynamischen Checkout: das Payment Element entscheidet erst beim Anzeigen, welche Zahlungsarten es je Gerät, Land, Währung und Betrag anbietet. Es gibt also keine feste Liste. Ist das Array leer, zeige im Teaser keine Zahlungsarten an - sie könnten nicht mit dem übereinstimmen, was die spendende Person danach sieht."
          },
          "intervals": {
            "type": "array",
            "items": {
              "type": "integer",
              "enum": [
                1,
                3,
                6,
                12
              ]
            },
            "description": "Erlaubte Intervalle einer Dauerspende in Monaten."
          }
        }
      },
      "CampaignLinkConfig": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "payment_type": {
            "type": "string",
            "enum": [
              "onetime",
              "recurring",
              "both"
            ]
          },
          "currency": {
            "type": "string",
            "description": "Basiswährung der Plattform."
          },
          "min_custom_amount": {
            "type": "integer"
          },
          "onetime": {
            "$ref": "#/components/schemas/CampaignLinkOnetimeConfig"
          },
          "recurring": {
            "$ref": "#/components/schemas/CampaignLinkRecurringConfig"
          },
          "checkout_urls": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Absolute Checkout-URL pro publizierter Sprache, mit dem Sprachcode als Schlüssel."
          }
        }
      },
      "CampaignLinkConfigError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Kampagnen-Links",
      "description": "Öffentliche Spenden-Konfiguration eines Kampagnen-Links"
    }
  ]
}
```