1. Guides
Sokin Embedded API
  • Getting Started
    • Sokin Definitions
    • Guides
      • Authentication
      • Receiving Payments
      • FX Payments
      • Payments
      • Unfunded Payments
      • Unfunded FX Payments
      • Webhooks
      • Corporate Onboarding
        • Data Requirements
        • Step 1: Create a corporate profile
        • Step 2: Add associates
        • Step 3: Add a parent entity (if applicable)
        • Step 4: Upload company documents
        • Step 5: Upload associate documents
        • Real-time Status Updates via Webhook
        • Conditional Step: Upload Parent Entity documents (if applicable)
        • Step 6: Finalise onboarding submission
        • Uploading supporting documents using Pre-signed URLs
        • Onboarding Reference Data
        • Onboarding Models
          • Data-Only model
          • Supported Jurisdictions & National ID Requirements
  • Authentication
    • Get Token
      POST
    • Get Token on behalf of corporate
      POST
    • Schemas
      • TokenResponse
  • Corporates
    • v2025-12-01
      • Create a new Corporate
      • Add a parent entity (corporate associate) to an onboarding request
      • Add an associate to a corporate onboarding request
      • Request pre-signed URLs for onboarding document uploads
      • Request pre-signed URLs for parent entity document uploads
      • Request pre-signed URLs for associate document uploads
      • Finalise corporate onboarding submission
    • Schemas
      • NumericRange
      • ApiResponse[AddIndividualAssociateResponse]
      • ApiResponse[AddAssociateDocumentsResponse]
      • ApiResponse[AddOnboardingDocumentsResponse]
      • AddOnboardingDocumentsResponse
      • AssociateDocumentPresignedUrlResponse
      • AssociateType
      • ErrorResponse
      • MessageResponse
      • FinaliseSubmissionResponse
      • AddParentEntityRequest
      • MoneyRange
      • AddOnboardingDocumentsRequest
      • ApiResponse[CreateCorporateResponse]
      • CreateCorporateRequest
      • CreateCorporateResponse
      • FinaliseSubmissionRequest
      • PresignedUrlResponse
      • AddressTypeEnum
      • OwnershipType
      • AddAssociateDocumentsResponse
      • ErrorDetail
      • AddIndividualAssociateRequest
      • UboDetails
      • AddParentEntityResponse
      • CorporateCategories
      • AddIndividualAssociateResponse
      • CorporateAssociateType
      • AddParentEntityDocumentsRequest
      • AssociateDocumentPresignedUrlResponseItem
      • ApiResponse[AddParentEntityResponse]
      • AssociateIdentityType
      • ApiResponse[CorporateDetailResponse]
      • AddAssociateDocumentsRequest
      • CorporateDetailResponse
  • Corporate Currency Accounts
    • v2025-12-01
      • Get Corporate Currency Accounts
      • Get Corporate Currency Account By Reference
    • Schemas
      • PaginatedApiResponse[GetCCALedgerItemsResponseItem]
      • ErrorResponse
      • GetCCALedgerItemsResponseItem
      • PaginationInfo
      • ErrorDetail
      • ApiResponse[GetCCAByReferenceResponse]
      • GetCCAByReferenceResponse
      • GetCCAByReferenceResponsePayInDetail
      • GetCCAsResponseItem
      • PaginatedApiResponse[GetCCAsResponseItem]
  • Beneficiaries
    • v2025-12-01
      • Get Beneficiary Schema
      • Create Beneficiary
      • Get Beneficiary List
      • Get Beneficiary Details
      • Delete Beneficiary
      • Validate Beneficiary
      • List Financial Institutions
      • List Financial Institution Branches
    • Schemas
      • DestinationResponse
      • ErrorResponse
      • FieldType
      • PaymentMethodType
      • IdentifierType
      • AccountNumberType
      • TransactionTypeEnum
      • CompanyDetailsRequest
      • BeneficiaryType
      • RoutingCodeRequest
      • PaginatedApiResponse[FinancialInstitutionBranchReferenceResponse]
      • AccountType
      • ApiResponse[ValidateBeneficiaryResponse]
      • ApiResponse[BeneficiaryDetails]
      • ApiResponse[CreateExternalBeneficiaryData]
      • ApiResponse[DeleteBeneficiaryData]
      • ApiResponse[GetBeneficiaryFieldsResponse]
      • BeneficiaryField
      • BeneficiaryListItem
      • CreateExternalBeneficiaryData
      • CreateExternalBeneficiaryRequest
      • DeleteBeneficiaryData
      • GetBeneficiaryFieldsResponse
      • PaginatedApiResponse[BeneficiaryListItem]
      • StateOrProvince
      • AddressRequest
      • PaginationInfo
      • ValidateBeneficiaryResponse
      • PaginationInfo
      • FinancialInstitutionReferenceResponse
      • PaginatedBeneficiaryFieldsResponse
      • GetBeneficiarySchemaResponse
      • VirtualAccountDestinationRequest
      • BeneficiaryDestinationValidationResult
      • BeneficiarySchemaCondition
      • ErrorDetail
      • StateOrProvince
      • FinancialInstitutionRequest
      • BankAccountDestinationRequest
      • BeneficiaryDetails
      • CreateBeneficiaryRequest
      • ETransferDestinationRequest
      • StateOrProvince
      • BeneficiaryEntityType
      • RegionalHints
      • SchemaFieldType
      • BeneficiarySchemaField
      • ValidateBeneficiaryRequest
      • RoutingScheme
      • BeneficiaryValidationPayload
      • CompanyDetailsResponse
      • PaymentRail
      • ApiResponse[BeneficiaryResponse]
      • BankAccountCategory
      • ApiResponse[ListFinancialInstitutionsResponse]
      • ValidateBeneficiariesRequest
      • SokinInternalDestinationRequest
      • IndividualDetailsResponse
      • PageInfo
      • AddressResponse
      • BeneficiaryResponse
      • FinancialInstitutionBranchReferenceResponse
      • ListFinancialInstitutionsResponse
      • ValidateBatchBeneficiariesResponse
      • IndividualDetailsRequest
      • CurrencyCode
      • BeneficiaryStatus
      • PaginatedApiResponse[BeneficiaryResponse]
      • PaginationInfo
      • ApiResponse[ValidateBatchBeneficiariesResponse]
      • ApiResponse[GetBeneficiarySchemaResponse]
      • ApiResponse[list[FinancialInstitutionReferenceResponse]]
      • BeneficiaryValidationResultResponse
      • FieldErrorResponse
      • ValidationStatus
  • Instruction Requests
    • v2025-12-01
      • Create Payment Instruction Request
      • Create Fx Instruction Request
      • Create Fx Payment Instruction Request
      • Create Unfunded Payment Instruction Request
      • Create Unfunded Fx Payment Instruction Request
      • Get Instruction Request By Reference
    • Schemas
      • ErrorResponse
      • ApiResponse[CreateInstructionRequestResponse]
      • ErrorDetail
      • ApiResponse[GetInstructionRequestResponse]
      • CreateFXInstructionRequest
      • CreateFxPaymentInstructionRequest
      • CreateInstructionRequestResponse
      • CreatePaymentInstructionRequest
      • CreateUnfundedFxPaymentInstructionRequest
      • CreateUnfundedPaymentInstructionRequest
      • GetInstructionRequestResponse
  • Instructions
    • v2025-12-01
      • Get Instruction By Reference
    • Schemas
      • ErrorDetail
      • ErrorResponse
      • ApiResponse[GetInstructionResponse]
      • GetInstructionResponse
  • Foreign Exchange
    • v2025-12-01
      • Get Fx Rate
    • Schemas
      • ErrorResponse
      • FxRateData
      • FixedSide
      • ApiResponse[FxRateData]
      • ErrorDetail
      • FxRateRequest
  • Webhooks
    • v2025-12-01
      • Create Subscription
      • Update Subscription
      • Get Subscription By Id
      • Delete Subscription
      • Update Subscription Status
      • List Notification Logs
      • Retry Notification
    • Schemas
      • PaginatedApiResponse[NotificationLogResponse]
      • ApiResponse[CreateSubscriptionResponse]
      • NotificationStatus
      • SubscribableWebhookEventType
      • PaginationInfo
      • NotificationAttemptResponse
      • PageInfo
      • ApiResponse[UpdateSubscriptionResponse]
      • ErrorResponse
      • NotificationLogResponse
      • SubscriptionCreateOrUpdate
      • SubscriptionStatusUpdate
      • CreateSubscriptionResponse
      • PaginationInfo
      • UpdateSubscriptionResponse
      • ErrorDetail
      • WebhookSubscription
  1. Guides

