Seamless ACH Open API settings

How to rotate your
Seamless ACH API keys

This guide walks you through the rotation and lists every place where your keys may live.

🔑Current keys → ✓New publishable & secret key

Overview

What rotation does

Rotating replaces your keys in one click. Your account, customers, payments and webhook URL stay exactly as they are.

2
Keys replaced

The publishable key (pk_) and the secret key (sk_) are always replaced together.

0
Grace period

Old keys stop working the moment you confirm. Requests that still use them are rejected.

100%
Data kept

Customers, transactions, bank accounts and your webhook URL are not affected.

⚠

Old keys stop working immediately

There is no overlap between the old and the new keys. Until you paste the new keys into your integrations, payments through them will fail. Prepare everything first, rotate during a low-traffic window, and update all places right away — usually it takes about 15 minutes.

Preparation

Before you start

Five minutes of preparation makes the switch seamless for your customers.

  • List every place your keys are used. Use the checklist below — the WordPress plugin, your website checkout, your server code, webhook handler, Postman, and any third-party tools.
  • Make sure you can edit each of them right now — WordPress admin, hosting or server access, environment variables / secret manager, deploy pipeline.
  • Pick a quiet time. Customers who are in the middle of a checkout at the moment of rotation may need to start again.
  • Have a secure place for the new secret key — a password manager or your secret manager. Never send it by email or chat, and never put it into website code.

Inventory

Where your keys may be used

After the rotation, every item that applies to you must get the new key. pk_ = publishable key, sk_ = secret key.

🧩

WordPress / WooCommerce plugin

WordPress admin → wp-admin/admin.php?page=seamless-ach_gateway → Live Secret Key and Test Secret Key. The plugin uses secret keys only.

How to update →
sk_ · sk_test_
🛒

Checkout.js on your website

The publicKey value in new SEAMLESSACH({…}) on your checkout page, including custom checkout builds and authorization-only / on-demand flows.

How to update →
pk_ · pk_test_
🏦

Plaid bank-link URL or iframe

Links like dashboard.seamlesschex.com/ach/#/bank-account/{PUBLIC_KEY}/{USER_ID} that you build for customers or embed in an iframe — and any such links you have already saved or sent.

How to update →
pk_ · pk_test_
🖥️

Your server code (REST API)

The Authorization: Bearer … header of every server-to-server API call: customers, funding sources, payments, invoices, payment links, subscriptions, payouts.

How to update →
sk_ · sk_test_
🔔

Your webhook handler

If your endpoint checks the Authorization header of incoming Seamless ACH webhooks, it compares it with your secret key.

How to update →
sk_ · sk_test_
🧪

Postman and testing tools

The secretKey variable of the Seamless ACH Postman collection or environment, test scripts, and API clients.

How to update →
sk_ · sk_test_
⚙️

Everything else

Environment variables and .env files, secret managers, CI/CD settings, staging servers, mobile-app backends, CRM / no-code automations and agencies or developers who built your integration.

How to update →
pk_sk_

Step by step

Rotate your Live keys in the dashboard

Live keys are rotated in your regular dashboard. Sandbox keys are rotated separately — see Rotate your Sandbox keys.

  1. Open the Seamless ACH API settings

    Sign in at dashboard.seamlesschex.com and go to Account Settings → Seamless ACH API, or open the page directly:

    dashboard.seamlesschex.com/ach/#/account/api

    Seamless ACH dashboard, Account Settings, Seamless ACH API tab: Live block with the Regenerate Live Keys button, API endpoint, publishable key, secret key and webhook URL
    Account Settings → Seamless ACH API. The Regenerate Live Keys button is next to the Live title. Keys on the screenshot are replaced with placeholders. Tap the image to see the full page.
  2. Click “Regenerate Live Keys” and confirm

    Click the blue refresh button next to Live (tooltip Regenerate Live Keys). A Please confirm — Update Api Keys dialog appears: click Confirm to replace the keys, or Cancel to keep the current ones.

    Please confirm dialog with the text Update Api Keys and the Cancel and Confirm buttons, over the Seamless ACH API settings page
    The confirmation dialog. Nothing changes until you click Confirm. Tap the image to see the full page.

    A green Success — Api keys Successfully Updated message appears in the top-right corner, and the Publishable key and Secret key fields now show your new keys. The API Endpoint and WebHook Url stay the same.

    Seamless ACH API settings after rotation: Success message Api keys Successfully Updated and the new publishable and secret keys
    After confirming: the success message and the new keys. Keys on the screenshot are replaced with placeholders. Tap the image to see the full page.
    ⚠

    From this moment the old keys no longer work

    Move straight on to the next steps.

  3. Copy the new keys

    The API Endpoint does not change: https://api.seamlesschex.com/ach/v2

    The page shows your new Publishable key (pk_…) and Secret key (sk_…). Use the copy button next to each field so nothing is mistyped, and store the secret key in a password manager or secret manager.

  4. Update every integration

    Paste the new keys into each place from the inventory. Detailed instructions for each one are below.

  5. Check your webhook URL

    Rotation does not change your WebHook Url. Make sure it is still filled in on the same page; if you edit it, click Save and wait for the “Well done! You WebHook Url working.” message.

  6. Run a test payment

    Place a small test order through each integration — plugin, Checkout.js, API — and confirm that the transaction appears in your dashboard and that your webhook handler received the status update.

