Create order for manual authorization

DocsLimited

Last updated: Oct 13th, 10:56pm

Manual authorization requires a separate authorization call after buyer approval and provides more control over the payment process. Create orders for manual authorization using two available flows.

  • Single-step flow: Include payment source details directly in the create order request for a streamlined integration
  • Multi-step flow: Create the order first, then add payment source details in a separate step for more flexibility

Single-step flow

Use a valid access token and send a POST request /v2/checkout/orders with request body parameters including intent, purchase_units with amount and currency, payment_source with Klarna details.

On successful order creation, complete the Klarna payment with these steps:

  1. Review order response: PayPal returns order ID with PAYER_ACTION_REQUIRED status and payer-action link
  2. Redirect your buyer: Send the buyer to the payer-action URL to complete payment on Klarna's platform
  3. Monitor payment status: Buyer approves payment and order status changes to APPROVED
  4. Authorize the payment: Call the authorize payment endpoint to complete manual authorization
  5. Capture the payment: Send POST request to /v2/payments/authorizations/{authorization_id}/capture with the authorization ID from the authorization response
  6. Notify the buyer: Send order confirmation to the buyer
  1. Sample request
  2. Sample response
1curl -X POST https://api.sandbox.paypal.com/v2/checkout/orders \
2 -H 'Content-Type: application/json' \
3 -H 'Authorization: Bearer <ACCESS-TOKEN>' \
4 -H 'PayPal-Request-Id: <REQUEST-ID>' \
5 -d '{
6 "intent": "AUTHORIZE",
7 "purchase_units": [
8 {
9 "payee": {
10 "merchant_id": "YR8FPJ7TDVD6A"
11 },
12 "amount": {
13 "currency_code": "GBP",
14 "value": 30,
15 "breakdown": {
16 "item_total": {
17 "currency_code": "GBP",
18 "value": 30
19 },
20 "shipping": {
21 "currency_code": "GBP",
22 "value": "0.00"
23 },
24 "handling": {
25 "currency_code": "GBP",
26 "value": "0.00"
27 },
28 "tax_total": {
29 "currency_code": "GBP",
30 "value": "0.00"
31 },
32 "shipping_discount": {
33 "currency_code": "GBP",
34 "value": "0.00"
35 }
36 }
37 },
38 "items": [
39 {
40 "name": "jersey",
41 "description": "jersey",
42 "sku": "",
43 "unit_amount": {
44 "currency_code": "GBP",
45 "value": "15.00"
46 },
47 "tax": {
48 "currency_code": "GBP",
49 "value": "0.00"
50 },
51 "category": "PHYSICAL_GOODS",
52 "quantity": "1"
53 },
54 {
55 "name": "jersey",
56 "description": "jersey",
57 "sku": "",
58 "unit_amount": {
59 "currency_code": "GBP",
60 "value": "15.00"
61 },
62 "tax": {
63 "currency_code": "GBP",
64 "value": "0.00"
65 },
66 "category": "PHYSICAL_GOODS",
67 "quantity": "1"
68 }
69 ]
70 }
71 ],
72 "payment_source": {
73 "klarna": {
74 "authorization_context": {
75 "authorization_expiry": "2025-09-29T23:37:39Z"
76 },
77 "country_code": "GB",
78 "billing_address": {
79 "address_line_1": "10 New Burlington Street",
80 "admin_area_2": "London",
81 "admin_area_1": "Greater London",
82 "postal_code": "W1S 3BE",
83 "country_code": "GB"
84 },
85 "name": {
86 "given_name": "Test",
87 "surname": "Person-uk"
88 },
89 "email_address": "customer@email.uk",
90 "phone": {
91 "national_number": "7755564318",
92 "country_code": "44"
93 },
94 "experience_context": {
95 "locale": "en-GB",
96 "acquiring_channel": "ECOMMERCE",
97 "return_url": "https://www.example.com/returnUrl",
98 "cancel_url": "https://www.example.com/cancelUrl"
99 }
100 }
101 },
102 "application_context": {
103 "client_configuration": {
104 "api": "ORDERS_V2",
105 "experience": {
106 "entry_point": "PAY_WITH_ALTPAY_KLARNA",
107 "payment_method": "PAY_WITH_ALTPAY_KLARNA"
108 }
109 }
110 }
111 }'

Multi-step flow

Use a valid access token and send a POST request to /v2/checkout/orders with request body parameters including intent, purchase_units with amount and currency, and the PayPal-Request-Id header for idempotency.