Webhooks

Webhooks#

Webhooks let Sokin push real-time notifications to your systems when events happen in your account — an instruction is created, a payment settles, funds arrive at a Corporate Currency Account, and so on. Instead of polling our API, you register a URL and we POST to it as things happen.
Webhooks are the recommended way to track the lifecycle of payments and corporate status changes.

How delivery works#

When a subscribed event occurs, Sokin sends an HTTP POST to the URL you registered. The request looks like this:
POST https://your-app.example.com/webhooks/sokin
Content-Type: application/json
User-Agent: WebhookConductor/1.0
X-Idempotency-Key: 3f1a9b2c-88ae-4e1b-9a0a-2a7c2e8b4f90
x-api-key: <your auth key, if configured>

{
  "notificationType": "instruction.instructions.processed",
  ...
}

Authentication#

When you create a subscription, you may supply an authKey. If set, Sokin includes it on every delivery as the x-api-key header. Your receiver should reject any request that doesn't present the expected value.
If you don't set an authKey, the header is omitted. We recommend always configuring one.

Idempotency#

Every delivery carries a unique X-Idempotency-Key header. If your endpoint returns a non-2xx response, Sokin retries the same key — so your receiver should treat the key as a dedupe token and ignore duplicate deliveries of the same key.

Retries#

