Frame

Connect your platform's Frame account to process credit card and ACH transactions through Preczn.

Connect your platform's Frame account to process credit card and ACH transactions through Preczn.

Frame is a payment processor that supports card and ACH (bank account) payments. Frame credentials are held at the platform level: your platform's Frame API keys are configured once on the Preczn connection, and each merchant is identified by the Frame account ID assigned to them.

Supported Capabilities

CapabilityStatusNotes
Credit Card TransactionsSupportedSale, auth, capture, void, and refund
ACH (Bank Account) TransactionsSupportedSale and refund only
Merchant OnboardingNot supportedMerchant accounts are created with Frame directly, then linked in Preczn
Apple Pay / Google PayNot supportedWallet transactions cannot be routed to Frame

Supported Transaction Types

TypeCardACHDescription
SaleAuthorize and capture in a single request
AuthAuthorize only (hold funds without capturing)
CaptureCapture a previous authorization
VoidCancel an authorization (see Voids)
RefundReturn funds from a completed transaction
VerifyNot offered by Frame
📘

ACH is sale and refund only

ACH has no authorization hold at Frame. An ACH auth is rejected with ACH is not supported for Frame authorization transactions. ACH supports sale and refund only. Use a sale instead of auth + capture, and refund an ACH transaction rather than voiding it.

A Verify request to Frame — card or bank account — is rejected with Verify is not supported for Frame. Frame offers no zero-dollar authorization; card details are validated when the first real transaction is processed.

Credentials

Frame credentials are split across two levels:

CredentialLevelWhere it comes from
Publishable KeyPlatformFrame dashboard — pk_sandbox_… / pk_production_…
Secret KeyPlatformFrame dashboard — sk_sandbox_… / sk_production_…
Account IDMerchantThe Frame account ID for that merchant

There is no per-merchant Frame secret. Every request Preczn sends to Frame authenticates with the platform secret key and is scoped to the merchant by the account ID.

Adding the Platform Connection

  1. Select Connections from the left-hand navigation.
  2. On the Add Connections tab, select Connect under Frame.
  3. Enter a name for the connection.
  4. Enter your Publishable Key and Secret Key.
  5. Select Verify Connection.
⚠️

Key prefixes must match the mode

Frame serves its sandbox and production environments from the same address and tells them apart by the key prefix. A Test Mode connection requires sk_sandbox_ / pk_sandbox_ keys and a Live connection requires sk_production_ / pk_production_ keys. A mismatch is rejected before the connection is saved — for example, Invalid secret key. Test secret keys must start with the prefix "sk_sandbox_". There is no environment or URL field to set.

Verification confirms that Frame accepts your secret key. If it fails, the message tells you which case you hit:

MessageWhat it means
Invalid API credentialsFrame rejected the secret key. Check for a copy error or a revoked key.
Unrecognized Frame secret key formatThe value is not an sk_sandbox_ / sk_production_ key — a publishable key pasted into the Secret Key field lands here.
Frame service unavailable, please try againFrame returned a server error. The key was not rejected; retry.

Saving the connection also creates a Default Frame Plan for routing, and registers Preczn's webhook endpoint with Frame — see Webhooks.

Adding a Merchant's Account ID

A merchant is connected to Frame by storing the Frame account ID on their Preczn merchant connection. The account ID can be supplied three ways.

Dashboard

  1. Navigate to Merchants and open the merchant.
  2. In the merchant's Connections pane, select Frame.
  3. Enter the Account ID and save the connection.

The merchant's Frame connection stays Unconfigured until an Account ID is present. No key or secret is collected here.

Merchant Import

Include the account ID when importing merchants via CSV, using the column header:

ColumnDescription
account_idThe Frame account ID for this merchant

API Integration

Configure the account ID programmatically with the Update Connection Details endpoint:

curl --request PATCH \
  --url https://api.preczn.com/v1/merchants/{merchantId}/connections/Frame \
  --header 'Authorization: Bearer {api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "mid": "{Frame account ID}"
}'

Request Fields

FieldTypeRequiredDescription
midstringYesThe Frame account ID for this merchant
📘

The account ID is stored, not checked against Frame

Saving a merchant's Frame connection verifies the platform secret key, which is the only credential Frame authenticates. The account ID itself is not validated, so an incorrect value saves successfully and surfaces later as a transaction error. Copy it directly from Frame.