On successful order creation, complete the Klarna payment with these steps:

  1. Review order response: PayPal returns order ID with CREATED status and approve link
  2. Add payment source details: Choose one of two options:
    • Send POST request to /v2/checkout/orders/{order_id}/confirm-payment-source with complete payment_source.klarna object
    • Include payment source details in the authorization call (step 4)
  3. Redirect your buyer: Send the buyer to the approve URL to complete payment approval
  4. Monitor payment status: Buyer approves payment and order status changes to APPROVED
  5. Authorize the payment: Call the authorize payment endpoint to complete manual authorization
  6. Capture the payment: Send POST request to /v2/payments/authorizations/{authorization_id}/capture with the authorization ID from the authorization response
  7. Notify the buyer: Send order confirmation to the buyer
  1. Sample request
  2. Sample response
1curl -X POST https://api.sandbox.paypal.com/v2/checkout/orders \
2 -H 'Content-Type: application/json' \
3 -H 'Authorization: Bearer <ACCESS-TOKEN>' \
4 -H 'PayPal-Request-Id: <REQUEST-ID>' \
5 -d '{
6 "intent": "AUTHORIZE",
7 "purchase_units": [
8 {
9 "payee": {
10 "merchant_id": "YR8FPJ7TDVD6A"
11 },
12 "amount": {
13 "currency_code": "GBP",
14 "value": 30,
15 "breakdown": {
16 "item_total": {
17 "currency_code": "GBP",
18 "value": 30
19 },
20 "shipping": {
21 "currency_code": "GBP",
22 "value": "0.00"
23 },
24 "handling": {
25 "currency_code": "GBP",
26 "value": "0.00"
27 },
28 "tax_total": {
29 "currency_code": "GBP",
30 "value": "0.00"
31 },
32 "shipping_discount": {
33 "currency_code": "GBP",
34 "value": "0.00"
35 }
36 }
37 },
38 "items": [
39 {
40 "name": "jersey",
41 "description": "jersey",
42 "sku": "",
43 "unit_amount": {
44 "currency_code": "GBP",
45 "value": "15.00"
46 },
47 "tax": {
48 "currency_code": "GBP",
49 "value": "0.00"
50 },
51 "category": "PHYSICAL_GOODS",
52 "quantity": "1"
53 },
54 {
55 "name": "jersey",
56 "description": "jersey",
57 "sku": "",
58 "unit_amount": {
59 "currency_code": "GBP",
60 "value": "15.00"
61 },
62 "tax": {
63 "currency_code": "GBP",
64 "value": "0.00"
65 },
66 "category": "PHYSICAL_GOODS",
67 "quantity": "1"
68 }
69 ]
70 }
71 ],
72 "application_context": {
73 "client_configuration": {
74 "api": "ORDERS_V2",
75 "experience": {
76 "entry_point": "PAY_WITH_ALTPAY_KLARNA",
77 "payment_method": "PAY_WITH_ALTPAY_KLARNA"
78 }
79 }
80 }
81 }'
Parameter name Description
intent
Required, string
Indicates whether payment is captured immediately or authorized for later capture.

For Klarna payments, set to AUTHORIZE.

processing_instruction
string
Specifies how the order is processed.

For manual authorization flow, exclude this parameter or set to NO_INSTRUCTION.
purchase_units
Required, array
Lists the items or services the buyer is purchasing in the order.
purchase_units.amount
Required, object
Amount of the order and the currency code.

For supported currencies, see Supported countries and currencies.

payment_source
object
Payment method used to fund the order. For Klarna payments, include a klarna object with buyer and experience context information.
payment_source.klarna.authorization_context
object
Payment authorization settings with expiration time.
payment_source.klarna.authorization_context.expiration_time
string
Timestamp of when the authorization expires, specified in UTC format.
payment_source.klarna.country_code
Required, object
Country where the buyer is located. Use 2-character ISO 3166-1 alpha-2 country code.
payment_source.klarna.name.given_name
Required, object
Buyer's first name.
payment_source.klarna.name.surname
Required, object
Buyer's last name.
payment_source.klarna.billing_address
Required, object
Buyer's billing address information including address lines, city, state, postal code, and country.
payment_source.klarna.experience_context
Required, object
Context information for the Klarna payment experience including locale, intent, and acquiring channel.
payment_source.klarna.experience_context.locale
Required, object
Locale for the Klarna payment experience. For example, en-GB, en-US.
application_context
object
Application context for the order. Customizes the buyer experience during the approval process.

application_context.return_url
string
URL to redirect the buyer after they approve the payment.

application_context.cancel_url
string
URL to redirect the buyer if they cancel the approval.