↻

Repeat the same steps in Sandbox

If you use a sandbox account, rotate your sandbox keys the same way right after the live ones — see Rotate your Sandbox keys below.

After rotation

Where to replace the keys

Go through every section that applies to your setup.

  1. WordPress / WooCommerce plugin secret key

    • Sign in to your WordPress admin and open the Seamless ACH plugin settings:
      wp-admin/admin.php?page=seamless-ach_gateway
    • Paste the new live secret key into Seamless ACH Live Secret Key (sk_…).
    • If you also rotated sandbox keys, paste the new one into Seamless ACH Test Secret Key (sk_test_…).
    • Check that Mode is set correctly (Live or Sandbox) and save the settings.
    • The plugin's webhook URL does not change — no update is needed in the dashboard.
    Seamless ACH WordPress plugin settings: Mode, Seamless ACH Live Secret Key and Seamless ACH Test Secret Key fields
    Seamless ACH plugin → Integration Settings. Only the two secret key fields need the new values. Tap the image to see the full settings page.

    Docs: Installation Guide — Seamless ACH x WooCommerce · Sync order statuses via webhooks

  2. Checkout.js publishable key

    Find the place where your site creates the checkout and replace the publicKey value. Use the publishable key only:

    var seamlessach = new SEAMLESSACH({
      publicKey: 'pk_xxxxxxxxxxxxxxxxxxxxxxxxxx', // new publishable key (pk_test_… for sandbox)
      sandbox: false,                          // true together with a pk_test_ key
      displayMethod: 'iframe',
      // …the rest of your configuration stays the same
    });
    • Search your site's code and theme files for publicKey and pk_ — the key may be in a template, a JS bundle or a tag manager.
    • If your site is built and deployed (React, Vue, Angular, etc.), rebuild and redeploy, then clear the CDN / browser cache.
    • Make sure the SDK script is loaded from https://dev-ach.seamlesschex.com/checkoutjs/sdk-min.js.
    ⛔

    Never put the secret key into the website

    Anything in the browser is visible to every visitor. Checkout.js only needs the publishable key, and requests that use a secret key from a browser are rejected.

    Docs: Checkout.js Documentation · Direct Debits / Credits / Subscriptions · On-Demand Payments

  3. Plaid bank-link URL or iframe publishable key

    If you send customers to the hosted bank-linking page or embed it in an iframe, the publishable key is part of the URL. Rebuild it with the new key:

    https://dashboard.seamlesschex.com/ach/#/bank-account/pk_xxxxxxxxxxxxxxxxxxxxxxxxxx/{USER_ID}?successUrl={SUCCESS_URL}&cancelUrl={CANCEL_URL}
    • Update the code or template that builds the link and the src of the iframe.
    • Links that were already generated with the old key (in emails, SMS, saved pages) stop working — send customers a new link.

    Docs: Plaid Authorization (Bank Account Verification)

  4. Your server code — REST API secret key

    Every server-to-server call is authorized with the secret key. Replace it where your application reads it — ideally a single environment variable or secret:

    curl -X GET https://api.seamlesschex.com/ach/v2/user/{user_id} \
      -H "Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxx" \
      -H "Content-Type: application/json"
    
    # .env
    SEAMLESS_ACH_SECRET_KEY=sk_xxxxxxxxxxxxxxxxxxxxxxxxxx
    • Update every environment: production, staging, background workers, cron jobs and serverless functions.
    • Restart or redeploy the services so they pick up the new value.
    • Check your logs for 401 / 403 responses after the switch — they point to a place that still uses the old key.

    Docs: Seamless ACH API — Quick-Start · API Reference

  5. Your webhook handler secret key

    Seamless ACH webhook requests carry your secret API key in the Authorization header. If your handler verifies that header, update the expected value to the new secret key.

    • For a short transition period, accept both the old and the new secret key: retries of events created before the rotation may still arrive with the previous key. Remove the old key after a few days.
    • Your webhook URL itself does not change. You can see and test it on the same Seamless ACH API page.

    Docs: Webhooks Overview · Set Webhook URL

  6. Postman and testing tools secret key

    • In Postman, open the environment (or collection variables) you use with the Seamless ACH REST API collection and update the secretKey value.
    • Update automated tests, monitoring checks and local developer configs.
    • Do not commit keys to Git — if a key was ever committed, consider it exposed and rotate it.
  7. Everything else

    • Secret managers and environment variables — AWS Secrets Manager, Google Secret Manager, Vault, Heroku / Vercel / Netlify settings, Docker and Kubernetes secrets.
    • CI/CD — GitHub Actions / GitLab CI secrets and deploy pipelines.
    • Third-party tools and automations — CRM, Zapier / Make, accounting or e-commerce connectors where you pasted a Seamless ACH key.
    • Developers and agencies — if someone else maintains your integration, send them the new key through a secure channel, not email or chat.

