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.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"
  }
}
Last updated on

Start building

XO

Request Demo

Schedule a call with our team

Select a productArrow right

Start building
Grateful

Contact Us

We're here to help