Processing Transactions

Route transactions to Frame the same way as any other connection — through a plan or a direct connection reference on the transaction. The sections below cover the behavior specific to Frame.

Transaction Records at Frame

Frame records a sale or refund as a transfer and an authorization as a charge intent. The processorTransactionId on the Preczn transaction is the id of the matching Frame object, so it can be used to find the transaction in Frame.

Voids

Only an authorization can be voided. A sale has no equivalent operation at Frame, so a void against one is rejected with Frame cannot void a transfer-backed sale transaction; use refund instead. To reverse a sale, issue a Refund.

Captures

Captures may be partial, and an authorization may be captured more than once up to the authorized amount. Voiding after a partial capture releases the uncaptured remainder.

Pending Transactions

Frame confirms some transactions asynchronously, so a Frame transaction can return with a status of P (Pending) and settle to A (Approved) or D (Declined) later. This is normal for ACH, where the sale is submitted into the ACH network and the outcome arrives days later, and it can also happen on a card transaction that Frame is still processing.

Treat P as "not yet an outcome" — do not fulfill an order on it. Subscribe to the transaction.approved, transaction.declined, and transaction.errored webhook events to be notified when the transaction reaches its final status, or poll Get Transaction.

An ACH return arrives as a decline on the original transaction rather than as a separate record, on standard NACHA timing.

3D Secure

Frame authorizations are performed server-to-server, so a card that requires a 3D Secure challenge cannot be completed. The transaction is declined with 3D Secure challenge required; not supported for server-side Frame authorization.

Timeouts

Frame does not support idempotency keys, so a request that never returns a response cannot be safely resent. When this happens, Preczn tries to recover the real outcome by looking the transaction up at Frame. If the outcome cannot be confirmed, the transaction is recorded with a status of E (Error) and this message:

Processor request timed out before a response was received. The transaction may or may not have been processed by Frame. Verify the transaction status with Frame before retrying to avoid duplicate processing.

Do not blindly retry an E on Frame — confirm in Frame first, or you risk charging the cardholder twice.

Data Not Sent to Frame

Frame's API has no equivalent for the following, so these values are accepted by Preczn and used elsewhere but never reach Frame:

Frame also returns no raw AVS or CVV result codes. Send the billing address and CVV as usual — Frame uses them in its decision — but an address or CVV mismatch surfaces as a decline reason rather than as a response code.

Transaction Status Mapping

Frame's status vocabulary differs between transfers and charge intents, and the same word can mean opposite things across the two. Preczn maps each to a transaction status of A, D, or P.

Sale and Refund

Frame transfer statusPreczn statusWhat it means
succeededA ApprovedFunds captured
failed, fraud_declined, canceled, expiredD DeclinedNot processed. failed is also the ACH return status
pending, processing, incomplete, fraud_review, requires_payment_method, requires_confirmation, requires_3d_secure, requires_account_or_customerP PendingStill in flight; a later event resolves it
refunded, reversed, disputedA ApprovedRecords that follow a completed sale; the original stays approved

Auth, Capture, and Void

Frame charge intent statusPreczn statusWhat it means
requires_captureA ApprovedAuthorization hold placed
succeededA ApprovedCaptured
canceled, remaining_voidedA ApprovedVoid succeeded — not a decline
failed, expiredD DeclinedIssuer declined, or the hold expired
processing, pending, incomplete, requires_confirmation, requires_payment_method, requires_action, requires_3d_secureP PendingStill in flight; a later event resolves it
refunded, reversed, disputedA ApprovedRecords that follow a capture

A status Preczn does not recognize is treated as Pending rather than as an approval or a decline, so an unfamiliar Frame status never produces a false outcome. A status of E (Error) always means the request itself failed — a connectivity problem, a rejected request, or a timeout — never an issuer decision.

Webhooks

Frame webhooks are configured for you. When you save or update the platform connection, Preczn registers its own endpoint with Frame, subscribes to the transfer and charge intent events it needs, and stores the signing secret Frame issues. Every event is signature-verified before it is processed.

There is nothing to configure in the Frame dashboard, and nothing merchant-specific to maintain — one endpoint per platform connection serves all of your merchants.

⚠️

Don't hand-edit the Preczn endpoint in Frame

