public static function create(
        int $cashRegisterId,
        string $description,
        string $status,
        Amount $amountTotal,
        int $monetaryAccountId = null,
        string $merchantReference = null,
        bool $allowAmountHigher = null,
        bool $allowAmountLower = null,
        bool $wantTip = null,
        int $minimumAge = null,
        string $requireAddress = null,
        string $redirectUrl = null,
        TabVisibility $visibility = null,
        string $expiration = null,
        array $tabAttachment = null,
        array $customHeaders = []
    ): BunqResponseString {
        $apiClient = new ApiClient(static::getApiContext());
        $responseRaw = $apiClient->post(
            vsprintf(
                self::ENDPOINT_URL_CREATE,
                [static::determineUserId(), static::determineMonetaryAccountId($monetaryAccountId), $cashRegisterId]
            ),
            [
                self::FIELD_MERCHANT_REFERENCE => $merchantReference,
                self::FIELD_DESCRIPTION => $description,
                self::FIELD_STATUS => $status,
                self::FIELD_AMOUNT_TOTAL => $amountTotal,
                self::FIELD_ALLOW_AMOUNT_HIGHER => $allowAmountHigher,
                self::FIELD_ALLOW_AMOUNT_LOWER => $allowAmountLower,
                self::FIELD_WANT_TIP => $wantTip,
                self::FIELD_MINIMUM_AGE => $minimumAge,
                self::FIELD_REQUIRE_ADDRESS => $requireAddress,
                self::FIELD_REDIRECT_URL => $redirectUrl,
                self::FIELD_VISIBILITY => $visibility,
                self::FIELD_EXPIRATION => $expiration,
                self::FIELD_TAB_ATTACHMENT => $tabAttachment,
            ],
            $customHeaders
        );

        return BunqResponseString::castFromBunqResponse(
            static::processForUuid($responseRaw)
        );
    }