DEVELOPER
Products

Embedded Checkout Fields Integration Guide


Base URL
https://checkout-api.north.com

Embed individual payment fields directly into your existing form. The Embedded Fields integration method gives you complete control over your checkout layout while we securely handle the sensitive payment information for you. All sensitive transaction data is sent directly from the hosted fields to the payment processor, bypassing your server environment and reducing your PCI compliance requirements.


Quick Start


What You'll Build

Use this guide to embed payment fields into your custom checkout form. You control the form layout and submit button, while the embedded fields securely capture payment details. When your customer submits your form, you'll call our submit method to process the payment and handle the result.


Checkout Flow

  1. Add the checkout.js script to your page.
  2. For each payment attempt, create a checkout session on your server.
  3. Mount the payment fields in your form. Access the global checkout object exposed by the script. checkout.mount() will use the session token to render the secure payment fields inside the specified DOM element on your page.
  4. Submit the payment when your form is submitted using checkout.submit().
  5. Handle the payment response by configuring a webhook in the Embedded Checkout Designer.

Prerequisites

Before you begin, ensure you complete the following prerequisites. Your private keys and IDs can be obtained by navigating to your North Developer dashboard and selecting a checkout instance.

Get started quickly by downloading the provided sample code from a checkout instance on your dashboard, including the code for your customized fields as well as the backend code required to submit payments from your website. You'll need:



Step 1: Create a Checkout Session

From your server, create a checkout session by calling the Create Session API endpoint and passing your private API key in the header as a bearer token. This request returns a short-lived token that you'll pass to your client to mount the payment fields. Sessions expire after 30 minutes.

The request body must include an amount, an array of products, or both. For example, if you're building an ecommerce store with a shopping cart, you may want to provide an array of products. If you're building an online donation page, you may only wish to provide the amount.

If both are provided, the calculated total amount of the products must match the provided amount value. Additionally, when the payment request is submitted, the amount in the request must match the amount in the session object.


API Endpoint


Request Headers

HeaderValue
Content-Typeapplication/json
AuthorizationBearer {YOUR_PRIVATE_API_KEY}

Request Body


Request Parameters

(*required if products array is provided)



Example cURL Request


Response


Step 2: Add the Checkout Script

Include the checkout.js script on your page. This script provides the checkout object used to mount the payment fields and submit payments.


Script Tag

The payment fields will render inside the specified div. You control everything else—form layout, additional fields, and the submit button. The data entered by the customer into the hosted payment fields will not enter your server environment.


Step 3: Mount the Payment Fields

On your client, fetch the session token from your server and call checkout.mount() to render the payment input fields on your page.


Mounting Example


Parameters


Step 4: Submit the Payment

When your form is submitted, call checkout.submit() to process the payment. This method triggers the secure payment processing and returns a promise with the payment result.


Submit Method Signature


How It Works

  1. Your customer fills in the payment fields.
  2. When they click your submit button, your code calls checkout.submit().
  3. The method securely transmits the payment data.
  4. A promise resolves with the payment result.
  5. You process the rest of the form.

Important: The checkout.submit() method must be called after the fields have been mounted. If you call it before mounting, it will throw an error.


Step 5: Handle the Payment Response

The checkout.submit() method returns a promise that resolves with the payment result.


Response Structure


Success Response


Failure Response


Key Response Fields


Step 6: Test the Integration

When a checkout is in Draft Mode, requests are automatically made in the Sandbox environment. When you're ready to go live and make requests in the Production environment, we'll certify your checkout with no need to manually switch environments.

In Draft Mode, requests are sent to the payment processor's Sandbox environment, guaranteeing that your tests receive real results from the processor, not mock responses, so that you can build accurate response handling into your application with confidence. To test various payment response codes in Draft Mode, the transaction amount can be modified to a designated value that will trigger a specific response code. Read more about response code triggers.

UI/UX testing can also be done from the Checkout Designer using the integrated card testing tools, however these are mock payment requests that do not return real results from the payment processor.

Use the following test card numbers in the Sandbox environment:


Card NumberBrandResult
4111 1111 1111 1111VisaSuccessful transaction
3700 000000 00002AmexSuccessful transaction

Test Card Details:

  • Expiration: Any future date (e.g., "12/25")
  • CVV: Any 3 digits (e.g., "123") or 4 digits for Amex
  • ZIP: Any 5 digits (e.g., "12345")

Success Checklist

