admin
Version 0.1.011 operations
Konnect admin and support: affiliations across organisations
GET/admin/affiliationsDashboard session
Parameters
cursoranyquerylimitintegerquery- max: 200
- default: 50
statusanyqueryprovideranyqueryorganisationanyqueryOrganisation id
Responses
200
itemsAdminAffiliationDto[]requiredidstring (uuid)requiredorganisationIdstring (uuid)requiredproviderstringrequired- enum: "clictopay", "flouci", "izi", "mpgs_poste", "pluxee", "kashy", "enda_tao"
providerNamestringrequiredlabelstringrequiredenvironmentstringrequired- enum: "sandbox", "production"
statusstringrequired- enum: "draft", "verifying", "active", "suspended", "revoked"
publicIdentifierstring | nullrequiredNever a secret
credentialsobjectrequiredNon-secret fields in full, secret fields as **** plus their last four characters; never a value usable at the provider
credentialVersionnumberrequiredCurrent credential version, 1 for the first credentials
verifiedAtstring (date-time) | nullrequiredlastUsedAtstring (date-time) | nullrequiredlastVerificationErrorstring | nullrequiredReadable, never a secret
revokedAtstring (date-time) | nullrequiredpaymentAccountsRoutedPaymentAccountDto[]requiredPayment accounts whose routing uses this affiliation; they lose it on revoke
idstring (uuid)requirednamestringrequiredstatusstringrequired- enum: "active", "paused", "archived"
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredorganisationNamestringrequired
nextCursorstring | nullrequired
Code samples
curl -X GET "$KONNECT_API_URL/admin/affiliations" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"items": [
{
"id": "id",
"organisationId": "org_01J9Z3K4EXAMPLE0000000000",
"provider": "clictopay",
"providerName": "ClicToPay",
"label": "default",
"environment": "sandbox",
"status": "draft",
"publicIdentifier": "publicIdentifier",
"credentials": {},
"credentialVersion": 1,
"verifiedAt": "2026-10-01T09:30:00.000Z",
"lastUsedAt": "2026-10-01T09:30:00.000Z",
"lastVerificationError": "lastVerificationError",
"revokedAt": "2026-10-01T09:30:00.000Z",
"paymentAccounts": [
{
"id": "id",
"name": "name",
"status": "active"
}
],
"createdAt": "2026-10-01T09:30:00.000Z",
"updatedAt": "2026-10-01T09:30:00.000Z",
"organisationName": "organisationName"
}
],
"nextCursor": "nextCursor"
}Outbox events, newest first (Konnect support)
GET/admin/outboxDashboard session
Parameters
cursoranyquerynextCursor of the previous page
limitintegerquery- max: 200
- default: 50
statusstringquery- enum: "pending", "done", "failed"
Responses
200
itemsOutboxEventDto[]requiredidstring (uuid)requiredtypestringrequiredstatusstringrequired- enum: "pending", "done", "failed"
payloadobjectrequiredRedacted payload
attemptsnumberrequiredlastErrorstring | nullrunAtstring (date-time)requireddoneAtstring (date-time) | nullcreatedAtstring (date-time)required
nextCursorstring | nullrequired
401Not authenticated; 403 for anyone but Konnect support and admins
Code samples
curl -X GET "$KONNECT_API_URL/admin/outbox" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"items": [
{
"id": "id",
"type": "email.send",
"status": "pending",
"payload": {},
"attempts": 1,
"lastError": "lastError",
"runAt": "2026-10-01T09:30:00.000Z",
"doneAt": "2026-10-01T09:30:00.000Z",
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"nextCursor": "nextCursor"
}Konnect staff: every organisation with its status facts
GET/admin/organisationsDashboard session
Parameters
No parameters.
Responses
200
idstring (uuid)requirednamestringrequiredlegalNamestringrequiredtaxIdstringrequiredkybStatusstringrequired- enum: "pending", "verified", "refused"
contractSignedAtstring (date-time) | nullrequiredcanCollectbooleanrequiredreasonsstring[]requiredmemberCountnumberrequiredcreatedAtstring (date-time)required
Code samples
curl -X GET "$KONNECT_API_URL/admin/organisations" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
[
{
"id": "id",
"name": "name",
"legalName": "legalName",
"taxId": "taxId",
"kybStatus": "pending",
"contractSignedAt": "2026-10-01T09:30:00.000Z",
"canCollect": true,
"reasons": [
"kyb_pending"
],
"memberCount": 1,
"createdAt": "2026-10-01T09:30:00.000Z"
}
]Konnect staff: identity and status facts of one organisation
GET/admin/organisations/{id}Dashboard session
Parameters
idstringpathrequired
Responses
200
idstring (uuid)requirednamestringrequiredlegalNamestringrequiredtaxIdstringrequiredcountrystringrequiredaddressstring | nullrequiredcitystring | nullrequiredpostalCodestring | nullrequiredphonestring | nullrequiredemailstring | nullrequiredwebsitestring | nullrequiredkybStatusstringrequired- enum: "pending", "verified", "refused"
contractSignedAtstring (date-time) | nullrequiredactiveAffiliationsnumberrequiredcanCollectbooleanrequiredComputed: KYB verified, contract signed, one active affiliation
reasonsstring[]requiredpaymentAccountsPaymentAccountSummaryDto[]requiredAccounts within your scope
idstring (uuid)requirednamestringrequiredslugstringrequiredisDefaultbooleanrequiredstatusstringrequired- enum: "active", "paused", "archived"
Code samples
curl -X GET "$KONNECT_API_URL/admin/organisations/id" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"id": "id",
"name": "name",
"legalName": "legalName",
"taxId": "taxId",
"country": "country",
"address": "address",
"city": "city",
"postalCode": "postalCode",
"phone": "phone",
"email": "buyer@example.com",
"website": "website",
"kybStatus": "pending",
"contractSignedAt": "2026-10-01T09:30:00.000Z",
"activeAffiliations": 1,
"canCollect": true,
"reasons": [
"kyb_pending"
],
"paymentAccounts": [
{
"id": "id",
"name": "name",
"slug": "slug",
"isDefault": true,
"status": "active"
}
]
}Full timeline of any payment, with raw provider payloads (admin)
GET/admin/payments/{reference}/timelineDashboard session
Parameters
referencestringpathrequiredcategorystring[]queryRepeat to keep several categories; all by default
cursoranyquerynextCursor of the previous page
limitintegerquery- max: 200
- default: 100
Responses
200
paymentPaymentDtorequiredidstring (uuid)requiredreferencestringrequired24 hexadecimal characters
statusstringrequired- enum: "pending", "succeeded", "failed", "expired", "canceled"
amountnumberrequiredcurrencystringrequireddescriptionstring | nullrequiredorderIdstring | nullrequiredpayerPayerDtorequiredfirstNamestringlastNamestringemailstringReceives the receipt
phonestring
acceptedProvidersstring[]requiredproviderstring | nullrequiredProvider of the succeeded attempt, or of the last attempt opened
organisationIdstring (uuid)requiredpaymentAccountIdstring (uuid)requiredchannelstringrequired- enum: "api", "link", "konnect_me", "plugin_woocommerce", "plugin_prestashop", "plugin_whmcs", "compat_v2"
successUrlstring | nullrequiredfailUrlstring | nullrequiredwebhookUrlstring | nullrequiredexpiresAtstring (date-time)requiredmetadataobjectrequiredpayUrlstringrequiredHosted checkout page of this payment
succeededAttemptIdstring (uuid) | nullrequiredattemptsCountnumberrequiredpaymentLinkIdstring (uuid) | nullrequiredThe payment link the payer started from (channel link), null otherwise
resultanyResult summary (API responses only, not in webhook bodies)
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
attemptsTimelineAttemptDto[]requiredOldest first
idstring (uuid)requirednumbernumberrequired1 for the first attempt of the payment
providerstringrequiredstatusstringrequiredexternalRefstring | nullrequiredamountnumberrequiredproviderFeenumber | nullrequiredaffiliationAttemptAffiliationDtorequiredaffiliationIdstring (uuid)requiredlabelstringrequiredenvironmentstringrequired- enum: "sandbox", "production"
publicIdentifierstring | nullrequiredNever a secret
credentialVersionnumberrequired
checksCountnumberrequiredresultAttemptResultDtorequiredfailureCodestring | nullrequired- enum: "declined", "insufficient_funds", "limit_exceeded", "card_expired", "invalid_instrument", "authentication_failed", "fraud_suspected", "canceled_by_payer", "session_expired", "payment_expired", "provider_unavailable", "invalid_request", "merchant_auth_failed", "unknown_reference", "unknown"
providerResultCodestring | nullrequiredThe provider own code
providerMessagestring | nullrequiredThe provider message, redacted
authorizationCodestring | nullrequiredinstrumentany | nullrequiredinitiatedAtstring (date-time) | nullrequiredredirectedAtstring (date-time) | nullrequiredauthorizedAtstring (date-time) | nullrequiredcompletedAtstring (date-time) | nullrequireddurationsAttemptDurationsDtorequiredinitMsnumber | nullrequiredinitiated_at to redirected_at
payerMsnumber | nullrequiredredirected_at to completed_at
totalMsnumber | nullrequiredinitiated_at to completed_at
createdAtstring (date-time)requiredrawanyAdmin view only
webhooksTimelineWebhooksDtorequireddeliveriesWebhookDeliveryDto[]requiredidstring (uuid)requiredendpointIdstring (uuid)requiredpaymentIdstring (uuid)requiredeventIdstring (uuid)requiredeventTypestringrequired- enum: "payment.succeeded", "payment.failed", "payment.expired", "payment.canceled", "attempt.duplicate_success"
urlstringrequiredstatusstringrequired- enum: "pending", "delivered", "failed"
attemptsnumberrequiredlastStatusCodenumber | nullrequiredlastErrorstring | nullrequiredlastAttemptAtstring (date-time) | nullrequireddeliveredAtstring (date-time) | nullrequiredlastOutcomestring | nullrequired- enum: "delivered", "http_4xx", "http_5xx", "timeout", "connection_refused", "dns_error", "tls_error", "redirect_not_followed", "response_too_large", "invalid_url_or_blocked", "other"
nextRetryAtstring (date-time) | nullrequiredmanualTriesnumberrequiredcreatedAtstring (date-time)required
triesWebhookTryDto[]requiredEvery HTTP try, oldest first
idstring (uuid)requireddeliveryIdstring (uuid)requiredendpointIdstring (uuid)requiredeventIdstring (uuid)requiredeventTypestringrequired- enum: "payment.succeeded", "payment.failed", "payment.expired", "payment.canceled", "attempt.duplicate_success"
urlstringrequiredtryNumbernumberrequiredtriggerstringrequired- enum: "automatic", "manual"
requestedBystring (uuid) | nullrequiredrequestHeadersobjectrequiredrequestBodystringrequiredThe body as sent, byte for byte
startedAtstring (date-time)requireddurationMsnumberrequiredoutcomestringrequired- enum: "delivered", "http_4xx", "http_5xx", "timeout", "connection_refused", "dns_error", "tls_error", "redirect_not_followed", "response_too_large", "invalid_url_or_blocked", "other"
statusCodenumber | nullrequiredresponseHeadersobject | nullrequiredresponseExcerptstring | nullrequiredFirst 2 KB, redacted
errorMessagestring | nullrequirednextRetryAtstring (date-time) | nullrequired
itemsTimelineItemDto[]requiredOldest first
idstring (uuid)requiredseqstringrequiredTimeline order, shared by the three source tables
kindstringrequired- enum: "payment_event", "attempt_event"
typestringrequiredcategorystringrequired- enum: "payment", "checkout", "attempt", "notification", "email", "anomaly", "refund", "reconciliation"
occurredAtstring (date-time)requiredattemptIdstring (uuid) | nullrequiredactorTimelineActorDtorequiredtypestringrequired- enum: "system", "merchant_user", "api_key", "payer", "provider", "admin"
idstring | nullrequiredUser or API key id
sourcestringrequired- enum: "merchant_api", "dashboard", "checkout", "provider_callback", "poller", "outbox_worker", "admin_console", "system", "init", "callback", "poll", "manual"
fromStatusstring | nullrequiredtoStatusstring | nullrequireddetailsobjectrequiredRedacted
attemptEventAttemptEventDtoidstring (uuid)requiredtypestringrequiredfromStatusstring | nullrequired- enum: "created", "redirected", "pending", "succeeded", "failed", "canceled", "expired", "refunded"
toStatusstring | nullrequired- enum: "created", "redirected", "pending", "succeeded", "failed", "canceled", "expired", "refunded"
sourcestringrequired- enum: "init", "callback", "poll", "manual"
detailsobjectrequiredRedacted
createdAtstring (date-time)required
webhookTryWebhookTryDtoidstring (uuid)requireddeliveryIdstring (uuid)requiredendpointIdstring (uuid)requiredeventIdstring (uuid)requiredeventTypestringrequired- enum: "payment.succeeded", "payment.failed", "payment.expired", "payment.canceled", "attempt.duplicate_success"
urlstringrequiredtryNumbernumberrequiredtriggerstringrequired- enum: "automatic", "manual"
requestedBystring (uuid) | nullrequiredrequestHeadersobjectrequiredrequestBodystringrequiredThe body as sent, byte for byte
startedAtstring (date-time)requireddurationMsnumberrequiredoutcomestringrequired- enum: "delivered", "http_4xx", "http_5xx", "timeout", "connection_refused", "dns_error", "tls_error", "redirect_not_followed", "response_too_large", "invalid_url_or_blocked", "other"
statusCodenumber | nullrequiredresponseHeadersobject | nullrequiredresponseExcerptstring | nullrequiredFirst 2 KB, redacted
errorMessagestring | nullrequirednextRetryAtstring (date-time) | nullrequired
nextCursorstring | nullrequiredeventTypesVersionnumberrequiredPAYMENT_EVENT_TYPES_VERSION of packages/domain
401Not authenticated; 403 for anyone but konnect_admin
404payment_not_found
Code samples
curl -X GET "$KONNECT_API_URL/admin/payments/reference/timeline" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"payment": {
"id": "id",
"reference": "665f1c2e8b3a4d0012ab34cd",
"status": "pending",
"amount": 12500,
"currency": "TND",
"description": "description",
"orderId": "order-1001",
"payer": {
"firstName": "Sami",
"lastName": "Test",
"email": "payer@example.test",
"phone": "+21600000000"
},
"acceptedProviders": [
"clictopay"
],
"provider": "provider",
"organisationId": "org_01J9Z3K4EXAMPLE0000000000",
"paymentAccountId": "paymentAccountId",
"channel": "api",
"successUrl": "successUrl",
"failUrl": "failUrl",
"webhookUrl": "webhookUrl",
"expiresAt": "2026-10-01T09:30:00.000Z",
"metadata": {},
"payUrl": "payUrl",
"succeededAttemptId": "succeededAttemptId",
"attemptsCount": 1,
"paymentLinkId": "paymentLinkId",
"result": {
"status": "pending",
"provider": "provider",
"attemptId": "attemptId",
"failureCode": "declined",
"authorizationCode": "authorizationCode",
"instrument": {
"type": null,
"brand": null,
"last4": null,
"maskedId": null
},
"attemptsCount": 1,
"failedAttemptsCount": 1,
"checkoutOpensCount": 1,
"firstOpenedAt": "2026-10-01T09:30:00.000Z",
"completedAt": "2026-10-01T09:30:00.000Z",
"durationMs": 1,
"merchantConfirmation": "confirmed",
"merchantConfirmationReason": {
"outcome": null,
"statusCode": null,
"tries": null,
"timeoutMs": null,
"endpointDisabled": null,
"nextRetryAt": null,
"deliveryId": null
}
},
"createdAt": "2026-10-01T09:30:00.000Z",
"updatedAt": "2026-10-01T09:30:00.000Z"
},
"attempts": [
{
"id": "id",
"number": 1,
"provider": "provider",
"status": "status",
"externalRef": "externalRef",
"amount": 1,
"providerFee": 1,
"affiliation": {
"affiliationId": "affiliationId",
"label": "default",
"environment": "sandbox",
"publicIdentifier": "publicIdentifier",
"credentialVersion": 1
},
"checksCount": 1,
"result": {
"failureCode": "declined",
"providerResultCode": "providerResultCode",
"providerMessage": "providerMessage",
"authorizationCode": "authorizationCode",
"instrument": {
"type": null,
"brand": null,
"last4": null,
"maskedId": null
},
"initiatedAt": "2026-10-01T09:30:00.000Z",
"redirectedAt": "2026-10-01T09:30:00.000Z",
"authorizedAt": "2026-10-01T09:30:00.000Z",
"completedAt": "2026-10-01T09:30:00.000Z",
"durations": {
"initMs": 1,
"payerMs": 1,
"totalMs": 1
}
},
"createdAt": "2026-10-01T09:30:00.000Z",
"raw": {
"rawInit": {},
"rawStatus": {},
"rawCallback": {}
}
}
],
"webhooks": {
"deliveries": [
{
"id": "id",
"endpointId": "endpointId",
"paymentId": "665f1c2e8b3a4d0012ab34cd",
"eventId": "eventId",
"eventType": "payment.succeeded",
"url": "url",
"status": "pending",
"attempts": 1,
"lastStatusCode": 1,
"lastError": "lastError",
"lastAttemptAt": "2026-10-01T09:30:00.000Z",
"deliveredAt": "2026-10-01T09:30:00.000Z",
"lastOutcome": "delivered",
"nextRetryAt": "2026-10-01T09:30:00.000Z",
"manualTries": 1,
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"tries": [
{
"id": "id",
"deliveryId": "deliveryId",
"endpointId": "endpointId",
"eventId": "eventId",
"eventType": "payment.succeeded",
"url": "url",
"tryNumber": 1,
"trigger": "automatic",
"requestedBy": "requestedBy",
"requestHeaders": {},
"requestBody": "requestBody",
"startedAt": "2026-10-01T09:30:00.000Z",
"durationMs": 1,
"outcome": "delivered",
"statusCode": 1,
"responseHeaders": {},
"responseExcerpt": "responseExcerpt",
"errorMessage": "errorMessage",
"nextRetryAt": "2026-10-01T09:30:00.000Z"
}
]
},
"items": [
{
"id": "id",
"seq": "seq",
"kind": "payment_event",
"type": "attempt_status_changed",
"category": "payment",
"occurredAt": "2026-10-01T09:30:00.000Z",
"attemptId": "attemptId",
"actor": {
"type": "system",
"id": "id"
},
"source": "merchant_api",
"fromStatus": "fromStatus",
"toStatus": "toStatus",
"details": {},
"attemptEvent": {
"id": "id",
"type": "transition",
"fromStatus": "created",
"toStatus": "created",
"source": "init",
"details": {},
"createdAt": "2026-10-01T09:30:00.000Z"
},
"webhookTry": {
"id": "id",
"deliveryId": "deliveryId",
"endpointId": "endpointId",
"eventId": "eventId",
"eventType": "payment.succeeded",
"url": "url",
"tryNumber": 1,
"trigger": "automatic",
"requestedBy": "requestedBy",
"requestHeaders": {},
"requestBody": "requestBody",
"startedAt": "2026-10-01T09:30:00.000Z",
"durationMs": 1,
"outcome": "delivered",
"statusCode": 1,
"responseHeaders": {},
"responseExcerpt": "responseExcerpt",
"errorMessage": "errorMessage",
"nextRetryAt": "2026-10-01T09:30:00.000Z"
}
}
],
"nextCursor": "nextCursor",
"eventTypesVersion": 1
}Every platform setting with its value or secret hint and source
GET/admin/settingsDashboard session
Parameters
No parameters.
Responses
200
keystringrequiredcategorystringrequired- enum: "email", "platform", "payments"
descriptionstringrequiredEnglish help text
typeSettingTypeDtorequiredkindstringrequired- enum: "string", "email", "integer", "boolean", "enum", "string_list", "secret"
maxLengthnumberstring: maximum length
minnumberinteger: minimum
maxnumberinteger: maximum
optionsstring[]enum: allowed values
maxItemsnumberstring_list: maximum number of entries
nullablebooleanrequiredAccepts null (no value)
secretbooleanrequiredWrite-only: the value is never returned
requiresReauthbooleanrequiredA write needs a re-authentication in the last 10 minutes
visibleWhenany | nullrequiredvaluestring | number | boolean | string[]requiredEffective value (string, number, boolean or list); always null for secrets
defaultValuestring | number | boolean | string[]requiredCode default; always null for secrets
sourcestringrequired- enum: "database", "environment", "default"
secretSetbooleanrequiredSecrets: a value is stored
secretLast4string | nullrequiredSecrets: last four characters
versionnumberrequiredVersion of the database value, 0 when none
updatedAtstring (date-time) | nullrequiredupdatedBystring (uuid) | nullrequiredstoredValueInvalidbooleanrequiredThe stored value fails the current schema; the fallback applies
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
Code samples
curl -X GET "$KONNECT_API_URL/admin/settings" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
[
{
"key": "email.transport",
"category": "email",
"description": "description",
"type": {
"kind": "string",
"maxLength": 1,
"min": 1,
"max": 1,
"options": [
"string"
],
"maxItems": 1
},
"nullable": true,
"secret": true,
"requiresReauth": true,
"visibleWhen": {
"key": "email.transport",
"equals": [
"smtp"
]
},
"value": "value",
"defaultValue": "defaultValue",
"source": "database",
"secretSet": true,
"secretLast4": "secretLast4",
"version": 1,
"updatedAt": "2026-10-01T09:30:00.000Z",
"updatedBy": "updatedBy",
"storedValueInvalid": true
}
]Send a test e-mail through the current e-mail settings
POST/admin/settings/email/testDashboard session
Parameters
No parameters.
Request body application/json
tostringRecipient; the admin's own address when omitted
Responses
200
statusstringrequired- enum: "sent", "suppressed"
transportstringrequired- enum: "ses", "smtp", "log"
messageIdstringreasonstring- enum: "not_in_allowlist", "allowlist_required"
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
502email_delivery_failed (reason: AWS error name or SMTP code) or email_not_configured
Code samples
curl -X POST "$KONNECT_API_URL/admin/settings/email/test" \
-H "Cookie: konnect_session=$KONNECT_SESSION" \
-H "Content-Type: application/json" \
-d '{
"to": "to"
}'Example: request body
{
"to": "to"
}Example: 200
{
"status": "sent",
"transport": "ses",
"messageId": "messageId",
"reason": "not_in_allowlist"
}One platform setting
GET/admin/settings/{key}Dashboard session
Parameters
keystringpathrequired
Responses
200
keystringrequiredcategorystringrequired- enum: "email", "platform", "payments"
descriptionstringrequiredEnglish help text
typeSettingTypeDtorequiredkindstringrequired- enum: "string", "email", "integer", "boolean", "enum", "string_list", "secret"
maxLengthnumberstring: maximum length
minnumberinteger: minimum
maxnumberinteger: maximum
optionsstring[]enum: allowed values
maxItemsnumberstring_list: maximum number of entries
nullablebooleanrequiredAccepts null (no value)
secretbooleanrequiredWrite-only: the value is never returned
requiresReauthbooleanrequiredA write needs a re-authentication in the last 10 minutes
visibleWhenany | nullrequiredvaluestring | number | boolean | string[]requiredEffective value (string, number, boolean or list); always null for secrets
defaultValuestring | number | boolean | string[]requiredCode default; always null for secrets
sourcestringrequired- enum: "database", "environment", "default"
secretSetbooleanrequiredSecrets: a value is stored
secretLast4string | nullrequiredSecrets: last four characters
versionnumberrequiredVersion of the database value, 0 when none
updatedAtstring (date-time) | nullrequiredupdatedBystring (uuid) | nullrequiredstoredValueInvalidbooleanrequiredThe stored value fails the current schema; the fallback applies
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
404setting_not_found
Code samples
curl -X GET "$KONNECT_API_URL/admin/settings/key" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"key": "email.transport",
"category": "email",
"description": "description",
"type": {
"kind": "string",
"maxLength": 1,
"min": 1,
"max": 1,
"options": [
"string"
],
"maxItems": 1
},
"nullable": true,
"secret": true,
"requiresReauth": true,
"visibleWhen": {
"key": "email.transport",
"equals": [
"smtp"
]
},
"value": "value",
"defaultValue": "defaultValue",
"source": "database",
"secretSet": true,
"secretLast4": "secretLast4",
"version": 1,
"updatedAt": "2026-10-01T09:30:00.000Z",
"updatedBy": "updatedBy",
"storedValueInvalid": true
}Change a platform setting (reason required); applies to every API process
PUT/admin/settings/{key}Dashboard session
Parameters
keystringpathrequired
Request body application/json
valuestring | number | boolean | string[]requiredNew value; for a secret, the plain value (never returned)
reasonstringrequired- minLength: 3
- maxLength: 500
expectedVersionnumberVersion read before editing; 409 when it changed
Responses
200
keystringrequiredcategorystringrequired- enum: "email", "platform", "payments"
descriptionstringrequiredEnglish help text
typeSettingTypeDtorequiredkindstringrequired- enum: "string", "email", "integer", "boolean", "enum", "string_list", "secret"
maxLengthnumberstring: maximum length
minnumberinteger: minimum
maxnumberinteger: maximum
optionsstring[]enum: allowed values
maxItemsnumberstring_list: maximum number of entries
nullablebooleanrequiredAccepts null (no value)
secretbooleanrequiredWrite-only: the value is never returned
requiresReauthbooleanrequiredA write needs a re-authentication in the last 10 minutes
visibleWhenany | nullrequiredvaluestring | number | boolean | string[]requiredEffective value (string, number, boolean or list); always null for secrets
defaultValuestring | number | boolean | string[]requiredCode default; always null for secrets
sourcestringrequired- enum: "database", "environment", "default"
secretSetbooleanrequiredSecrets: a value is stored
secretLast4string | nullrequiredSecrets: last four characters
versionnumberrequiredVersion of the database value, 0 when none
updatedAtstring (date-time) | nullrequiredupdatedBystring (uuid) | nullrequiredstoredValueInvalidbooleanrequiredThe stored value fails the current schema; the fallback applies
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
404setting_not_found
409setting_version_conflict
Code samples
curl -X PUT "$KONNECT_API_URL/admin/settings/key" \
-H "Cookie: konnect_session=$KONNECT_SESSION" \
-H "Content-Type: application/json" \
-d '{
"value": "value",
"reason": "Switch to SES in eu-west-1",
"expectedVersion": 1
}'Example: request body
{
"value": "value",
"reason": "Switch to SES in eu-west-1",
"expectedVersion": 1
}Example: 200
{
"key": "email.transport",
"category": "email",
"description": "description",
"type": {
"kind": "string",
"maxLength": 1,
"min": 1,
"max": 1,
"options": [
"string"
],
"maxItems": 1
},
"nullable": true,
"secret": true,
"requiresReauth": true,
"visibleWhen": {
"key": "email.transport",
"equals": [
"smtp"
]
},
"value": "value",
"defaultValue": "defaultValue",
"source": "database",
"secretSet": true,
"secretLast4": "secretLast4",
"version": 1,
"updatedAt": "2026-10-01T09:30:00.000Z",
"updatedBy": "updatedBy",
"storedValueInvalid": true
}Delete the database value: the environment or code default applies
POST/admin/settings/{key}/resetDashboard session
Parameters
keystringpathrequired
Request body application/json
reasonstringrequired- minLength: 3
- maxLength: 500
expectedVersionnumber
Responses
200
keystringrequiredcategorystringrequired- enum: "email", "platform", "payments"
descriptionstringrequiredEnglish help text
typeSettingTypeDtorequiredkindstringrequired- enum: "string", "email", "integer", "boolean", "enum", "string_list", "secret"
maxLengthnumberstring: maximum length
minnumberinteger: minimum
maxnumberinteger: maximum
optionsstring[]enum: allowed values
maxItemsnumberstring_list: maximum number of entries
nullablebooleanrequiredAccepts null (no value)
secretbooleanrequiredWrite-only: the value is never returned
requiresReauthbooleanrequiredA write needs a re-authentication in the last 10 minutes
visibleWhenany | nullrequiredvaluestring | number | boolean | string[]requiredEffective value (string, number, boolean or list); always null for secrets
defaultValuestring | number | boolean | string[]requiredCode default; always null for secrets
sourcestringrequired- enum: "database", "environment", "default"
secretSetbooleanrequiredSecrets: a value is stored
secretLast4string | nullrequiredSecrets: last four characters
versionnumberrequiredVersion of the database value, 0 when none
updatedAtstring (date-time) | nullrequiredupdatedBystring (uuid) | nullrequiredstoredValueInvalidbooleanrequiredThe stored value fails the current schema; the fallback applies
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
404setting_not_found
409setting_version_conflict
Code samples
curl -X POST "$KONNECT_API_URL/admin/settings/key/reset" \
-H "Cookie: konnect_session=$KONNECT_SESSION" \
-H "Content-Type: application/json" \
-d '{
"reason": "reason",
"expectedVersion": 1
}'Example: request body
{
"reason": "reason",
"expectedVersion": 1
}Example: 200
{
"key": "email.transport",
"category": "email",
"description": "description",
"type": {
"kind": "string",
"maxLength": 1,
"min": 1,
"max": 1,
"options": [
"string"
],
"maxItems": 1
},
"nullable": true,
"secret": true,
"requiresReauth": true,
"visibleWhen": {
"key": "email.transport",
"equals": [
"smtp"
]
},
"value": "value",
"defaultValue": "defaultValue",
"source": "database",
"secretSet": true,
"secretLast4": "secretLast4",
"version": 1,
"updatedAt": "2026-10-01T09:30:00.000Z",
"updatedBy": "updatedBy",
"storedValueInvalid": true
}Changes of a setting, newest first (secrets masked)
GET/admin/settings/{key}/historyDashboard session
Parameters
keystringpathrequiredcursoranyquerynextCursor of the previous page
limitintegerquery- max: 200
- default: 50
Responses
200
itemsSettingChangeDto[]requiredidstring (uuid)requiredkeystringrequiredversionnumberrequiredactionstringrequired- enum: "set", "reset"
actorUserIdstring (uuid) | nullrequiredreasonstringrequiredbeforeobject | nullrequired{ value } or, for secrets, { masked: true, set }
afterobject | nullrequiredcreatedAtstring (date-time)required
nextCursorstring | nullrequired
401Not authenticated
403konnect_staff_only for anyone but konnect_admin; reauth_required on sensitive writes
404setting_not_found
Code samples
curl -X GET "$KONNECT_API_URL/admin/settings/key/history" \
-H "Cookie: konnect_session=$KONNECT_SESSION"Example: 200
{
"items": [
{
"id": "id",
"key": "key",
"version": 1,
"action": "set",
"actorUserId": "actorUserId",
"reason": "reason",
"before": {},
"after": {},
"createdAt": "2026-10-01T09:30:00.000Z"
}
],
"nextCursor": "nextCursor"
}