If your endpoint returns anything outside the 2xx range, or the request times out, Sokin retries. Two parameters on the subscription control the behaviour:
FieldDefaultRangeMeaning
maxRetries30–10Number of retry attempts after the initial send
retryDelayMinutes51–60Delay between attempts
A notification that exhausts all retries is marked failed and no further delivery is attempted automatically. You can inspect delivery history and manually retry via the Webhook API (see API reference).

Ordering#

Deliveries are not guaranteed to arrive in the order events happened. Use the fields in each payload (externalReference, timestamps on the underlying resource) to reconcile state rather than relying on arrival order.

Managing subscriptions#

Subscriptions are managed through the Webhook API:
POST /webhooks/subscriptions — create
GET /webhooks/subscriptions?subscriptionId=... — read
PUT /webhooks/subscriptions?subscriptionId=... — update (the eventTypes array is a full replacement — events not present are unsubscribed)
PATCH /webhooks/subscriptions/status?subscriptionId=... — enable/disable
DELETE /webhooks/subscriptions?subscriptionId=... — delete
See the API reference for the request/response schemas.

Available events#

Event typeFires when
corporate.status.activatedA corporate is activated and ready to transact
instruction.instruction-requests.rejectedAn instruction request is rejected before becoming an instruction
instruction.instructions.createdA new instruction is created from a valid instruction request
instruction.instructions.processedAn instruction has been fully processed and funds have been dispatched
instruction.instructions.failedAn instruction has failed
accounting.corporateCurrencyAccount.fundedFunds have arrived into a Corporate Currency Account

Payload envelope#

Every webhook body is JSON and always includes a notificationType field identifying the event. Beyond that, each event type has its own fields (documented below). Unknown fields may be added in the future — treat payloads as forward-compatible and ignore fields you don't recognise.

Payload reference#

corporate.status.activated#

Dispatched when a corporate moves into the active state.
{
  "notificationType": "corporate.status.activated",
  "corporateExternalReference": "corp_abc123",
  "resellerExternalReference": "res_xyz789",
  "activatedBy": "user_operator_42",
  "activatedAt": "2026-04-21T10:15:30.123456+00:00"
}
FieldTypeDescription
corporateExternalReferencestringExternal reference of the activated corporate
resellerExternalReferencestringExternal reference of the reseller that owns the corporate
activatedBystringIdentifier of the principal who activated the corporate
activatedAtstring (ISO-8601)Activation timestamp

instruction.instructions.created#

