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
| Capability | Status | Notes |
|---|---|---|
| Credit Card Transactions | Supported | Sale, auth, capture, void, and refund |
| ACH (Bank Account) Transactions | Supported | Sale and refund only |
| Merchant Onboarding | Not supported | Merchant accounts are created with Frame directly, then linked in Preczn |
| Apple Pay / Google Pay | Not supported | Wallet transactions cannot be routed to Frame |
Supported Transaction Types
| Type | Card | ACH | Description |
|---|---|---|---|
| Sale | ✅ | ✅ | Authorize and capture in a single request |
| Auth | ✅ | — | Authorize only (hold funds without capturing) |
| Capture | ✅ | — | Capture a previous authorization |
| Void | ✅ | — | Cancel an authorization (see Voids) |
| Refund | ✅ | ✅ | Return funds from a completed transaction |
| Verify | — | — | Not offered by Frame |
ACH is sale and refund onlyACH 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:
| Credential | Level | Where it comes from |
|---|---|---|
| Publishable Key | Platform | Frame dashboard — pk_sandbox_… / pk_production_… |
| Secret Key | Platform | Frame dashboard — sk_sandbox_… / sk_production_… |
| Account ID | Merchant | The 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
- Select Connections from the left-hand navigation.
- On the Add Connections tab, select Connect under Frame.
- Enter a name for the connection.
- Enter your Publishable Key and Secret Key.
- Select Verify Connection.
Key prefixes must match the modeFrame 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 requiressk_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:
| Message | What it means |
|---|---|
Invalid API credentials | Frame rejected the secret key. Check for a copy error or a revoked key. |
Unrecognized Frame secret key format | The 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 again | Frame 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
- Navigate to Merchants and open the merchant.
- In the merchant's Connections pane, select Frame.
- 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:
| Column | Description |
|---|---|
account_id | The 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
| Field | Type | Required | Description |
|---|---|---|---|
mid | string | Yes | The Frame account ID for this merchant |
The account ID is stored, not checked against FrameSaving 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 status | Preczn status | What it means |
|---|---|---|
succeeded | A Approved | Funds captured |
failed, fraud_declined, canceled, expired | D Declined | Not processed. failed is also the ACH return status |
pending, processing, incomplete, fraud_review, requires_payment_method, requires_confirmation, requires_3d_secure, requires_account_or_customer | P Pending | Still in flight; a later event resolves it |
refunded, reversed, disputed | A Approved | Records that follow a completed sale; the original stays approved |
Auth, Capture, and Void
| Frame charge intent status | Preczn status | What it means |
|---|---|---|
requires_capture | A Approved | Authorization hold placed |
succeeded | A Approved | Captured |
canceled, remaining_voided | A Approved | Void succeeded — not a decline |
failed, expired | D Declined | Issuer declined, or the hold expired |
processing, pending, incomplete, requires_confirmation, requires_payment_method, requires_action, requires_3d_secure | P Pending | Still in flight; a later event resolves it |
refunded, reversed, disputed | A Approved | Records 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 FrameFrame 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
- Add the Frame connection in Test Mode using your
sk_sandbox_andpk_sandbox_keys. - Set a test merchant's Account ID to a Frame sandbox account.
- 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.
Updated about 14 hours ago
