Skip to Content
CheckoutAPI ReferenceSettingsRotate the merchant signer via setFactory

Rotate the merchant signer via setFactory

POST/settings/signer/rotation

Verifies the outgoing-signer signatures, re-screens the stored settlement address, deploys the replacement PaymentFactory (same fee and registry, new signer) on every supported EVM chain, submits setFactory on each SubscriptionManager clone, and updates the stored merchant signer and factory address.

Headers

HeaderDescriptionRequired
AuthorizationBearer token with your secret API keyyes

Request Body

FieldTypeRequiredDescription
new_signerstringyes
rotationsobject[]yes

rotations

FieldTypeRequiredDescription
chainstringyes
deadlineintegeryes
signaturestringyes

Example Request

Request

const response = await fetch('https://checkout-api.exodus-int.com/settings/signer/rotation', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "new_signer": "0x5678ef015678ef015678ef015678ef015678ef01",
    "rotations": [
      {
        "chain": "eip155:11155111",
        "deadline": 1798761600,
        "signature": "0x0b30557a9fc4e90e33587da2c7ec11365b80a5caef14395e83a8cdf2173c6186abd0f51a3f6489aed3f81d42678cb1d6fb20456a8fb4d9fe23486d92b7dc01264b"
      }
    ]
  }),
});

Responses

StatusDescription
200The per-chain rotation results.
400Validation error
401A rotation signature does not recover to the signer.
403API key lacks the required scope
422Expired signature, unchanged signer, nothing to rotate, payments in flight, a concurrent rotation conflict, or a SubscriptionManager address that returned no data: no contract, a different contract, or a node that has not seen it yet (`manager_unreachable`). A settlement address that compliance screening rejects returns `type: cannot_process` with `code: flagged` before any deployment.
502Replacement factory deployment failed before any relay (`deploy_failed`, `data.failed_chains`), or a `setFactory` relay failed after zero or more chains rotated (`rotation_partial_failure`). For partial failures `data.rotations` lists the chains that did rotate with their tx hashes, `data.failed_chain` names the failing chain, and `data.failed_tx_hash` carries the failed tx when one landed. Recover by re-fetching `GET /settings/signer/rotation` — rotated chains come back `already_rotated` — re-signing only the `pending` entries, and re-POSTing.
503Settlement address screening is temporarily unavailable. Nothing was deployed or relayed; retry later with the same signatures while their deadlines hold.

Response body

FieldTypeRequiredDescription
objectenum: signer_rotationyes
new_signerstringyes
new_factory_addressstringyes
rotationsobject[]yes

rotations

FieldTypeRequiredDescription
chainstringyes
statusenum: rotated | already_rotatedyes
tx_hashstring | nullyes

Example Response

{
  "object": "signer_rotation",
  "new_signer": "0x5678ef015678ef015678ef015678ef015678ef01",
  "new_factory_address": "0xfaceb00cfaceb00cfaceb00cfaceb00cfaceb00c",
  "rotations": [
    {
      "chain": "eip155:11155111",
      "status": "rotated",
      "tx_hash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"
    }
  ]
}

Error Response

Error (e.g. 400)

{
  "error": {
    "type": "validation_error",
    "message": "amount must be a positive number",
    "param": "amount"
  }
}

Start building

XO

Request Demo

Schedule a call with our team

Select a product
Arrow right

Start building
Grateful

Contact Us

We're here to help