Frame issues an endpoint's signing secret once and never displays it again, so editing or rotating Preczn's endpoint inside the Frame dashboard leaves Preczn with a secret that no longer matches and Frame's events will be rejected. If the endpoint is deleted, save the platform connection again in Preczn and it is re-registered with a fresh secret.

To receive transaction updates in your own application, subscribe to Preczn's transaction webhooks rather than to Frame's.

Testing in the Sandbox

  1. Add the Frame connection in Test Mode using your sk_sandbox_ and pk_sandbox_ keys.
  2. Set a test merchant's Account ID to a Frame sandbox account.
  3. Send transactions using the standard Preczn test cards and test bank accounts — Preczn translates them to Frame's sandbox values automatically, so no Frame-specific test data is needed.

Test and Live connections are configured separately, and Preczn routes to the matching Frame environment based on the mode the transaction runs in.

FAQ

Do merchants need their own Frame API keys?

No. Frame keys are held on the platform connection, and one pair of keys serves every merchant. The only Frame value stored on a merchant is their Account ID, which tells Frame which account a transaction belongs to.

Why was my connection rejected when the keys are correct?

Check that the key prefix matches the mode of the connection. A Test Mode connection only accepts sk_sandbox_ and pk_sandbox_ keys; a Live connection only accepts sk_production_ and pk_production_. Frame serves both environments from the same address and identifies the environment purely from the prefix, so Preczn rejects a mismatched pair before saving rather than authenticating against the wrong environment.

Can I run a zero-dollar verification to validate a card or bank account?

No. Frame does not offer a zero-dollar authorization, so Verify requests to Frame are rejected with Verify is not supported for Frame. To check a card without capturing funds, run an Auth for the smallest amount you're willing to hold and Void it. There is no equivalent for ACH — a bank account is validated when the first sale is processed.

Why can't I void a sale?

Frame has no cancel operation for a sale — only an authorization can be voided. Refund the sale instead. A void against a Frame sale is rejected with Frame cannot void a transfer-backed sale transaction; use refund instead rather than silently doing nothing.

Can I run ACH auth and capture instead of a sale?

No. ACH has no authorization hold at Frame, so ACH supports sale and refund only. An ACH auth is rejected with ACH is not supported for Frame authorization transactions. ACH supports sale and refund only. Use a sale, and refund it if you need to reverse it.

My transaction came back Pending. What do I do?

Wait for the final status; don't treat Pending as an approval. Frame confirms some transactions asynchronously — always for ACH, and sometimes for cards — and Preczn updates the transaction when Frame reports the outcome. Subscribe to the transaction.approved, transaction.declined, and transaction.errored webhook events, or poll Get Transaction. Once a transaction reaches Approved or Declined, a late Pending update can never move it back.

A transaction has been Pending far longer than expected. Why?

Most Pending transactions resolve on their own when Frame reports the outcome. The exception is Frame's fraud screening: when Frame holds or declines a transaction through its fraud engine, it publishes no event for that transition, so the transaction can sit in Pending in Preczn even though Frame has reached a decision. Check the transaction in the Frame dashboard, and contact Preczn support if the two don't agree.

A transaction errored with a timeout. Is it safe to retry?

Not without checking first. A timeout means the request reached Frame but no response came back, so the transaction may or may not have been processed. Preczn tries to look the transaction up at Frame before giving up, and only reports a timeout error when the outcome cannot be confirmed — but Frame provides no idempotency keys, so a blind retry can charge the cardholder twice. Confirm in the Frame dashboard, then retry only if nothing was created.

Can I send Apple Pay or Google Pay transactions to Frame?

No. Wallet transactions cannot be routed to Frame. Route them to a connection that supports wallets — see Apple Pay on the Web and Google Pay for Web — and keep Frame in a plan for card and ACH volume.

Why doesn't my transaction metadata appear in Frame?

Frame's API has no field for it. Metadata, dynamic statement descriptors, and Level II/III data are stored and reported by Preczn but are not transmitted to Frame, so they won't appear on the Frame transaction record. Preczn does attach its own reference to each Frame transaction, which is what lets a timed-out request be matched back to the transaction it created.

Do I need to configure webhooks in Frame?

No. Preczn registers and maintains its own Frame webhook endpoint when you save the platform connection, including the signing secret. Leave that endpoint alone in the Frame dashboard; if it is removed, saving the Preczn connection again re-creates it. To receive updates in your own systems, use Preczn webhooks.


Did this page help you?