type Stripe = {
token: string;
};
/**
* Post checkout sessions
* Creates a Session object.
*/
export async function main(
auth: Stripe,
body: {
after_expiration?: {
recovery?: {
allow_promotion_codes?: boolean;
enabled: boolean;
[k: string]: unknown;
};
[k: string]: unknown;
};
allow_promotion_codes?: boolean;
automatic_tax?: {
enabled: boolean;
liability?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
[k: string]: unknown;
};
billing_address_collection?: "auto" | "required";
cancel_url?: string;
client_reference_id?: string;
consent_collection?: {
payment_method_reuse_agreement?: {
position: "auto" | "hidden";
[k: string]: unknown;
};
promotions?: "auto" | "none";
terms_of_service?: "none" | "required";
[k: string]: unknown;
};
currency?: string;
custom_fields?: {
dropdown?: {
options: { label: string; value: string; [k: string]: unknown }[];
[k: string]: unknown;
};
key: string;
label: { custom: string; type: "custom"; [k: string]: unknown };
numeric?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
optional?: boolean;
text?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
type: "dropdown" | "numeric" | "text";
[k: string]: unknown;
}[];
custom_text?: {
after_submit?: { message: string; [k: string]: unknown } | "";
shipping_address?: { message: string; [k: string]: unknown } | "";
submit?: { message: string; [k: string]: unknown } | "";
terms_of_service_acceptance?:
| { message: string; [k: string]: unknown }
| "";
[k: string]: unknown;
};
customer?: string;
customer_creation?: "always" | "if_required";
customer_email?: string;
customer_update?: {
address?: "auto" | "never";
name?: "auto" | "never";
shipping?: "auto" | "never";
[k: string]: unknown;
};
discounts?: {
coupon?: string;
promotion_code?: string;
[k: string]: unknown;
}[];
expand?: string[];
expires_at?: number;
invoice_creation?: {
enabled: boolean;
invoice_data?: {
account_tax_ids?: string[] | "";
custom_fields?:
| { name: string; value: string; [k: string]: unknown }[]
| "";
description?: string;
footer?: string;
issuer?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
metadata?: { [k: string]: string };
rendering_options?:
| {
amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax";
[k: string]: unknown;
}
| "";
[k: string]: unknown;
};
[k: string]: unknown;
};
line_items?: {
adjustable_quantity?: {
enabled: boolean;
maximum?: number;
minimum?: number;
[k: string]: unknown;
};
dynamic_tax_rates?: string[];
price?: string;
price_data?: {
currency: string;
product?: string;
product_data?: {
description?: string;
images?: string[];
metadata?: { [k: string]: string };
name: string;
tax_code?: string;
[k: string]: unknown;
};
recurring?: {
interval: "day" | "month" | "week" | "year";
interval_count?: number;
[k: string]: unknown;
};
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
unit_amount?: number;
unit_amount_decimal?: string;
[k: string]: unknown;
};
quantity?: number;
tax_rates?: string[];
[k: string]: unknown;
}[];
locale?:
| "auto"
| "bg"
| "cs"
| "da"
| "de"
| "el"
| "en"
| "en-GB"
| "es"
| "es-419"
| "et"
| "fi"
| "fil"
| "fr"
| "fr-CA"
| "hr"
| "hu"
| "id"
| "it"
| "ja"
| "ko"
| "lt"
| "lv"
| "ms"
| "mt"
| "nb"
| "nl"
| "pl"
| "pt"
| "pt-BR"
| "ro"
| "ru"
| "sk"
| "sl"
| "sv"
| "th"
| "tr"
| "vi"
| "zh"
| "zh-HK"
| "zh-TW";
metadata?: { [k: string]: string };
mode?: "payment" | "setup" | "subscription";
payment_intent_data?: {
application_fee_amount?: number;
capture_method?: "automatic" | "automatic_async" | "manual";
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
receipt_email?: string;
setup_future_usage?: "off_session" | "on_session";
shipping?: {
address: {
city?: string;
country?: string;
line1: string;
line2?: string;
postal_code?: string;
state?: string;
[k: string]: unknown;
};
carrier?: string;
name: string;
phone?: string;
tracking_number?: string;
[k: string]: unknown;
};
statement_descriptor?: string;
statement_descriptor_suffix?: string;
transfer_data?: {
amount?: number;
destination: string;
[k: string]: unknown;
};
transfer_group?: string;
[k: string]: unknown;
};
payment_method_collection?: "always" | "if_required";
payment_method_configuration?: string;
payment_method_options?: {
acss_debit?: {
currency?: "cad" | "usd";
mandate_options?: {
custom_mandate_url?: string | "";
default_for?: ("invoice" | "subscription")[];
interval_description?: string;
payment_schedule?: "combined" | "interval" | "sporadic";
transaction_type?: "business" | "personal";
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant" | "microdeposits";
[k: string]: unknown;
};
affirm?: { setup_future_usage?: "none"; [k: string]: unknown };
afterpay_clearpay?: { setup_future_usage?: "none"; [k: string]: unknown };
alipay?: { setup_future_usage?: "none"; [k: string]: unknown };
au_becs_debit?: { setup_future_usage?: "none"; [k: string]: unknown };
bacs_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
bancontact?: { setup_future_usage?: "none"; [k: string]: unknown };
boleto?: {
expires_after_days?: number;
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
card?: {
installments?: { enabled?: boolean; [k: string]: unknown };
request_three_d_secure?: "any" | "automatic" | "challenge";
setup_future_usage?: "off_session" | "on_session";
statement_descriptor_suffix_kana?: string;
statement_descriptor_suffix_kanji?: string;
[k: string]: unknown;
};
cashapp?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
customer_balance?: {
bank_transfer?: {
eu_bank_transfer?: { country: string; [k: string]: unknown };
requested_address_types?: (
| "aba"
| "iban"
| "sepa"
| "sort_code"
| "spei"
| "swift"
| "zengin"
)[];
type:
| "eu_bank_transfer"
| "gb_bank_transfer"
| "jp_bank_transfer"
| "mx_bank_transfer"
| "us_bank_transfer";
[k: string]: unknown;
};
funding_type?: "bank_transfer";
setup_future_usage?: "none";
[k: string]: unknown;
};
eps?: { setup_future_usage?: "none"; [k: string]: unknown };
fpx?: { setup_future_usage?: "none"; [k: string]: unknown };
giropay?: { setup_future_usage?: "none"; [k: string]: unknown };
grabpay?: { setup_future_usage?: "none"; [k: string]: unknown };
ideal?: { setup_future_usage?: "none"; [k: string]: unknown };
klarna?: { setup_future_usage?: "none"; [k: string]: unknown };
konbini?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
link?: {
setup_future_usage?: "none" | "off_session";
[k: string]: unknown;
};
oxxo?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
p24?: {
setup_future_usage?: "none";
tos_shown_and_accepted?: boolean;
[k: string]: unknown;
};
paynow?: { setup_future_usage?: "none"; [k: string]: unknown };
paypal?: {
capture_method?: "" | "manual";
preferred_locale?:
| "cs-CZ"
| "da-DK"
| "de-AT"
| "de-DE"
| "de-LU"
| "el-GR"
| "en-GB"
| "en-US"
| "es-ES"
| "fi-FI"
| "fr-BE"
| "fr-FR"
| "fr-LU"
| "hu-HU"
| "it-IT"
| "nl-BE"
| "nl-NL"
| "pl-PL"
| "pt-PT"
| "sk-SK"
| "sv-SE";
reference?: string;
risk_correlation_id?: string;
setup_future_usage?: "" | "none" | "off_session";
[k: string]: unknown;
};
pix?: { expires_after_seconds?: number; [k: string]: unknown };
revolut_pay?: {
setup_future_usage?: "none" | "off_session";
[k: string]: unknown;
};
sepa_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
sofort?: { setup_future_usage?: "none"; [k: string]: unknown };
swish?: { reference?: string | ""; [k: string]: unknown };
us_bank_account?: {
financial_connections?: {
permissions?: (
| "balances"
| "ownership"
| "payment_method"
| "transactions"
)[];
prefetch?: ("balances" | "transactions")[];
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant";
[k: string]: unknown;
};
wechat_pay?: {
app_id?: string;
client: "android" | "ios" | "web";
setup_future_usage?: "none";
[k: string]: unknown;
};
[k: string]: unknown;
};
payment_method_types?: (
| "acss_debit"
| "affirm"
| "afterpay_clearpay"
| "alipay"
| "au_becs_debit"
| "bacs_debit"
| "bancontact"
| "blik"
| "boleto"
| "card"
| "cashapp"
| "customer_balance"
| "eps"
| "fpx"
| "giropay"
| "grabpay"
| "ideal"
| "klarna"
| "konbini"
| "link"
| "oxxo"
| "p24"
| "paynow"
| "paypal"
| "pix"
| "promptpay"
| "revolut_pay"
| "sepa_debit"
| "sofort"
| "swish"
| "us_bank_account"
| "wechat_pay"
| "zip"
)[];
phone_number_collection?: { enabled: boolean; [k: string]: unknown };
redirect_on_completion?: "always" | "if_required" | "never";
return_url?: string;
setup_intent_data?: {
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
[k: string]: unknown;
};
shipping_address_collection?: {
allowed_countries: (
| "AC"
| "AD"
| "AE"
| "AF"
| "AG"
| "AI"
| "AL"
| "AM"
| "AO"
| "AQ"
| "AR"
| "AT"
| "AU"
| "AW"
| "AX"
| "AZ"
| "BA"
| "BB"
| "BD"
| "BE"
| "BF"
| "BG"
| "BH"
| "BI"
| "BJ"
| "BL"
| "BM"
| "BN"
| "BO"
| "BQ"
| "BR"
| "BS"
| "BT"
| "BV"
| "BW"
| "BY"
| "BZ"
| "CA"
| "CD"
| "CF"
| "CG"
| "CH"
| "CI"
| "CK"
| "CL"
| "CM"
| "CN"
| "CO"
| "CR"
| "CV"
| "CW"
| "CY"
| "CZ"
| "DE"
| "DJ"
| "DK"
| "DM"
| "DO"
| "DZ"
| "EC"
| "EE"
| "EG"
| "EH"
| "ER"
| "ES"
| "ET"
| "FI"
| "FJ"
| "FK"
| "FO"
| "FR"
| "GA"
| "GB"
| "GD"
| "GE"
| "GF"
| "GG"
| "GH"
| "GI"
| "GL"
| "GM"
| "GN"
| "GP"
| "GQ"
| "GR"
| "GS"
| "GT"
| "GU"
| "GW"
| "GY"
| "HK"
| "HN"
| "HR"
| "HT"
| "HU"
| "ID"
| "IE"
| "IL"
| "IM"
| "IN"
| "IO"
| "IQ"
| "IS"
| "IT"
| "JE"
| "JM"
| "JO"
| "JP"
| "KE"
| "KG"
| "KH"
| "KI"
| "KM"
| "KN"
| "KR"
| "KW"
| "KY"
| "KZ"
| "LA"
| "LB"
| "LC"
| "LI"
| "LK"
| "LR"
| "LS"
| "LT"
| "LU"
| "LV"
| "LY"
| "MA"
| "MC"
| "MD"
| "ME"
| "MF"
| "MG"
| "MK"
| "ML"
| "MM"
| "MN"
| "MO"
| "MQ"
| "MR"
| "MS"
| "MT"
| "MU"
| "MV"
| "MW"
| "MX"
| "MY"
| "MZ"
| "NA"
| "NC"
| "NE"
| "NG"
| "NI"
| "NL"
| "NO"
| "NP"
| "NR"
| "NU"
| "NZ"
| "OM"
| "PA"
| "PE"
| "PF"
| "PG"
| "PH"
| "PK"
| "PL"
| "PM"
| "PN"
| "PR"
| "PS"
| "PT"
| "PY"
| "QA"
| "RE"
| "RO"
| "RS"
| "RU"
| "RW"
| "SA"
| "SB"
| "SC"
| "SE"
| "SG"
| "SH"
| "SI"
| "SJ"
| "SK"
| "SL"
| "SM"
| "SN"
| "SO"
| "SR"
| "SS"
| "ST"
| "SV"
| "SX"
| "SZ"
| "TA"
| "TC"
| "TD"
| "TF"
| "TG"
| "TH"
| "TJ"
| "TK"
| "TL"
| "TM"
| "TN"
| "TO"
| "TR"
| "TT"
| "TV"
| "TW"
| "TZ"
| "UA"
| "UG"
| "US"
| "UY"
| "UZ"
| "VA"
| "VC"
| "VE"
| "VG"
| "VN"
| "VU"
| "WF"
| "WS"
| "XK"
| "YE"
| "YT"
| "ZA"
| "ZM"
| "ZW"
| "ZZ"
)[];
[k: string]: unknown;
};
shipping_options?: {
shipping_rate?: string;
shipping_rate_data?: {
delivery_estimate?: {
maximum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
minimum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
[k: string]: unknown;
};
display_name: string;
fixed_amount?: {
amount: number;
currency: string;
currency_options?: {
[k: string]: {
amount: number;
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
[k: string]: unknown;
};
};
[k: string]: unknown;
};
metadata?: { [k: string]: string };
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
tax_code?: string;
type?: "fixed_amount";
[k: string]: unknown;
};
[k: string]: unknown;
}[];
submit_type?: "auto" | "book" | "donate" | "pay";
subscription_data?: {
application_fee_percent?: number;
billing_cycle_anchor?: number;
default_tax_rates?: string[];
description?: string;
invoice_settings?: {
issuer?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
[k: string]: unknown;
};
metadata?: { [k: string]: string };
on_behalf_of?: string;
proration_behavior?: "create_prorations" | "none";
transfer_data?: {
amount_percent?: number;
destination: string;
[k: string]: unknown;
};
trial_end?: number;
trial_period_days?: number;
trial_settings?: {
end_behavior: {
missing_payment_method: "cancel" | "create_invoice" | "pause";
[k: string]: unknown;
};
[k: string]: unknown;
};
[k: string]: unknown;
};
success_url?: string;
tax_id_collection?: { enabled: boolean; [k: string]: unknown };
ui_mode?: "embedded" | "hosted";
}
) {
const url = new URL(`https://api.stripe.com/v1/checkout/sessions`);
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: "Bearer " + auth.token,
},
body: encodeParams(body),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`${response.status} ${text}`);
}
return await response.json();
}
function encodeParams(o: any) {
function iter(o: any, path: string) {
if (Array.isArray(o)) {
o.forEach(function (a) {
iter(a, path + "[]");
});
return;
}
if (o !== null && typeof o === "object") {
Object.keys(o).forEach(function (k) {
iter(o[k], path + "[" + k + "]");
});
return;
}
data.push(path + "=" + o);
}
const data: string[] = [];
Object.keys(o).forEach(function (k) {
if (o[k] !== undefined) {
iter(o[k], k);
}
});
return new URLSearchParams(data.join("&"));
}
Submitted by hugo697 368 days ago
type Stripe = {
token: string;
};
/**
* Post checkout sessions
* Creates a Session object.
*/
export async function main(
auth: Stripe,
body: {
after_expiration?: {
recovery?: {
allow_promotion_codes?: boolean;
enabled: boolean;
[k: string]: unknown;
};
[k: string]: unknown;
};
allow_promotion_codes?: boolean;
automatic_tax?: {
enabled: boolean;
liability?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
[k: string]: unknown;
};
billing_address_collection?: "auto" | "required";
cancel_url?: string;
client_reference_id?: string;
consent_collection?: {
payment_method_reuse_agreement?: {
position: "auto" | "hidden";
[k: string]: unknown;
};
promotions?: "auto" | "none";
terms_of_service?: "none" | "required";
[k: string]: unknown;
};
currency?: string;
custom_fields?: {
dropdown?: {
options: { label: string; value: string; [k: string]: unknown }[];
[k: string]: unknown;
};
key: string;
label: { custom: string; type: "custom"; [k: string]: unknown };
numeric?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
optional?: boolean;
text?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
type: "dropdown" | "numeric" | "text";
[k: string]: unknown;
}[];
custom_text?: {
after_submit?: { message: string; [k: string]: unknown } | "";
shipping_address?: { message: string; [k: string]: unknown } | "";
submit?: { message: string; [k: string]: unknown } | "";
terms_of_service_acceptance?:
| { message: string; [k: string]: unknown }
| "";
[k: string]: unknown;
};
customer?: string;
customer_creation?: "always" | "if_required";
customer_email?: string;
customer_update?: {
address?: "auto" | "never";
name?: "auto" | "never";
shipping?: "auto" | "never";
[k: string]: unknown;
};
discounts?: {
coupon?: string;
promotion_code?: string;
[k: string]: unknown;
}[];
expand?: string[];
expires_at?: number;
invoice_creation?: {
enabled: boolean;
invoice_data?: {
account_tax_ids?: string[] | "";
custom_fields?:
| { name: string; value: string; [k: string]: unknown }[]
| "";
description?: string;
footer?: string;
issuer?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
metadata?: { [k: string]: string };
rendering_options?:
| {
amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax";
[k: string]: unknown;
}
| "";
[k: string]: unknown;
};
[k: string]: unknown;
};
line_items?: {
adjustable_quantity?: {
enabled: boolean;
maximum?: number;
minimum?: number;
[k: string]: unknown;
};
dynamic_tax_rates?: string[];
price?: string;
price_data?: {
currency: string;
product?: string;
product_data?: {
description?: string;
images?: string[];
metadata?: { [k: string]: string };
name: string;
tax_code?: string;
[k: string]: unknown;
};
recurring?: {
interval: "day" | "month" | "week" | "year";
interval_count?: number;
[k: string]: unknown;
};
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
unit_amount?: number;
unit_amount_decimal?: string;
[k: string]: unknown;
};
quantity?: number;
tax_rates?: string[];
[k: string]: unknown;
}[];
locale?:
| "auto"
| "bg"
| "cs"
| "da"
| "de"
| "el"
| "en"
| "en-GB"
| "es"
| "es-419"
| "et"
| "fi"
| "fil"
| "fr"
| "fr-CA"
| "hr"
| "hu"
| "id"
| "it"
| "ja"
| "ko"
| "lt"
| "lv"
| "ms"
| "mt"
| "nb"
| "nl"
| "pl"
| "pt"
| "pt-BR"
| "ro"
| "ru"
| "sk"
| "sl"
| "sv"
| "th"
| "tr"
| "vi"
| "zh"
| "zh-HK"
| "zh-TW";
metadata?: { [k: string]: string };
mode?: "payment" | "setup" | "subscription";
payment_intent_data?: {
application_fee_amount?: number;
capture_method?: "automatic" | "automatic_async" | "manual";
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
receipt_email?: string;
setup_future_usage?: "off_session" | "on_session";
shipping?: {
address: {
city?: string;
country?: string;
line1: string;
line2?: string;
postal_code?: string;
state?: string;
[k: string]: unknown;
};
carrier?: string;
name: string;
phone?: string;
tracking_number?: string;
[k: string]: unknown;
};
statement_descriptor?: string;
statement_descriptor_suffix?: string;
transfer_data?: {
amount?: number;
destination: string;
[k: string]: unknown;
};
transfer_group?: string;
[k: string]: unknown;
};
payment_method_collection?: "always" | "if_required";
payment_method_configuration?: string;
payment_method_options?: {
acss_debit?: {
currency?: "cad" | "usd";
mandate_options?: {
custom_mandate_url?: string | "";
default_for?: ("invoice" | "subscription")[];
interval_description?: string;
payment_schedule?: "combined" | "interval" | "sporadic";
transaction_type?: "business" | "personal";
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant" | "microdeposits";
[k: string]: unknown;
};
affirm?: { setup_future_usage?: "none"; [k: string]: unknown };
afterpay_clearpay?: { setup_future_usage?: "none"; [k: string]: unknown };
alipay?: { setup_future_usage?: "none"; [k: string]: unknown };
au_becs_debit?: { setup_future_usage?: "none"; [k: string]: unknown };
bacs_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
bancontact?: { setup_future_usage?: "none"; [k: string]: unknown };
boleto?: {
expires_after_days?: number;
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
card?: {
installments?: { enabled?: boolean; [k: string]: unknown };
request_three_d_secure?: "any" | "automatic" | "challenge";
setup_future_usage?: "off_session" | "on_session";
statement_descriptor_suffix_kana?: string;
statement_descriptor_suffix_kanji?: string;
[k: string]: unknown;
};
cashapp?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
customer_balance?: {
bank_transfer?: {
eu_bank_transfer?: { country: string; [k: string]: unknown };
requested_address_types?: (
| "aba"
| "iban"
| "sepa"
| "sort_code"
| "spei"
| "swift"
| "zengin"
)[];
type:
| "eu_bank_transfer"
| "gb_bank_transfer"
| "jp_bank_transfer"
| "mx_bank_transfer"
| "us_bank_transfer";
[k: string]: unknown;
};
funding_type?: "bank_transfer";
setup_future_usage?: "none";
[k: string]: unknown;
};
eps?: { setup_future_usage?: "none"; [k: string]: unknown };
fpx?: { setup_future_usage?: "none"; [k: string]: unknown };
giropay?: { setup_future_usage?: "none"; [k: string]: unknown };
grabpay?: { setup_future_usage?: "none"; [k: string]: unknown };
ideal?: { setup_future_usage?: "none"; [k: string]: unknown };
klarna?: { setup_future_usage?: "none"; [k: string]: unknown };
konbini?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
link?: {
setup_future_usage?: "none" | "off_session";
[k: string]: unknown;
};
oxxo?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
p24?: {
setup_future_usage?: "none";
tos_shown_and_accepted?: boolean;
[k: string]: unknown;
};
paynow?: { setup_future_usage?: "none"; [k: string]: unknown };
paypal?: {
capture_method?: "" | "manual";
preferred_locale?:
| "cs-CZ"
| "da-DK"
| "de-AT"
| "de-DE"
| "de-LU"
| "el-GR"
| "en-GB"
| "en-US"
| "es-ES"
| "fi-FI"
| "fr-BE"
| "fr-FR"
| "fr-LU"
| "hu-HU"
| "it-IT"
| "nl-BE"
| "nl-NL"
| "pl-PL"
| "pt-PT"
| "sk-SK"
| "sv-SE";
reference?: string;
risk_correlation_id?: string;
setup_future_usage?: "" | "none" | "off_session";
[k: string]: unknown;
};
pix?: { expires_after_seconds?: number; [k: string]: unknown };
revolut_pay?: {
setup_future_usage?: "none" | "off_session";
[k: string]: unknown;
};
sepa_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
sofort?: { setup_future_usage?: "none"; [k: string]: unknown };
swish?: { reference?: string | ""; [k: string]: unknown };
us_bank_account?: {
financial_connections?: {
permissions?: (
| "balances"
| "ownership"
| "payment_method"
| "transactions"
)[];
prefetch?: ("balances" | "transactions")[];
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant";
[k: string]: unknown;
};
wechat_pay?: {
app_id?: string;
client: "android" | "ios" | "web";
setup_future_usage?: "none";
[k: string]: unknown;
};
[k: string]: unknown;
};
payment_method_types?: (
| "acss_debit"
| "affirm"
| "afterpay_clearpay"
| "alipay"
| "au_becs_debit"
| "bacs_debit"
| "bancontact"
| "blik"
| "boleto"
| "card"
| "cashapp"
| "customer_balance"
| "eps"
| "fpx"
| "giropay"
| "grabpay"
| "ideal"
| "klarna"
| "konbini"
| "link"
| "oxxo"
| "p24"
| "paynow"
| "paypal"
| "pix"
| "promptpay"
| "revolut_pay"
| "sepa_debit"
| "sofort"
| "swish"
| "us_bank_account"
| "wechat_pay"
| "zip"
)[];
phone_number_collection?: { enabled: boolean; [k: string]: unknown };
redirect_on_completion?: "always" | "if_required" | "never";
return_url?: string;
setup_intent_data?: {
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
[k: string]: unknown;
};
shipping_address_collection?: {
allowed_countries: (
| "AC"
| "AD"
| "AE"
| "AF"
| "AG"
| "AI"
| "AL"
| "AM"
| "AO"
| "AQ"
| "AR"
| "AT"
| "AU"
| "AW"
| "AX"
| "AZ"
| "BA"
| "BB"
| "BD"
| "BE"
| "BF"
| "BG"
| "BH"
| "BI"
| "BJ"
| "BL"
| "BM"
| "BN"
| "BO"
| "BQ"
| "BR"
| "BS"
| "BT"
| "BV"
| "BW"
| "BY"
| "BZ"
| "CA"
| "CD"
| "CF"
| "CG"
| "CH"
| "CI"
| "CK"
| "CL"
| "CM"
| "CN"
| "CO"
| "CR"
| "CV"
| "CW"
| "CY"
| "CZ"
| "DE"
| "DJ"
| "DK"
| "DM"
| "DO"
| "DZ"
| "EC"
| "EE"
| "EG"
| "EH"
| "ER"
| "ES"
| "ET"
| "FI"
| "FJ"
| "FK"
| "FO"
| "FR"
| "GA"
| "GB"
| "GD"
| "GE"
| "GF"
| "GG"
| "GH"
| "GI"
| "GL"
| "GM"
| "GN"
| "GP"
| "GQ"
| "GR"
| "GS"
| "GT"
| "GU"
| "GW"
| "GY"
| "HK"
| "HN"
| "HR"
| "HT"
| "HU"
| "ID"
| "IE"
| "IL"
| "IM"
| "IN"
| "IO"
| "IQ"
| "IS"
| "IT"
| "JE"
| "JM"
| "JO"
| "JP"
| "KE"
| "KG"
| "KH"
| "KI"
| "KM"
| "KN"
| "KR"
| "KW"
| "KY"
| "KZ"
| "LA"
| "LB"
| "LC"
| "LI"
| "LK"
| "LR"
| "LS"
| "LT"
| "LU"
| "LV"
| "LY"
| "MA"
| "MC"
| "MD"
| "ME"
| "MF"
| "MG"
| "MK"
| "ML"
| "MM"
| "MN"
| "MO"
| "MQ"
| "MR"
| "MS"
| "MT"
| "MU"
| "MV"
| "MW"
| "MX"
| "MY"
| "MZ"
| "NA"
| "NC"
| "NE"
| "NG"
| "NI"
| "NL"
| "NO"
| "NP"
| "NR"
| "NU"
| "NZ"
| "OM"
| "PA"
| "PE"
| "PF"
| "PG"
| "PH"
| "PK"
| "PL"
| "PM"
| "PN"
| "PR"
| "PS"
| "PT"
| "PY"
| "QA"
| "RE"
| "RO"
| "RS"
| "RU"
| "RW"
| "SA"
| "SB"
| "SC"
| "SE"
| "SG"
| "SH"
| "SI"
| "SJ"
| "SK"
| "SL"
| "SM"
| "SN"
| "SO"
| "SR"
| "SS"
| "ST"
| "SV"
| "SX"
| "SZ"
| "TA"
| "TC"
| "TD"
| "TF"
| "TG"
| "TH"
| "TJ"
| "TK"
| "TL"
| "TM"
| "TN"
| "TO"
| "TR"
| "TT"
| "TV"
| "TW"
| "TZ"
| "UA"
| "UG"
| "US"
| "UY"
| "UZ"
| "VA"
| "VC"
| "VE"
| "VG"
| "VN"
| "VU"
| "WF"
| "WS"
| "XK"
| "YE"
| "YT"
| "ZA"
| "ZM"
| "ZW"
| "ZZ"
)[];
[k: string]: unknown;
};
shipping_options?: {
shipping_rate?: string;
shipping_rate_data?: {
delivery_estimate?: {
maximum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
minimum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
[k: string]: unknown;
};
display_name: string;
fixed_amount?: {
amount: number;
currency: string;
currency_options?: {
[k: string]: {
amount: number;
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
[k: string]: unknown;
};
};
[k: string]: unknown;
};
metadata?: { [k: string]: string };
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
tax_code?: string;
type?: "fixed_amount";
[k: string]: unknown;
};
[k: string]: unknown;
}[];
submit_type?: "auto" | "book" | "donate" | "pay";
subscription_data?: {
application_fee_percent?: number;
billing_cycle_anchor?: number;
default_tax_rates?: string[];
description?: string;
invoice_settings?: {
issuer?: {
account?: string;
type: "account" | "self";
[k: string]: unknown;
};
[k: string]: unknown;
};
metadata?: { [k: string]: string };
on_behalf_of?: string;
proration_behavior?: "create_prorations" | "none";
transfer_data?: {
amount_percent?: number;
destination: string;
[k: string]: unknown;
};
trial_end?: number;
trial_period_days?: number;
trial_settings?: {
end_behavior: {
missing_payment_method: "cancel" | "create_invoice" | "pause";
[k: string]: unknown;
};
[k: string]: unknown;
};
[k: string]: unknown;
};
success_url?: string;
tax_id_collection?: { enabled: boolean; [k: string]: unknown };
ui_mode?: "embedded" | "hosted";
}
) {
const url = new URL(`https://api.stripe.com/v1/checkout/sessions`);
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: "Bearer " + auth.token,
},
body: encodeParams(body),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`${response.status} ${text}`);
}
return await response.json();
}
function encodeParams(o: any) {
function iter(o: any, path: string) {
if (Array.isArray(o)) {
o.forEach(function (a) {
iter(a, path + "[]");
});
return;
}
if (o !== null && typeof o === "object") {
Object.keys(o).forEach(function (k) {
iter(o[k], path + "[" + k + "]");
});
return;
}
data.push(path + "=" + o);
}
const data: string[] = [];
Object.keys(o).forEach(function (k) {
if (o[k] !== undefined) {
iter(o[k], k);
}
});
return new URLSearchParams(data.join("&"));
}
Submitted by hugo697 795 days ago
type Stripe = {
token: string;
};
/**
* Post checkout sessions
* <p>Creates a Session object.</p>
*/
export async function main(
auth: Stripe,
body: {
after_expiration?: {
recovery?: {
allow_promotion_codes?: boolean;
enabled: boolean;
[k: string]: unknown;
};
[k: string]: unknown;
};
allow_promotion_codes?: boolean;
automatic_tax?: { enabled: boolean; [k: string]: unknown };
billing_address_collection?: "auto" | "required";
cancel_url?: string;
client_reference_id?: string;
consent_collection?: {
promotions?: "auto" | "none";
terms_of_service?: "none" | "required";
[k: string]: unknown;
};
currency?: string;
custom_fields?: {
dropdown?: {
options: { label: string; value: string; [k: string]: unknown }[];
[k: string]: unknown;
};
key: string;
label: { custom: string; type: "custom"; [k: string]: unknown };
numeric?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
optional?: boolean;
text?: {
maximum_length?: number;
minimum_length?: number;
[k: string]: unknown;
};
type: "dropdown" | "numeric" | "text";
[k: string]: unknown;
}[];
custom_text?: {
shipping_address?: { message: string; [k: string]: unknown } | "";
submit?: { message: string; [k: string]: unknown } | "";
terms_of_service_acceptance?:
| { message: string; [k: string]: unknown }
| "";
[k: string]: unknown;
};
customer?: string;
customer_creation?: "always" | "if_required";
customer_email?: string;
customer_update?: {
address?: "auto" | "never";
name?: "auto" | "never";
shipping?: "auto" | "never";
[k: string]: unknown;
};
discounts?: {
coupon?: string;
promotion_code?: string;
[k: string]: unknown;
}[];
expand?: string[];
expires_at?: number;
invoice_creation?: {
enabled: boolean;
invoice_data?: {
account_tax_ids?: string[] | "";
custom_fields?:
| { name: string; value: string; [k: string]: unknown }[]
| "";
description?: string;
footer?: string;
metadata?: { [k: string]: string };
rendering_options?:
| {
amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax";
[k: string]: unknown;
}
| "";
[k: string]: unknown;
};
[k: string]: unknown;
};
line_items?: {
adjustable_quantity?: {
enabled: boolean;
maximum?: number;
minimum?: number;
[k: string]: unknown;
};
dynamic_tax_rates?: string[];
price?: string;
price_data?: {
currency: string;
product?: string;
product_data?: {
description?: string;
images?: string[];
metadata?: { [k: string]: string };
name: string;
tax_code?: string;
[k: string]: unknown;
};
recurring?: {
interval: "day" | "month" | "week" | "year";
interval_count?: number;
[k: string]: unknown;
};
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
unit_amount?: number;
unit_amount_decimal?: string;
[k: string]: unknown;
};
quantity?: number;
tax_rates?: string[];
[k: string]: unknown;
}[];
locale?:
| "auto"
| "bg"
| "cs"
| "da"
| "de"
| "el"
| "en"
| "en-GB"
| "es"
| "es-419"
| "et"
| "fi"
| "fil"
| "fr"
| "fr-CA"
| "hr"
| "hu"
| "id"
| "it"
| "ja"
| "ko"
| "lt"
| "lv"
| "ms"
| "mt"
| "nb"
| "nl"
| "pl"
| "pt"
| "pt-BR"
| "ro"
| "ru"
| "sk"
| "sl"
| "sv"
| "th"
| "tr"
| "vi"
| "zh"
| "zh-HK"
| "zh-TW";
metadata?: { [k: string]: string };
mode?: "payment" | "setup" | "subscription";
payment_intent_data?: {
application_fee_amount?: number;
capture_method?: "automatic" | "automatic_async" | "manual";
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
receipt_email?: string;
setup_future_usage?: "off_session" | "on_session";
shipping?: {
address: {
city?: string;
country?: string;
line1: string;
line2?: string;
postal_code?: string;
state?: string;
[k: string]: unknown;
};
carrier?: string;
name: string;
phone?: string;
tracking_number?: string;
[k: string]: unknown;
};
statement_descriptor?: string;
statement_descriptor_suffix?: string;
transfer_data?: {
amount?: number;
destination: string;
[k: string]: unknown;
};
transfer_group?: string;
[k: string]: unknown;
};
payment_method_collection?: "always" | "if_required";
payment_method_configuration?: string;
payment_method_options?: {
acss_debit?: {
currency?: "cad" | "usd";
mandate_options?: {
custom_mandate_url?: string | "";
default_for?: ("invoice" | "subscription")[];
interval_description?: string;
payment_schedule?: "combined" | "interval" | "sporadic";
transaction_type?: "business" | "personal";
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant" | "microdeposits";
[k: string]: unknown;
};
affirm?: { setup_future_usage?: "none"; [k: string]: unknown };
afterpay_clearpay?: { setup_future_usage?: "none"; [k: string]: unknown };
alipay?: { setup_future_usage?: "none"; [k: string]: unknown };
au_becs_debit?: { setup_future_usage?: "none"; [k: string]: unknown };
bacs_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
bancontact?: { setup_future_usage?: "none"; [k: string]: unknown };
boleto?: {
expires_after_days?: number;
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
card?: {
installments?: { enabled?: boolean; [k: string]: unknown };
setup_future_usage?: "off_session" | "on_session";
statement_descriptor_suffix_kana?: string;
statement_descriptor_suffix_kanji?: string;
[k: string]: unknown;
};
cashapp?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
customer_balance?: {
bank_transfer?: {
eu_bank_transfer?: { country: string; [k: string]: unknown };
requested_address_types?: (
| "aba"
| "iban"
| "sepa"
| "sort_code"
| "spei"
| "swift"
| "zengin"
)[];
type:
| "eu_bank_transfer"
| "gb_bank_transfer"
| "jp_bank_transfer"
| "mx_bank_transfer"
| "us_bank_transfer";
[k: string]: unknown;
};
funding_type?: "bank_transfer";
setup_future_usage?: "none";
[k: string]: unknown;
};
eps?: { setup_future_usage?: "none"; [k: string]: unknown };
fpx?: { setup_future_usage?: "none"; [k: string]: unknown };
giropay?: { setup_future_usage?: "none"; [k: string]: unknown };
grabpay?: { setup_future_usage?: "none"; [k: string]: unknown };
ideal?: { setup_future_usage?: "none"; [k: string]: unknown };
klarna?: { setup_future_usage?: "none"; [k: string]: unknown };
konbini?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
link?: {
setup_future_usage?: "none" | "off_session";
[k: string]: unknown;
};
oxxo?: {
expires_after_days?: number;
setup_future_usage?: "none";
[k: string]: unknown;
};
p24?: {
setup_future_usage?: "none";
tos_shown_and_accepted?: boolean;
[k: string]: unknown;
};
paynow?: { setup_future_usage?: "none"; [k: string]: unknown };
paypal?: {
capture_method?: "" | "manual";
preferred_locale?:
| "cs-CZ"
| "da-DK"
| "de-AT"
| "de-DE"
| "de-LU"
| "el-GR"
| "en-GB"
| "en-US"
| "es-ES"
| "fi-FI"
| "fr-BE"
| "fr-FR"
| "fr-LU"
| "hu-HU"
| "it-IT"
| "nl-BE"
| "nl-NL"
| "pl-PL"
| "pt-PT"
| "sk-SK"
| "sv-SE";
reference?: string;
risk_correlation_id?: string;
setup_future_usage?: "" | "none" | "off_session";
[k: string]: unknown;
};
pix?: { expires_after_seconds?: number; [k: string]: unknown };
sepa_debit?: {
setup_future_usage?: "none" | "off_session" | "on_session";
[k: string]: unknown;
};
sofort?: { setup_future_usage?: "none"; [k: string]: unknown };
us_bank_account?: {
financial_connections?: {
permissions?: (
| "balances"
| "ownership"
| "payment_method"
| "transactions"
)[];
prefetch?: "balances"[];
[k: string]: unknown;
};
setup_future_usage?: "none" | "off_session" | "on_session";
verification_method?: "automatic" | "instant";
[k: string]: unknown;
};
wechat_pay?: {
app_id?: string;
client: "android" | "ios" | "web";
setup_future_usage?: "none";
[k: string]: unknown;
};
[k: string]: unknown;
};
payment_method_types?: (
| "acss_debit"
| "affirm"
| "afterpay_clearpay"
| "alipay"
| "au_becs_debit"
| "bacs_debit"
| "bancontact"
| "blik"
| "boleto"
| "card"
| "cashapp"
| "customer_balance"
| "eps"
| "fpx"
| "giropay"
| "grabpay"
| "ideal"
| "klarna"
| "konbini"
| "link"
| "oxxo"
| "p24"
| "paynow"
| "paypal"
| "pix"
| "promptpay"
| "sepa_debit"
| "sofort"
| "us_bank_account"
| "wechat_pay"
| "zip"
)[];
phone_number_collection?: { enabled: boolean; [k: string]: unknown };
redirect_on_completion?: "always" | "if_required" | "never";
return_url?: string;
setup_intent_data?: {
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
[k: string]: unknown;
};
shipping_address_collection?: {
allowed_countries: (
| "AC"
| "AD"
| "AE"
| "AF"
| "AG"
| "AI"
| "AL"
| "AM"
| "AO"
| "AQ"
| "AR"
| "AT"
| "AU"
| "AW"
| "AX"
| "AZ"
| "BA"
| "BB"
| "BD"
| "BE"
| "BF"
| "BG"
| "BH"
| "BI"
| "BJ"
| "BL"
| "BM"
| "BN"
| "BO"
| "BQ"
| "BR"
| "BS"
| "BT"
| "BV"
| "BW"
| "BY"
| "BZ"
| "CA"
| "CD"
| "CF"
| "CG"
| "CH"
| "CI"
| "CK"
| "CL"
| "CM"
| "CN"
| "CO"
| "CR"
| "CV"
| "CW"
| "CY"
| "CZ"
| "DE"
| "DJ"
| "DK"
| "DM"
| "DO"
| "DZ"
| "EC"
| "EE"
| "EG"
| "EH"
| "ER"
| "ES"
| "ET"
| "FI"
| "FJ"
| "FK"
| "FO"
| "FR"
| "GA"
| "GB"
| "GD"
| "GE"
| "GF"
| "GG"
| "GH"
| "GI"
| "GL"
| "GM"
| "GN"
| "GP"
| "GQ"
| "GR"
| "GS"
| "GT"
| "GU"
| "GW"
| "GY"
| "HK"
| "HN"
| "HR"
| "HT"
| "HU"
| "ID"
| "IE"
| "IL"
| "IM"
| "IN"
| "IO"
| "IQ"
| "IS"
| "IT"
| "JE"
| "JM"
| "JO"
| "JP"
| "KE"
| "KG"
| "KH"
| "KI"
| "KM"
| "KN"
| "KR"
| "KW"
| "KY"
| "KZ"
| "LA"
| "LB"
| "LC"
| "LI"
| "LK"
| "LR"
| "LS"
| "LT"
| "LU"
| "LV"
| "LY"
| "MA"
| "MC"
| "MD"
| "ME"
| "MF"
| "MG"
| "MK"
| "ML"
| "MM"
| "MN"
| "MO"
| "MQ"
| "MR"
| "MS"
| "MT"
| "MU"
| "MV"
| "MW"
| "MX"
| "MY"
| "MZ"
| "NA"
| "NC"
| "NE"
| "NG"
| "NI"
| "NL"
| "NO"
| "NP"
| "NR"
| "NU"
| "NZ"
| "OM"
| "PA"
| "PE"
| "PF"
| "PG"
| "PH"
| "PK"
| "PL"
| "PM"
| "PN"
| "PR"
| "PS"
| "PT"
| "PY"
| "QA"
| "RE"
| "RO"
| "RS"
| "RU"
| "RW"
| "SA"
| "SB"
| "SC"
| "SE"
| "SG"
| "SH"
| "SI"
| "SJ"
| "SK"
| "SL"
| "SM"
| "SN"
| "SO"
| "SR"
| "SS"
| "ST"
| "SV"
| "SX"
| "SZ"
| "TA"
| "TC"
| "TD"
| "TF"
| "TG"
| "TH"
| "TJ"
| "TK"
| "TL"
| "TM"
| "TN"
| "TO"
| "TR"
| "TT"
| "TV"
| "TW"
| "TZ"
| "UA"
| "UG"
| "US"
| "UY"
| "UZ"
| "VA"
| "VC"
| "VE"
| "VG"
| "VN"
| "VU"
| "WF"
| "WS"
| "XK"
| "YE"
| "YT"
| "ZA"
| "ZM"
| "ZW"
| "ZZ"
)[];
[k: string]: unknown;
};
shipping_options?: {
shipping_rate?: string;
shipping_rate_data?: {
delivery_estimate?: {
maximum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
minimum?: {
unit: "business_day" | "day" | "hour" | "month" | "week";
value: number;
[k: string]: unknown;
};
[k: string]: unknown;
};
display_name: string;
fixed_amount?: {
amount: number;
currency: string;
currency_options?: {
[k: string]: {
amount: number;
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
[k: string]: unknown;
};
};
[k: string]: unknown;
};
metadata?: { [k: string]: string };
tax_behavior?: "exclusive" | "inclusive" | "unspecified";
tax_code?: string;
type?: "fixed_amount";
[k: string]: unknown;
};
[k: string]: unknown;
}[];
submit_type?: "auto" | "book" | "donate" | "pay";
subscription_data?: {
application_fee_percent?: number;
billing_cycle_anchor?: number;
default_tax_rates?: string[];
description?: string;
metadata?: { [k: string]: string };
on_behalf_of?: string;
proration_behavior?: "create_prorations" | "none";
transfer_data?: {
amount_percent?: number;
destination: string;
[k: string]: unknown;
};
trial_end?: number;
trial_period_days?: number;
trial_settings?: {
end_behavior: {
missing_payment_method: "cancel" | "create_invoice" | "pause";
[k: string]: unknown;
};
[k: string]: unknown;
};
[k: string]: unknown;
};
success_url?: string;
tax_id_collection?: { enabled: boolean; [k: string]: unknown };
ui_mode?: "embedded" | "hosted";
}
) {
const url = new URL(`https://api.stripe.com/v1/checkout/sessions`);
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: "Bearer " + auth.token,
},
body: encodeParams(body),
});
if (!response.ok) {
const text = await response.text();
throw new Error(`${response.status} ${text}`);
}
return await response.json();
}
function encodeParams(o: any) {
function iter(o: any, path: string) {
if (Array.isArray(o)) {
o.forEach(function (a) {
iter(a, path + "[]");
});
return;
}
if (o !== null && typeof o === "object") {
Object.keys(o).forEach(function (k) {
iter(o[k], path + "[" + k + "]");
});
return;
}
data.push(path + "=" + o);
}
const data: string[] = [];
Object.keys(o).forEach(function (k) {
if (o[k] !== undefined) {
iter(o[k], k);
}
});
return new URLSearchParams(data.join("&"));
}
Submitted by hugo697 922 days ago