@gojinko/api-client 2.29.0 → 2.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2892,27 +2892,262 @@ export interface paths {
2892
2892
  };
2893
2893
  get?: never;
2894
2894
  put?: never;
2895
- /** Submit an agent payment — present trip_id + a Shared Payment Token to schedule + authorize the booking; returns a checkout_url fallback if customer action (3DS) is required */
2895
+ /**
2896
+ * Submit a typed card or SPT payment with Idempotency-Key, or a legacy flat Shared Payment Token
2897
+ * @description Typed submissions require a jnk_ API key via X-API-Key (ApiKeyAuth) or Authorization: Bearer (BearerAuth), a tenant-bound booking scope, quoted_cart_id and Idempotency-Key, and return a PaymentAttemptOutcome (200 known outcome / 202 pending). OAuth/JWT bearer tokens are supported only for the legacy flat token body, which keeps its existing authorization response. Request bodies are limited to 16 KiB.
2898
+ */
2896
2899
  post: {
2897
2900
  parameters: {
2898
2901
  query?: never;
2899
- header?: never;
2902
+ header?: {
2903
+ "Idempotency-Key"?: string;
2904
+ };
2900
2905
  path?: never;
2901
2906
  cookie?: never;
2902
2907
  };
2903
2908
  requestBody?: {
2904
2909
  content: {
2905
- "application/json": components["schemas"]["AgentPaymentSubmitRequest"];
2910
+ "application/json": components["schemas"]["TypedAgentPaymentSubmitRequest"] | components["schemas"]["AgentPaymentSubmitRequest"];
2911
+ };
2912
+ };
2913
+ responses: {
2914
+ /** @description Legacy authorization result or typed payment outcome */
2915
+ 200: {
2916
+ headers: {
2917
+ [name: string]: unknown;
2918
+ };
2919
+ content: {
2920
+ "application/json": components["schemas"]["PaymentAttemptOutcome"] | components["schemas"]["AgentPaymentSubmitResponse"];
2921
+ };
2922
+ };
2923
+ /** @description Payment accepted and pending; poll the attempt after Retry-After. */
2924
+ 202: {
2925
+ headers: {
2926
+ /** @description Polling delay supplied by the BFF. */
2927
+ "Retry-After"?: string;
2928
+ [name: string]: unknown;
2929
+ };
2930
+ content: {
2931
+ "application/json": components["schemas"]["PaymentAttemptOutcome"];
2932
+ };
2933
+ };
2934
+ /** @description Payment credential format or validity refusal. **`credential_format_invalid`** — The typed payment body or Idempotency-Key has an invalid format. Correct the named field and resubmit with a valid Idempotency-Key. **`payment_credential_invalid`** — The payment credential is invalid. Follow recovery.action and supply a replacement credential when required. **`BAD_REQUEST`** — The request was malformed or failed validation. Fix the request as the message describes; retrying it unchanged cannot succeed. */
2935
+ 400: {
2936
+ headers: {
2937
+ [name: string]: unknown;
2938
+ };
2939
+ content: {
2940
+ "application/json": components["schemas"]["PaymentRefusalResponse"];
2941
+ };
2942
+ };
2943
+ /** @description Authentication required */
2944
+ 401: {
2945
+ headers: {
2946
+ [name: string]: unknown;
2947
+ };
2948
+ content: {
2949
+ /**
2950
+ * @example {
2951
+ * "error": {
2952
+ * "code": "AUTH_REQUIRED",
2953
+ * "message": "Invalid or expired API key.",
2954
+ * "doc_url": "https://docs.gojinko.com/api-reference/authentication"
2955
+ * }
2956
+ * }
2957
+ */
2958
+ "application/json": components["schemas"]["ErrorResponse"];
2959
+ };
2960
+ };
2961
+ /** @description Payment required — organization balance exhausted */
2962
+ 402: {
2963
+ headers: {
2964
+ [name: string]: unknown;
2965
+ };
2966
+ content: {
2967
+ /**
2968
+ * @example {
2969
+ * "error": {
2970
+ * "code": "PAYMENT_REQUIRED",
2971
+ * "message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
2972
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
2973
+ * }
2974
+ * }
2975
+ */
2976
+ "application/json": components["schemas"]["ErrorResponse"];
2977
+ };
2978
+ };
2979
+ /** @description This payment type is not enabled. **`payment_type_not_enabled`** — This payment type is not enabled for the caller. Choose a type advertised in accepted_payment_types or contact support. */
2980
+ 403: {
2981
+ headers: {
2982
+ [name: string]: unknown;
2983
+ };
2984
+ content: {
2985
+ "application/json": components["schemas"]["PaymentRefusalResponse"];
2986
+ };
2987
+ };
2988
+ /** @description Resource not found */
2989
+ 404: {
2990
+ headers: {
2991
+ [name: string]: unknown;
2992
+ };
2993
+ content: {
2994
+ /**
2995
+ * @example {
2996
+ * "error": {
2997
+ * "code": "NOT_FOUND",
2998
+ * "message": "Resource not found.",
2999
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3000
+ * }
3001
+ * }
3002
+ */
3003
+ "application/json": components["schemas"]["ErrorResponse"];
3004
+ };
3005
+ };
3006
+ /** @description Payment submission conflicts with an existing attempt. **`trip_owned_by_other_payment`** — Another payment attempt owns this trip. Read the existing attempt and follow its recovery action before paying again. **`idempotency_key_reused`** — The idempotency key was already used for a different submission. Reuse the original request with this key, or use a new key for a new submission. **`attempt_in_progress`** — A payment attempt is already in progress. Poll the existing attempt and follow recovery.action. **`attempt_terminal`** — This payment attempt has reached a terminal state. Read its outcome and follow recovery.action before starting another attempt. */
3007
+ 409: {
3008
+ headers: {
3009
+ [name: string]: unknown;
3010
+ };
3011
+ content: {
3012
+ "application/json": components["schemas"]["PaymentRefusalResponse"];
3013
+ };
3014
+ };
3015
+ /** @description The locked quote has expired, so nothing was redeemed and no payment object was created — or the resource the request names is gone. Tell the two apart by `error.code`. **`QUOTE_EXPIRED`** — The locked quote behind this checkout passed its `expires_at`, so payment was refused before any payment object was created. Call `POST /v1/checkout` again on the same trip — it re-quotes — then mint a new Shared Payment Token against the new `agent_spt_params` and submit that. Nothing was charged. **`GONE`** — The resource this request names existed and no longer does. Re-acquire it — search again, or check out again to re-quote — then retry with the new identifier. Repeating this request with the same one cannot succeed. **`quote_expired`** — The quoted cart has expired; the typed payment was refused. Call checkout again and submit against the new quoted_cart_id. */
3016
+ 410: {
3017
+ headers: {
3018
+ [name: string]: unknown;
3019
+ };
3020
+ content: {
3021
+ /**
3022
+ * @example {
3023
+ * "error": {
3024
+ * "code": "QUOTE_EXPIRED",
3025
+ * "message": "The quote behind this checkout expired at 2026-09-04T12:39:56Z.",
3026
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3027
+ * },
3028
+ * "expires_at": "2026-09-04T12:39:56Z",
3029
+ * "quoted_cart_id": 2097152
3030
+ * }
3031
+ */
3032
+ "application/json": components["schemas"]["QuoteExpiredResponse"] | components["schemas"]["ErrorResponse"] | components["schemas"]["PaymentRefusalResponse"];
3033
+ };
3034
+ };
3035
+ /** @description Validation error */
3036
+ 422: {
3037
+ headers: {
3038
+ [name: string]: unknown;
3039
+ };
3040
+ content: {
3041
+ /**
3042
+ * @example {
3043
+ * "error": {
3044
+ * "code": "BAD_REQUEST",
3045
+ * "message": "origins: origins is required; trip_type: trip_type is required",
3046
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3047
+ * }
3048
+ * }
3049
+ */
3050
+ "application/json": components["schemas"]["ErrorResponse"];
3051
+ };
3052
+ };
3053
+ /** @description Rate limit or quota exceeded */
3054
+ 429: {
3055
+ headers: {
3056
+ [name: string]: unknown;
3057
+ };
3058
+ content: {
3059
+ /**
3060
+ * @example {
3061
+ * "error": {
3062
+ * "code": "RATE_LIMITED",
3063
+ * "message": "Rate limit or quota exceeded.",
3064
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3065
+ * }
3066
+ * }
3067
+ */
3068
+ "application/json": components["schemas"]["ErrorResponse"];
3069
+ };
3070
+ };
3071
+ /** @description The travel provider rejected the request, or an upstream call failed */
3072
+ 502: {
3073
+ headers: {
3074
+ [name: string]: unknown;
3075
+ };
3076
+ content: {
3077
+ /**
3078
+ * @example {
3079
+ * "error": {
3080
+ * "code": "UPSTREAM_REJECTED",
3081
+ * "message": "sabre-rest BargainFinderMaxRQ failed with status 400: 27131 - Number of connection locations exceeds maximum allowed",
3082
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3083
+ * }
3084
+ * }
3085
+ */
3086
+ "application/json": components["schemas"]["ErrorResponse"];
3087
+ };
3088
+ };
3089
+ /** @description Payment temporarily unavailable. **`temporarily_unavailable`** — Payment submission is temporarily unavailable. Wait for Retry-After when provided and follow recovery.action. */
3090
+ 503: {
3091
+ headers: {
3092
+ [name: string]: unknown;
3093
+ };
3094
+ content: {
3095
+ "application/json": components["schemas"]["PaymentRefusalResponse"];
3096
+ };
3097
+ };
3098
+ /** @description The travel provider did not answer in time */
3099
+ 504: {
3100
+ headers: {
3101
+ [name: string]: unknown;
3102
+ };
3103
+ content: {
3104
+ /**
3105
+ * @example {
3106
+ * "error": {
3107
+ * "code": "UPSTREAM_TIMEOUT",
3108
+ * "message": "sabre-rest BargainFinderMaxRQ timed out after 30s",
3109
+ * "doc_url": "https://docs.gojinko.com/concepts/errors"
3110
+ * }
3111
+ * }
3112
+ */
3113
+ "application/json": components["schemas"]["ErrorResponse"];
3114
+ };
3115
+ };
3116
+ };
3117
+ };
3118
+ delete?: never;
3119
+ options?: never;
3120
+ head?: never;
3121
+ patch?: never;
3122
+ trace?: never;
3123
+ };
3124
+ "/v1/trip/{trip_id}/payment_attempts/{payment_attempt_id}": {
3125
+ parameters: {
3126
+ query?: never;
3127
+ header?: never;
3128
+ path?: never;
3129
+ cookie?: never;
3130
+ };
3131
+ /** Read a payment attempt outcome */
3132
+ get: {
3133
+ parameters: {
3134
+ query?: never;
3135
+ header?: never;
3136
+ path: {
3137
+ trip_id: string;
3138
+ payment_attempt_id: string;
2906
3139
  };
3140
+ cookie?: never;
2907
3141
  };
3142
+ requestBody?: never;
2908
3143
  responses: {
2909
- /** @description Authorization result */
3144
+ /** @description Payment attempt outcome */
2910
3145
  200: {
2911
3146
  headers: {
2912
3147
  [name: string]: unknown;
2913
3148
  };
2914
3149
  content: {
2915
- "application/json": components["schemas"]["AgentPaymentSubmitResponse"];
3150
+ "application/json": components["schemas"]["PaymentAttemptOutcome"];
2916
3151
  };
2917
3152
  };
2918
3153
  /** @description Bad request */
@@ -2969,6 +3204,15 @@ export interface paths {
2969
3204
  "application/json": components["schemas"]["ErrorResponse"];
2970
3205
  };
2971
3206
  };
3207
+ /** @description Payment attempt access forbidden. **`FORBIDDEN`** — The credential is valid, and this request is refused anyway. Do not rotate the key — it is working. Check that it is entitled to this operation, and on this environment. */
3208
+ 403: {
3209
+ headers: {
3210
+ [name: string]: unknown;
3211
+ };
3212
+ content: {
3213
+ "application/json": components["schemas"]["ErrorResponse"];
3214
+ };
3215
+ };
2972
3216
  /** @description Resource not found */
2973
3217
  404: {
2974
3218
  headers: {
@@ -3005,7 +3249,7 @@ export interface paths {
3005
3249
  "application/json": components["schemas"]["ErrorResponse"];
3006
3250
  };
3007
3251
  };
3008
- /** @description The locked quote has expired, so nothing was redeemed and no payment object was created — or the resource the request names is gone. Tell the two apart by `error.code`. **`QUOTE_EXPIRED`** — The locked quote behind this checkout passed its `expires_at`, so payment was refused before any payment object was created. Call `POST /v1/checkout` again on the same trip — it re-quotes — then mint a new Shared Payment Token against the new `agent_spt_params` and submit that. Nothing was charged. **`GONE`** — The resource this request names existed and no longer does. Re-acquire it — search again, or check out again to re-quote — then retry with the new identifier. Repeating this request with the same one cannot succeed. */
3252
+ /** @description The resource this request names no longer exists */
3009
3253
  410: {
3010
3254
  headers: {
3011
3255
  [name: string]: unknown;
@@ -3014,15 +3258,13 @@ export interface paths {
3014
3258
  /**
3015
3259
  * @example {
3016
3260
  * "error": {
3017
- * "code": "QUOTE_EXPIRED",
3018
- * "message": "The quote behind this checkout expired at 2026-09-04T12:39:56Z.",
3261
+ * "code": "GONE",
3262
+ * "message": "The resource no longer exists.",
3019
3263
  * "doc_url": "https://docs.gojinko.com/concepts/errors"
3020
- * },
3021
- * "expires_at": "2026-09-04T12:39:56Z",
3022
- * "quoted_cart_id": 2097152
3264
+ * }
3023
3265
  * }
3024
3266
  */
3025
- "application/json": components["schemas"]["QuoteExpiredResponse"] | components["schemas"]["ErrorResponse"];
3267
+ "application/json": components["schemas"]["ErrorResponse"];
3026
3268
  };
3027
3269
  };
3028
3270
  /** @description Validation error */
@@ -3119,6 +3361,8 @@ export interface paths {
3119
3361
  };
3120
3362
  };
3121
3363
  };
3364
+ put?: never;
3365
+ post?: never;
3122
3366
  delete?: never;
3123
3367
  options?: never;
3124
3368
  head?: never;
@@ -11584,7 +11828,7 @@ export interface components {
11584
11828
  * @example BAD_REQUEST
11585
11829
  * @enum {string}
11586
11830
  */
11587
- code: "AUTH_REQUIRED" | "PAYMENT_REQUIRED" | "RATE_LIMITED" | "BAD_REQUEST" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "GONE" | "QUOTE_EXPIRED" | "TRIP_EXPIRED" | "TRIP_STATE_CONFLICT" | "OFFER_EXPIRED" | "OFFER_UNAVAILABLE" | "MISSING_CUSTOMER_DETAILS" | "CURRENCY_UNSUPPORTED" | "HOTEL_NAME_LOW_CONFIDENCE" | "DESTINATION_LOW_CONFIDENCE" | "UPSTREAM_REJECTED" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_TIMEOUT" | "UPSTREAM_ERROR" | "INTERNAL";
11831
+ code: "credential_format_invalid" | "payment_type_not_enabled" | "payment_credential_invalid" | "trip_owned_by_other_payment" | "idempotency_key_reused" | "attempt_in_progress" | "quote_expired" | "attempt_terminal" | "temporarily_unavailable" | "AUTH_REQUIRED" | "PAYMENT_REQUIRED" | "RATE_LIMITED" | "BAD_REQUEST" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "GONE" | "QUOTE_EXPIRED" | "TRIP_EXPIRED" | "TRIP_STATE_CONFLICT" | "OFFER_EXPIRED" | "OFFER_UNAVAILABLE" | "MISSING_CUSTOMER_DETAILS" | "CURRENCY_UNSUPPORTED" | "HOTEL_NAME_LOW_CONFIDENCE" | "DESTINATION_LOW_CONFIDENCE" | "UPSTREAM_REJECTED" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_TIMEOUT" | "UPSTREAM_ERROR" | "INTERNAL";
11588
11832
  message: string;
11589
11833
  doc_url?: string;
11590
11834
  };
@@ -12047,7 +12291,7 @@ export interface components {
12047
12291
  * @example BAD_REQUEST
12048
12292
  * @enum {string}
12049
12293
  */
12050
- code: "AUTH_REQUIRED" | "PAYMENT_REQUIRED" | "RATE_LIMITED" | "BAD_REQUEST" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "GONE" | "QUOTE_EXPIRED" | "TRIP_EXPIRED" | "TRIP_STATE_CONFLICT" | "OFFER_EXPIRED" | "OFFER_UNAVAILABLE" | "MISSING_CUSTOMER_DETAILS" | "CURRENCY_UNSUPPORTED" | "HOTEL_NAME_LOW_CONFIDENCE" | "DESTINATION_LOW_CONFIDENCE" | "UPSTREAM_REJECTED" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_TIMEOUT" | "UPSTREAM_ERROR" | "INTERNAL";
12294
+ code: "credential_format_invalid" | "payment_type_not_enabled" | "payment_credential_invalid" | "trip_owned_by_other_payment" | "idempotency_key_reused" | "attempt_in_progress" | "quote_expired" | "attempt_terminal" | "temporarily_unavailable" | "AUTH_REQUIRED" | "PAYMENT_REQUIRED" | "RATE_LIMITED" | "BAD_REQUEST" | "FORBIDDEN" | "NOT_FOUND" | "CONFLICT" | "GONE" | "QUOTE_EXPIRED" | "TRIP_EXPIRED" | "TRIP_STATE_CONFLICT" | "OFFER_EXPIRED" | "OFFER_UNAVAILABLE" | "MISSING_CUSTOMER_DETAILS" | "CURRENCY_UNSUPPORTED" | "HOTEL_NAME_LOW_CONFIDENCE" | "DESTINATION_LOW_CONFIDENCE" | "UPSTREAM_REJECTED" | "UPSTREAM_UNAVAILABLE" | "UPSTREAM_TIMEOUT" | "UPSTREAM_ERROR" | "INTERNAL";
12051
12295
  message: string;
12052
12296
  doc_url?: string;
12053
12297
  };
@@ -12722,6 +12966,46 @@ export interface components {
12722
12966
  };
12723
12967
  intent?: components["schemas"]["IntentInput"];
12724
12968
  };
12969
+ PaymentAttemptOutcome: {
12970
+ payment_attempt_id: string;
12971
+ trip_id: string;
12972
+ quoted_cart_id: number;
12973
+ fulfillment_cart_id?: number;
12974
+ /** @enum {string} */
12975
+ payment_status: "not_started" | "pending" | "requires_authentication" | "authorized" | "captured" | "declined" | "cancelling" | "cancelled" | "expired" | "failed";
12976
+ booking_status: string;
12977
+ booking_ref?: string;
12978
+ payment_error: {
12979
+ /** @enum {string} */
12980
+ code: "credential_format_invalid" | "payment_type_not_enabled" | "payment_credential_invalid" | "trip_owned_by_other_payment" | "idempotency_key_reused" | "attempt_in_progress" | "card_declined" | "payment_credential_rejected" | "authentication_required" | "authentication_failed" | "authentication_abandoned" | "quote_expired" | "attempt_terminal" | "payment_outcome_unknown" | "fulfillment_dispatch_delayed" | "reconciliation_required" | "temporarily_unavailable";
12981
+ message: string;
12982
+ } | null;
12983
+ recovery: {
12984
+ /** @enum {string} */
12985
+ action: "poll" | "authenticate" | "retry_same_key" | "retry_new_key" | "recheckout" | "contact_support" | "stop";
12986
+ replacement_credential_required: boolean;
12987
+ };
12988
+ /** @enum {string} */
12989
+ recovery_status: "automatic" | "manual_review";
12990
+ /** Format: date-time */
12991
+ quote_expires_at?: string;
12992
+ retry_after_seconds?: number;
12993
+ authentication?: {
12994
+ url: string;
12995
+ /** Format: date-time */
12996
+ expires_at: string;
12997
+ };
12998
+ money?: {
12999
+ authorized?: components["schemas"]["Money"];
13000
+ captured?: components["schemas"]["Money"];
13001
+ released?: components["schemas"]["Money"];
13002
+ refunded?: components["schemas"]["Money"];
13003
+ externally_reimbursed?: components["schemas"]["Money"];
13004
+ /** @enum {string} */
13005
+ resolution_status?: "pending" | "resolved" | "manual_review";
13006
+ refund_reference?: string;
13007
+ };
13008
+ };
12725
13009
  BookingRef: {
12726
13010
  /** @example itm_4b91c2 */
12727
13011
  item_id?: string;
@@ -12756,6 +13040,7 @@ export interface components {
12756
13040
  hotel_id?: string;
12757
13041
  };
12758
13042
  GetTripResponse: {
13043
+ payment_attempt?: components["schemas"]["PaymentAttemptOutcome"];
12759
13044
  /** @example trip_1048576 */
12760
13045
  trip_id: string;
12761
13046
  /**
@@ -12877,6 +13162,18 @@ export interface components {
12877
13162
  expires_at?: string;
12878
13163
  };
12879
13164
  CheckoutResponse: {
13165
+ quoted_cart_id: number;
13166
+ accepted_payment_types: {
13167
+ /** @enum {string} */
13168
+ type: "spt" | "card";
13169
+ card_kinds?: ("customer_card" | "vcc")[];
13170
+ requires: {
13171
+ headers: string[];
13172
+ fields: string[];
13173
+ };
13174
+ /** @enum {string} */
13175
+ authentication: "customer_handoff" | "unavailable";
13176
+ }[];
12880
13177
  /** @example cs_1048576 */
12881
13178
  session_id?: string;
12882
13179
  /** @example https://book.gojinko.com/checkout?sid=1048576 */
@@ -12921,6 +13218,18 @@ export interface components {
12921
13218
  checkout_url?: string;
12922
13219
  recap_token?: string;
12923
13220
  };
13221
+ PaymentRefusalResponse: components["schemas"]["ErrorResponse"] & {
13222
+ payment_error?: {
13223
+ /** @enum {string} */
13224
+ code: "credential_format_invalid" | "payment_type_not_enabled" | "payment_credential_invalid" | "trip_owned_by_other_payment" | "idempotency_key_reused" | "attempt_in_progress" | "card_declined" | "payment_credential_rejected" | "authentication_required" | "authentication_failed" | "authentication_abandoned" | "quote_expired" | "attempt_terminal" | "payment_outcome_unknown" | "fulfillment_dispatch_delayed" | "reconciliation_required" | "temporarily_unavailable";
13225
+ message: string;
13226
+ } | null;
13227
+ recovery?: {
13228
+ /** @enum {string} */
13229
+ action: "poll" | "authenticate" | "retry_same_key" | "retry_new_key" | "recheckout" | "contact_support" | "stop";
13230
+ replacement_credential_required: boolean;
13231
+ };
13232
+ };
12924
13233
  QuoteExpiredResponse: {
12925
13234
  error: {
12926
13235
  /** @enum {string} */
@@ -12939,6 +13248,40 @@ export interface components {
12939
13248
  */
12940
13249
  quoted_cart_id?: number;
12941
13250
  };
13251
+ TypedAgentPaymentSubmitRequest: {
13252
+ trip_id: string;
13253
+ quoted_cart_id: number;
13254
+ payment: {
13255
+ /** @enum {string} */
13256
+ type: "spt";
13257
+ shared_payment_token: string;
13258
+ } | {
13259
+ /** @enum {string} */
13260
+ type: "card";
13261
+ /** @enum {string} */
13262
+ card_kind: "customer_card" | "vcc";
13263
+ /** @description 12–19 digits after removing spaces, with a valid Luhn checksum. Forwarded unchanged. */
13264
+ number: string;
13265
+ exp_month: number;
13266
+ /** @description Four-digit expiry year, at least the current UTC year. */
13267
+ exp_year: number;
13268
+ cvc: string;
13269
+ billing_details?: {
13270
+ name?: string;
13271
+ /** Format: email */
13272
+ email?: string;
13273
+ phone?: string;
13274
+ address?: {
13275
+ line1?: string;
13276
+ line2?: string;
13277
+ city?: string;
13278
+ state?: string;
13279
+ postal_code?: string;
13280
+ country?: string;
13281
+ };
13282
+ };
13283
+ };
13284
+ };
12942
13285
  AgentPaymentSubmitRequest: {
12943
13286
  /** @example trip_1048576 */
12944
13287
  trip_id: string;