Before certification, verify your integration:

  • Payment fields render correctly on your page
  • Test card transactions are approved successfully
  • Declined card transactions show proper error messages
  • Your form validates properly before submission
  • Success response redirects or displays confirmation
  • Error states are handled gracefully
  • Mobile responsiveness works as expected

Customization Options

The Embedded Fields integration supports extensive styling customization through the Checkout Designer. Available options include:


Colors

  • Secondary Background Color - Background color for field containers
  • Border Color - Border color for input fields
  • Input Background - Background color inside inputs
  • Input Focus Color - Border/highlight color when input is focused
  • Text Color - Color for input text
  • Placeholder Color - Color for placeholder text

Typography

  • Body Font - Font family for all text
  • Input Font Size - Size of text in input fields
  • Placeholder Font Weight - Font weight for placeholder text

Layout

  • Border Width - Width of input borders
  • Border Radius - Roundness of input corners
  • Input Padding - Internal padding within inputs
  • Input Y Gap - Vertical spacing between fields
  • Input X Gap - Horizontal spacing between fields

Field Options

  • Cardholder Name - Show/hide the cardholder name field
  • Input Placeholders - Show/hide placeholder text
  • Input Labels - Show/hide field labels

Configure these options in the Checkout Designer.


Additional Notes


Protect Your API Keys

  • Never expose your private API key in client-side code
  • Store API keys in environment variables
  • Generate session tokens only on your server

Domain Restriction

In the Production environment, the domain where your checkout is hosted is limited to the domain set during checkout configuration. This prevents unauthorized use of your checkout configuration. This rule is not applied in Draft Mode.


Session Token Expiration

Session tokens expire after 30 minutes. Generate a new token for each checkout session rather than reusing tokens.


Submit Timeout

The checkout.submit() method has a 10-second timeout. If the payment processing takes longer than 10 seconds, the promise will reject with a timeout error. Handle this gracefully in your error handling:


Error Handling Best Practices

Always wrap your submit call in a try-catch block and handle both the response types and potential errors:


Secondary Transactions

After completing an initial sale, a transaction token is returned in the response that can be used for subsequent payment functionality, such as voids, refunds, and reversals. View the API Specification to learn more about these transaction types.


Next Steps

Now that you've added Embedded Checkout Fields to your website, you can:

  • Manage Your Checkouts - View and manage your checkout configurations in the dashboard.
  • Contact Support - Get help with your integration.
  • Certify and Go Live - Start the certification process with our support team. Once we confirm everything is working as expected, you'll be ready to start accepting payments in the Production environment.



Top of Page
// server.js
// This server creates checkout sessions by securely calling the Embedded Checkout API

const express = require('express');
const app = express();

// Enable JSON parsing for incoming request bodies
app.use(express.json());

// Endpoint that your client-side code will call to create a session
app.post('/api/create-checkout-session', async (req, res) => {
  try {
    // Call the Create Session API endpoint to create a new checkout session
    // This returns a short-lived token (30 min) for rendering the payment fields
    const response = await fetch('https://checkout-api.north.com/public/api/sessions', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        // Authenticate with your private API key (stored in an environment variable)
        'Authorization': `Bearer ${process.env.CHECKOUT_PRIVATE_KEY}`
      },
      body: JSON.stringify({
        // Your checkout configuration ID from the Checkout Designer
        checkoutId: process.env.CHECKOUT_ID,
        // Your merchant profile identifier
        profileId: process.env.PROFILE_ID,
        // Product details passed from the client (name, price, quantity, logoUrl)
        products: req.body.products
      })
    });

    // Handle API errors by forwarding the error response to the client
    if (!response.ok) {
      const error = await response.json();
      return res.status(response.status).json(error);
    }

    // Return the session data (including token) to the client
    const session = await response.json();
    res.json(session);
  } catch (error) {
    // Log server-side errors for debugging
    console.error('Session creation error:', error);
    res.status(500).json({ error: 'Failed to create session' });
  }
});

// Start the server
app.listen(3000, () => {
  console.log('Server running on port 3000');
});
©2026 North is a registered DBA of NorthAB, LLC. All rights reserved. North is a registered ISO of BMO Harris Bank N.A., Chicago, IL, Citizens Bank N.A., Providence, RI, The Bancorp Bank, Philadelphia, PA, FFB Bank, Fresno, CA, Wells Fargo Bank, N.A., Concord, CA, and PNC Bank, N.A.