Dispatched when an instruction is created from a valid instruction request.
{
  "notificationType": "instruction.instructions.created",
  "externalReference": "INSTR-9c2b1a",
  "instructionType": "Payment",
  "corporate": "corp_abc123",
  "corporateCurrencyAccount": "CA-corp_abc123-GBP-1",
  "quoteId": null,
  "amount": "1000.00",
  "beneficiaryReference": "BENE-7d1e",
  "senderReference": "INV-2026-0421-001",
  "instructionRequestReference": "IR-Payment-3a8f",
  "paymentPurpose": "Supplier payment",
  "sourceCurrency": "GBP",
  "destinationCurrency": "GBP",
  "paymentReference": "INV-2026-0421-001"
}
FieldTypeDescription
externalReferencestringInstruction reference
instructionTypestringType of instruction (e.g. Payment, UnfundedFXPayment)
corporatestringCorporate external reference
corporateCurrencyAccountstringSource CCA reference
quoteIdstring | nullFX quote ID, if applicable
amountstring (decimal)Instruction amount
beneficiaryReferencestring | nullBeneficiary reference
senderReferencestring | nullText readable by the receiver of the payment
instructionRequestReferencestringUpstream instruction request reference
paymentPurposestring | nullPurpose of the payment
sourceCurrencystringISO 4217 source currency
destinationCurrencystringISO 4217 destination currency
paymentReferencestring | nullReference expected to be used for the payment

instruction.instructions.processed#

Dispatched when an instruction is fully processed.
{
  "notificationType": "instruction.instructions.processed",
  "externalReference": "INSTR-9c2b1a",
  "instructionType": "Payment",
  "corporate": "corp_abc123",
  "corporateCurrencyAccount": "CA-corp_abc123-GBP-1",
  "quoteId": null,
  "amount": "1000.00",
  "beneficiaryReference": "BENE-7d1e",
  "senderReference": "INV-2026-0421-001",
  "paymentPurpose": "Supplier payment",
  "sourceCurrency": "GBP",
  "destinationCurrency": "GBP",
  "paymentReference": "INV-2026-0421-001"
}
Field definitions are identical to instruction.instructions.created, except instructionRequestReference is not included.

instruction.instructions.failed#

Dispatched when an instruction transitions to a failed state.
{
  "notificationType": "instruction.instructions.failed",
  "externalReference": "INSTR-9c2b1a",
  "instructionType": "Payment",
  "corporate": "corp_abc123",
  "corporateCurrencyAccount": "CA-corp_abc123-GBP-1",
  "quoteId": null,
  "amount": "1000.00",
  "beneficiaryReference": "BENE-7d1e",
  "senderReference": "INV-2026-0421-001",
  "paymentPurpose": "Supplier payment",
  "sourceCurrency": "GBP",
  "destinationCurrency": "GBP",
  "paymentReference": "INV-2026-0421-001"
}
Field shape matches instruction.instructions.processed.

instruction.instruction-requests.rejected#

Dispatched when an instruction request is rejected before becoming an instruction.
{
  "notificationType": "instruction.instruction-requests.rejected",
  "externalReference": "IR-Payment-3a8f",
  "version": 2,
  "failureReason": "Insufficient funds"
}
FieldTypeDescription
externalReferencestringInstruction request reference
versionintegerAggregate version at the time of rejection
failureReasonstring | nullHuman-readable reason for rejection

accounting.corporateCurrencyAccount.funded#

Dispatched when funds have been received into a Corporate Currency Account.
{
  "notificationType": "accounting.corporateCurrencyAccount.funded",
  "corporateExternalReference": "corp_abc123",
  "corporateCurrencyAccountReference": "CA-corp_abc123-GBP-1",
  "amount": "50000.00",
  "currency": "GBP",
  "debtorName": "Acme Supplier Ltd",
  "debtorAccount": "GB29NWBK60161331926819",
  "senderReference": "Inv-887654",
  "externalPaymentReference": "BCS-2026-04-21-abc",
  "valueDate": "2026-04-21T00:00:00+00:00",
  "paymentChannel": "SEPA"
}
FieldTypeDescription
corporateExternalReferencestringExternal reference of the corporate that owns the CCA
corporateCurrencyAccountReferencestringCCA receiving the funds
amountstring (decimal)Funded amount
currencystringISO 4217 currency
debtorNamestring | nullName of the party that sent the funds
debtorAccountstring | nullAccount of the party that sent the funds
senderReferencestring | nullSender's reference for the transaction
externalPaymentReferencestring | nullProvider's reference for the transaction
valueDatestring (ISO-8601) | nullValue date of the transaction
paymentChannelstring | nullPayment channel

Inspecting delivery history#

Use GET /webhooks/notifications to list delivery attempts (filterable by corporateId, eventType, status). Each entry includes HTTP status codes, response bodies, and retry history. If an attempt exhausted retries, you can manually re-queue it with POST /webhooks/notifications/{notificationId}/retry.
Modified at 2026-04-21 22:11:45
Previous
Unfunded FX Payments
Next
Corporate Onboarding
Built with