Testing environment

Rotate your Sandbox keys

Do exactly the same rotation in your sandbox account. Sandbox keys (pk_test_ / sk_test_) are separate from your live keys, so rotating live keys does not change them — and the other way around.

  1. Sign in to your sandbox account

    On the Seamless ACH API page, click Sign In in the Sandbox block, or sign in at sandbox.seamlesschex.com/ach.

  2. Open the Seamless ACH API settings

    Go to Account Settings → Seamless ACH API:

    sandbox.seamlesschex.com/ach/#/account/api

  3. Click “Regenerate Sandbox Keys” and confirm

    Click the refresh button, then Confirm in the same Please confirm — Update Api Keys dialog. Wait for the green Success — Api keys Successfully Updated message. The old sandbox keys stop working immediately.

  4. Copy the new sandbox keys

    Copy the new Publishable key (pk_test_…) and Secret key (sk_test_…). The sandbox API Endpoint does not change: https://sandbox.seamlesschex.com/ach/v2

  5. Update your test integrations

    • WordPress plugin → Seamless ACH Test Secret Key (sk_test_…) at wp-admin/admin.php?page=seamless-ach_gateway
    • Test checkout → publicKey: 'pk_test_…' with sandbox: true
    • Sandbox Plaid bank-link URLs, staging servers, test webhook handler and Postman → new pk_test_ / sk_test_
  6. Run a test payment in sandbox

    Place a test order (sandbox amounts must be under $99.99) and confirm that it appears in your sandbox dashboard and that your test webhook handler received the update.

ℹ

Don't see sandbox keys?

If the Sandbox block says that access has been requested, sandbox is not activated for your account yet — there is nothing to rotate there.

Good to know

Publishable vs. secret key

Use each key only where it belongs.

KeyPrefixWhere it belongsNever put it
Publishable — Livepk_Checkout.js, Plaid bank-link URL— it is meant for the browser
Secret — Livesk_Your server, WordPress plugin settings, secret managerWebsite code, JS bundles, mobile apps, email, chat, Git
Publishable — Sandboxpk_test_Test checkout with sandbox: trueYour live checkout
Secret — Sandboxsk_test_Staging server, plugin Test Secret Key, PostmanWebsite code, public repositories
⚠

If a secret key was ever exposed

If your secret key was ever placed in website code, shared by email or chat, or committed to a repository, rotate it as soon as possible — the old key is invalidated the moment you rotate.

FAQ

Frequently asked questions

Quick answers to the questions that come up most often during key rotation.

Will my old keys keep working for a while?

No. The old publishable and secret keys stop working as soon as you confirm the rotation. That's why we recommend preparing all places in advance.

Can I rotate only the secret key?

No. Rotation always issues a new publishable key and a new secret key together, so both need to be updated.

Does my webhook URL change?

No. Your webhook URL stays the same. If your webhook handler checks the secret key in the Authorization header, update the expected key (see Your webhook handler).

Will my customers, transactions or bank accounts be affected?

No. Your data stays exactly as it is. Only requests that still use the old keys will be rejected until you update them.

What happens to customers who are paying at the moment of rotation?

A checkout that was opened with the old publishable key may fail and the customer may need to start again. Rotate during a quiet time to minimize this.

I use only the WordPress plugin. What do I need to change?

Only the Live Secret Key (and the Test Secret Key, if you rotated sandbox keys) in the plugin settings. If your site also loads Checkout.js separately, update its publishable key too.

How do I know I updated everything?

Run a test payment through each integration and watch your server logs for 401 / 403 errors for a day. Any such error points to a place that still uses the old key.

Need help with the rotation?

Contact us at [email protected] or call 888-998-2439.