{"openapi":"3.0.0","paths":{"/v1/customers":{"post":{"operationId":"create-customer","summary":"Create customer","description":"Requires scope customers:write.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerDto"}}}},"responses":{"201":{"description":"Customer created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CustomerViewDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Customers"],"x-required-scope":"customers:write"},"get":{"operationId":"list-customers","summary":"List customers","description":"Requires scope customers:read.","parameters":[{"name":"cursor","required":false,"in":"query","schema":{}},{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":"Customer page","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CustomerListResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Customers"],"x-required-scope":"customers:read"}},"/v1/payments":{"post":{"operationId":"create-payment","summary":"Create payment","description":"Requires scope payment_links:write and a business with a payment-links project in the key's environment.","parameters":[{"name":"Idempotency-Key","in":"header","description":"Stable per payment.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentDto"}}}},"responses":{"201":{"description":"Payment created with its deposit addresses","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PaymentDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Payment Links"],"x-required-scope":"payment_links:write"},"get":{"operationId":"list-payments","summary":"List payments","description":"Requires scope payment_links:read.","parameters":[{"name":"attemptStatus","required":false,"in":"query","description":"Return only payments having an attempt in this state.","schema":{"enum":["DEPOSITED","PENDING_APPROVAL","SETTLING","SETTLED","FAILED","APPROVAL_EXPIRED"],"type":"string"}},{"name":"reference","required":false,"in":"query","description":"Your own reference.","schema":{}},{"name":"status","required":false,"in":"query","schema":{"enum":["AWAITING_PAYMENT","FULFILLED","EXPIRED","CANCELLED"],"type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{}},{"name":"limit","required":false,"in":"query","description":"1-100, default 25","schema":{}},{"name":"q","required":false,"in":"query","description":"Search: matches part of your reference, case-insensitively, or a payment id exactly","schema":{}}],"responses":{"200":{"description":"Payments","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PaymentListDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Payment Links"],"x-required-scope":"payment_links:read"}},"/v1/payments/{id}":{"get":{"operationId":"get-payment","summary":"Get payment","description":"Requires scope payment_links:read.","parameters":[],"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PaymentDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Payment Links"],"x-required-scope":"payment_links:read"}},"/v1/payments/{id}/cancel":{"post":{"operationId":"cancel-payment","summary":"Cancel payment","description":"Requires scope payment_links:write and a business with a payment-links project in the key's environment; it acts on the record in whichever of those projects it belongs to.","parameters":[],"responses":{"200":{"description":"Payment cancelled","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CancelledPaymentDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Payment Links"],"x-required-scope":"payment_links:write"}},"/v1/wallets":{"post":{"operationId":"create-wallet","summary":"Create wallet","description":"Requires scope wallets:create.","parameters":[{"name":"x-customer-id","in":"header","description":"Scope the wallet to a business-supplied customer id","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWalletDto"}}}},"responses":{"201":{"description":"Wallet created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WalletReferenceDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Wallets"],"x-required-scope":"wallets:create"},"get":{"operationId":"list-wallets","summary":"List wallets","description":"Requires scope wallets:read.","parameters":[{"name":"customerId","required":false,"in":"query","schema":{}},{"name":"treasury","required":false,"in":"query","schema":{}},{"name":"moduleId","required":false,"in":"query","schema":{}},{"name":"cursor","required":false,"in":"query","schema":{}},{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":"Wallet page","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WalletListResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Wallets"],"x-required-scope":"wallets:read"}},"/v1/wallets/provision":{"post":{"operationId":"provision-wallets","summary":"Provision wallets","description":"Requires scope wallets:create.","parameters":[{"name":"x-customer-id","in":"header","description":"Scope the wallets to a business-supplied customer id","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionWalletsDto"}}}},"responses":{"201":{"description":"Wallets provisioned","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ProvisionWalletsResultDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Wallets"],"x-required-scope":"wallets:create"}},"/v1/wallets/balances":{"get":{"operationId":"list-wallet-balances","summary":"List wallet balances","description":"Requires scope wallets:read.","parameters":[{"name":"moduleId","required":false,"in":"query","schema":{}},{"name":"customerId","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":"Wallets with balances","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WalletBalancesResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Balances"],"x-required-scope":"wallets:read"}},"/v1/quotes":{"post":{"operationId":"get-fee-quote","summary":"Get fee quote","description":"Requires scope quotes:read.","parameters":[{"name":"x-customer-id","in":"header","description":"Identifies whose wallet to quote for.","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteDto"}}}},"responses":{"200":{"description":"Quote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/QuoteResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"Malformed body, an address that fails its chain's checksum, a chain or token the lane does not list, or a wallet that cannot cover the transfer plus its fee","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","insufficient_funds","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"The API key lacks the quotes:read scope","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":403},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":403},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"404":{"description":"No single wallet matched moduleId + x-customer-id + treasury on that chain.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/wallet_not_found"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":404},"code":{"type":"string","enum":["wallet_not_found"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":404},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"erc4337 only: the Safe is not deployed on this chain yet (retry once provisioning puts it on-chain), or the transfer reverted in simulation for a reason other than the balance — a blocked recipient or a paused token","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/chain_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["chain_unavailable","transfer_reverted"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"500":{"description":"A fault on our side.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/wallet_incomplete"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":500},"code":{"type":"string","enum":["wallet_incomplete","chain_misconfigured","unknown"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["internal"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":500},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"502":{"description":"Fee estimation failed upstream — the chain's RPC node, the bundler or the paymaster — or the wallet registry could not be reached.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/chain_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":502},"code":{"type":"string","enum":["chain_unavailable","rpc_unavailable","bundler_unavailable","paymaster_rejected","paymaster_unfunded","upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":502},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"503":{"description":"The owning chain service is shutting down, or your API key could not be resolved because the key service is unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":503},"code":{"type":"string","enum":["upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":503},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"504":{"description":"The owning chain service did not answer within the gateway's timeout.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":504},"code":{"type":"string","enum":["upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":504},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Quotes"]}},"/v1/quotes/spark":{"post":{"operationId":"quote-spark-exit","summary":"Quote Spark exit","description":"Requires scope quotes:read.","parameters":[{"name":"x-customer-id","in":"header","description":"Identifies whose spark wallet to price against.","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SparkQuoteDto"}}}},"responses":{"200":{"description":"Spark exit fee quote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SparkQuoteResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"Malformed body — an operation outside the two priced ones, a field the chosen operation requires but did not get, a withdrawalAddress that is not a valid Bitcoin address on the configured network, or a non-positive amountSats.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"The API key lacks the quotes:read scope","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":403},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":403},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"404":{"description":"No spark wallet exists for this owner.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/wallet_not_found"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":404},"code":{"type":"string","enum":["wallet_not_found"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":404},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"This business exceeded its per-minute enclave quote budget.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"500":{"description":"A fault on our side.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/wallet_incomplete"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":500},"code":{"type":"string","enum":["wallet_incomplete","unknown"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["internal"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":500},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"502":{"description":"The enclave could not be reached, returned no fee, or the Spark service provider refused to price the exit.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/enclave_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":502},"code":{"type":"string","enum":["enclave_unavailable","upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":502},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"504":{"description":"The quote did not finish within the gateway's quote budget.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":504},"code":{"type":"string","enum":["upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":504},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Quotes"],"x-required-scope":"quotes:read"}},"/v1/swaps/quote":{"post":{"operationId":"quote-swap","summary":"Quote swap","description":"Requires scope quotes:read.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapQuoteDto"}}}},"responses":{"200":{"description":"Swap quote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SwapQuoteResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"Malformed body, a chain the aggregator cannot route USDT/XAUT on (everything but ethereum), or an amount below the per-token minimum.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"The API key lacks the quotes:read scope","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":403},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":403},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"The wallet is under recovery, so swaps are blocked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"502":{"description":"The swap aggregator could not be reached or returned no route, or the chain's RPC node was unreachable","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":502},"code":{"type":"string","enum":["upstream_unavailable","rpc_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":502},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Swaps"],"x-required-scope":"quotes:read"}},"/v1/swaps/max":{"post":{"operationId":"get-max-swap-amount","summary":"Get max swap amount","description":"Requires scope quotes:read and the passkey public key, because it reports the wallet's balance — it will not answer for a Safe the passkey does not own.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaxSwapDto"}}}},"responses":{"200":{"description":"Largest swappable amount","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SwapMaxResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"Malformed body, or a chain the aggregator cannot route USDT/XAUT on","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"The API key lacks the quotes:read scope","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":403},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":403},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"The passkey does not own this Safe, the wallet is under recovery, or the Safe is not deployed on this chain","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/passkey_credential_invalid"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["passkey_credential_invalid","forbidden","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"502":{"description":"The swap aggregator or the chain's RPC node could not be reached","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":502},"code":{"type":"string","enum":["upstream_unavailable","rpc_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":502},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Swaps"],"x-required-scope":"quotes:read"}},"/v1/swaps/prepare":{"post":{"operationId":"prepare-swap","summary":"Prepare swap","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareSwapDto"}}}},"responses":{"200":{"description":"Unsigned swap userOperation","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SwapPrepareResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Swaps"],"x-required-scope":"transactions:create"}},"/v1/swaps":{"post":{"operationId":"submit-swap","summary":"Submit swap","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitSwapDto"}}}},"responses":{"200":{"description":"Swap submitted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SwapSubmitResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Swaps"],"x-required-scope":"transactions:create"}},"/v1/bridges/quote":{"post":{"operationId":"quote-bridge","summary":"Quote bridge","description":"Requires scope quotes:read.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteBridgeDto"}}}},"responses":{"200":{"description":"Bridge quote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BridgeQuoteResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"Malformed body, a recipient that is not valid for the destination, a source chain bridging is not enabled from, a destination the router can only reach with a swap, an amount below the 10 USDT minimum, or a route whose fee breaches the ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"The API key lacks the quotes:read scope","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":403},"code":{"type":"string","enum":["forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":403},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"The wallet is under recovery, or the Safe is not deployed on the source chain","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/forbidden"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["forbidden","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"501":{"description":"Bridging is not enabled in this environment","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/chain_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":501},"code":{"type":"string","enum":["chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":501},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"502":{"description":"The bridge router answered with something other than a route to the pinned Across contract, or the chain's RPC node was unreachable","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":502},"code":{"type":"string","enum":["upstream_unavailable","rpc_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":502},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"503":{"description":"The bridge router could not be reached","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/upstream_unavailable"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":503},"code":{"type":"string","enum":["upstream_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":503},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Bridges"],"x-required-scope":"quotes:read"}},"/v1/bridges/prepare":{"post":{"operationId":"prepare-bridge","summary":"Prepare bridge","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareBridgeDto"}}}},"responses":{"200":{"description":"Unsigned bridge userOperation","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BridgePrepareResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"As for the quote, or the Safe cannot cover the amount plus the gas","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","chain_unavailable","insufficient_funds"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"The passkey does not own this Safe, the wallet is under recovery, the Safe is not deployed, or the same userOperation is already in flight","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/passkey_credential_invalid"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["passkey_credential_invalid","forbidden","chain_unavailable","idempotency_conflict"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Bridges"],"x-required-scope":"transactions:create"}},"/v1/bridges":{"post":{"operationId":"submit-bridge","summary":"Submit bridge","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitBridgeDto"}}}},"responses":{"200":{"description":"Bridge submitted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BridgeSubmitResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"400":{"description":"The userOperation does not hash to userOpHash, the body disagrees with what was prepared under it, or the signing gateway refused the operation (its passkey_assertion_invalid refusal is relayed as validation_failed).","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/validation_failed"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":400},"code":{"type":"string","enum":["validation_failed","chain_unavailable"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client","upstream"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":400},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"404":{"description":"Nothing was prepared under this userOpHash","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/not_found"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":404},"code":{"type":"string","enum":["not_found"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":404},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"The bridge was already submitted, the quote expired before submit, the wallet entered recovery, or the signing gateway refused the operation","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/idempotency_conflict"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":409},"code":{"type":"string","enum":["idempotency_conflict","validation_failed","forbidden"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":409},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Bridges"],"x-required-scope":"transactions:create"}},"/v1/bridges/{id}":{"get":{"operationId":"get-bridge","summary":"Get bridge","description":"Requires scope transactions:read.","parameters":[{"name":"id","required":true,"in":"path","description":"Bridge id, from prepare or submit","schema":{}}],"responses":{"200":{"description":"Bridge","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BridgeStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"404":{"description":"No bridge with this id belongs to the API key's business","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/not_found"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":404},"code":{"type":"string","enum":["not_found"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":404},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Bridges"],"x-required-scope":"transactions:read"}},"/v1/transactions":{"post":{"operationId":"submit-transaction","summary":"Submit transaction","description":"Requires scope transactions:create.","parameters":[{"name":"x-customer-id","in":"header","description":"Identifies whose wallet to send from.","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransactionDto"}}}},"responses":{"200":{"description":"Transaction submitted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"]},"get":{"operationId":"list-transactions","summary":"List transactions","description":"Requires scope transactions:read.","parameters":[{"name":"paymentId","required":false,"in":"query","description":"Only the transactions one payment link payment caused: its deposit, its sweep to the business and any recovery.","schema":{}},{"name":"purpose","required":false,"in":"query","schema":{"enum":["transfer","swap","bridge","paylink_deposit","paylink_sweep","paylink_recovery"],"type":"string"}},{"name":"chain","required":false,"in":"query","schema":{}},{"name":"kind","required":false,"in":"query","schema":{}},{"name":"status","required":false,"in":"query","schema":{}},{"name":"walletId","required":false,"in":"query","schema":{}},{"name":"cursor","required":false,"in":"query","schema":{}},{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":"Transaction page","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionListResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"],"x-required-scope":"transactions:read"}},"/v1/balances":{"get":{"operationId":"get-balances","summary":"Get balances","description":"Requires scope wallets:read.","parameters":[{"name":"address","required":false,"in":"query","schema":{}},{"name":"chain","required":true,"in":"query","schema":{}}],"responses":{"200":{"description":"Balances","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ChainBalancesDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Balances"]}},"/v1/wallets/{id}/passkeys/{credentialId}":{"delete":{"operationId":"remove-passkey","summary":"Remove passkey","description":"Requires scope wallets:write.","parameters":[{"name":"credentialId","required":true,"in":"path","description":"Passkey credential id","schema":{}},{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemovePasskeyDto"}}}},"responses":{"200":{"description":"Removal prepared, or already complete","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RemovePasskeyResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Passkeys"],"x-required-scope":"wallets:write"}},"/v1/wallets/{id}/guardians":{"post":{"operationId":"enrol-guardian","summary":"Enrol guardian","description":"Requires scope wallets:write.","parameters":[{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrolRecoveryDto"}}}},"responses":{"200":{"description":"Enrolment prepared, submitted, or already in place on the named chains","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryEnrolmentResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:write"},"get":{"operationId":"get-guardians","summary":"Get guardians","description":"Requires scope wallets:read.","parameters":[{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"responses":{"200":{"description":"Per-chain guardian enrolment state","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryEnrolmentStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:read"}},"/v1/wallets/{id}/guardians/rotate":{"post":{"operationId":"rotate-guardian","summary":"Rotate guardian","description":"Requires scope wallets:write.","parameters":[{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateGuardianDto"}}}},"responses":{"200":{"description":"Rotation prepared or submitted on the named chains","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryEnrolmentResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:write"}},"/v1/wallets/{id}/guardians/revoke":{"post":{"operationId":"revoke-guardian","summary":"Revoke guardian","description":"Requires scope wallets:write.","parameters":[{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnenrolRecoveryDto"}}}},"responses":{"200":{"description":"Revocation prepared or submitted, or recovery already off on the named chain","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryUnenrolmentResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:write"}},"/v1/wallets/{id}/sovereignty":{"get":{"operationId":"get-wallet-control","summary":"Get wallet control","description":"Requires scope wallets:read.","parameters":[{"name":"id","required":true,"in":"path","description":"Wallet id","schema":{}}],"responses":{"200":{"description":"Per-chain owner counts and the sole-key verdict","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WalletSovereigntyDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Wallets"],"x-required-scope":"wallets:read"}},"/v1/guardians":{"post":{"operationId":"enrol-customer-guardian","summary":"Enrol customer guardian","description":"Requires scope wallets:write and an x-customer-id header; the wallet is resolved from the customer, so there is no wallet id in the path.","parameters":[],"responses":{"201":{"description":""},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:write"},"get":{"operationId":"get-customer-guardians","summary":"Get customer guardians","description":"Requires scope wallets:read and an x-customer-id header.","parameters":[],"responses":{"200":{"description":""},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Guardians"],"x-required-scope":"wallets:read"}},"/v1/recoveries":{"post":{"operationId":"start-recovery","summary":"Start recovery","description":"Requires scope recoveries:create.","parameters":[{"name":"Idempotency-Key","in":"header","description":"Idempotency key for safe start retries (keyed with walletId)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRecoveryDto"}}}},"responses":{"201":{"description":"Recovery started","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/StartRecoveryDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recoveries"],"x-required-scope":"recoveries:create"}},"/v1/recoveries/{id}/cancel":{"post":{"operationId":"cancel-recovery","summary":"Cancel recovery","description":"Requires scope recoveries:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelRecoveryDto"}}}},"responses":{"200":{"description":"Recovery cancellation accepted (status CANCELLING)","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryCancelDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recoveries"],"x-required-scope":"recoveries:create"}},"/v1/recoveries/{id}":{"get":{"operationId":"get-recovery","summary":"Get recovery","description":"Requires scope recoveries:read.","parameters":[],"responses":{"200":{"description":"Recovery status","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recoveries"],"x-required-scope":"recoveries:read"}},"/v1/recoveries/challenge":{"post":{"operationId":"send-recovery-code","summary":"Send recovery code","description":"Requires scope recoveries:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestRecoveryCodeDto"}}}},"responses":{"200":{"description":"Code issued and delivered","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryCodeChallengeDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recoveries"],"x-required-scope":"recoveries:create"}},"/v1/recoveries/challenge/verify":{"post":{"operationId":"verify-recovery-code","summary":"Verify recovery code","description":"Requires scope recoveries:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRecoveryCodeDto"}}}},"responses":{"200":{"description":"Code accepted, single-use recovery token issued","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryCodeVerifiedDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recoveries"],"x-required-scope":"recoveries:create"}},"/v1/recovery-contacts/coverage":{"post":{"operationId":"check-contact-coverage","summary":"Check contact coverage","description":"Requires scope recovery-contacts:read.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadRecoveryCoverageDto"}}}},"responses":{"200":{"description":"Recovery-contact coverage across the wallets named","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/RecoveryCoverageResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recovery Contacts"],"x-required-scope":"recovery-contacts:read"}},"/v1/recovery-contacts/challenge":{"post":{"operationId":"request-contact-challenge","summary":"Request contact challenge","description":"Requires scope recovery-contacts:write.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestContactChallengeDto"}}}},"responses":{"200":{"description":"Challenge issued","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ChallengeDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recovery Contacts"],"x-required-scope":"recovery-contacts:write"}},"/v1/recovery-contacts":{"post":{"operationId":"set-recovery-contact","summary":"Set recovery contact","description":"Requires scope recovery-contacts:write.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRecoveryContactDto"}}}},"responses":{"200":{"description":"Recovery contact set","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ContactPendingDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recovery Contacts"],"x-required-scope":"recovery-contacts:write"},"get":{"operationId":"get-recovery-contact","summary":"Get recovery contact","description":"Requires scope recovery-contacts:read.","parameters":[],"responses":{"200":{"description":"Recovery contact","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ContactStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recovery Contacts"],"x-required-scope":"recovery-contacts:read"}},"/v1/recovery-contacts/verify":{"post":{"operationId":"verify-recovery-contact","summary":"Verify recovery contact","description":"Requires scope recovery-contacts:write.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRecoveryContactDto"}}}},"responses":{"200":{"description":"Recovery contact verified","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ContactVerifiedDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Recovery Contacts"],"x-required-scope":"recovery-contacts:write"}},"/v1/passkeys":{"post":{"operationId":"add-passkey","summary":"Add passkey","description":"Requires scope wallets:write.","parameters":[{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPasskeyDto"}}}},"responses":{"201":{"description":"Passkey enrolled","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PasskeyReferenceDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Passkeys"],"x-required-scope":"wallets:write"},"get":{"operationId":"list-passkeys","summary":"List passkeys","description":"Requires scope wallets:read.","parameters":[{"name":"treasury","required":false,"in":"query","schema":{}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"responses":{"200":{"description":"Enrolled passkeys","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PasskeyListResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Passkeys"],"x-required-scope":"wallets:read"}},"/v1/passkeys/{credentialId}/safe-owner":{"post":{"operationId":"retry-passkey-enrolment","summary":"Retry passkey enrolment","description":"Requires scope wallets:write.","parameters":[{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetrySafeOwnerDto"}}}},"responses":{"200":{"description":"On-chain half re-attempted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PasskeyReferenceDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Passkeys"],"x-required-scope":"wallets:write"}},"/v1/userops/prepare":{"post":{"operationId":"prepare-userop","summary":"Prepare userOp","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareUserOpDto"}}}},"responses":{"200":{"description":"Prepared userOp + hash to sign","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PreparedUseropDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"],"x-required-scope":"transactions:create"}},"/v1/userops/signatures":{"post":{"operationId":"submit-batch-signatures","summary":"Submit batch signatures","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitSignatureBatchDto"}}}},"responses":{"200":{"description":"Per-userOp submission results"},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"],"x-required-scope":"transactions:create"}},"/v1/userops/{hash}/signatures":{"post":{"operationId":"submit-userop-signature","summary":"Submit userOp signature","description":"Requires scope transactions:create.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitSignatureDto"}}}},"responses":{"200":{"description":"Updated quorum status","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UseropStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"],"x-required-scope":"transactions:create"}},"/v1/userops/{hash}":{"get":{"operationId":"get-userop-status","summary":"Get userOp status","description":"Requires scope transactions:read.","parameters":[],"responses":{"200":{"description":"Quorum status","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UseropStatusDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Transactions"],"x-required-scope":"transactions:read"}},"/v1/webhook-endpoints":{"post":{"operationId":"create-webhook-endpoint","summary":"Create webhook endpoint","description":"Requires scope webhooks:write.","parameters":[{"name":"projectId","required":false,"in":"query","description":"The project whose endpoints to manage.","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointDto"}}}},"responses":{"201":{"description":"The registered endpoint and its one-time signing secret","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSecretDto"},"status":{"type":"number","example":201},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Webhooks"]},"get":{"operationId":"list-webhook-endpoints","summary":"List webhook endpoints","description":"Requires scope webhooks:read.","parameters":[{"name":"projectId","required":false,"in":"query","description":"The project whose endpoints to manage.","schema":{}}],"responses":{"200":{"description":"The project's webhook endpoints","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointDto"}},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Webhooks"]}},"/v1/webhook-endpoints/{id}":{"patch":{"operationId":"update-webhook-endpoint","summary":"Update webhook endpoint","description":"Requires scope webhooks:write.","parameters":[{"name":"projectId","required":false,"in":"query","description":"The project whose endpoints to manage.","schema":{}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointDto"}}}},"responses":{"200":{"description":"The updated webhook endpoint","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Webhooks"]},"delete":{"operationId":"delete-webhook-endpoint","summary":"Delete webhook endpoint","description":"Requires scope webhooks:write.","parameters":[{"name":"projectId","required":false,"in":"query","description":"The project whose endpoints to manage.","schema":{}}],"responses":{"204":{"description":"The webhook endpoint was deleted"},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"tags":["Webhooks"]}},"/v1/limits":{"put":{"description":"Requires scope wallets:write.","operationId":"set-spend-cap","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetLimitDto"}}}},"responses":{"200":{"description":"Cap stored. onChain describes the on-chain half when one was requested.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SetLimitResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Set spend cap","tags":["Treasury"],"x-required-scope":"wallets:write"},"get":{"description":"Requires scope wallets:read.","operationId":"list-spend-caps","parameters":[{"name":"treasury","required":false,"in":"query","description":"Defaults true. false reads a customer wallet.","schema":{}}],"responses":{"200":{"description":"The caps currently in force","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LimitListResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"List spend caps","tags":["Treasury"],"x-required-scope":"wallets:read"},"delete":{"description":"Requires scope wallets:write.","operationId":"remove-spend-cap","parameters":[{"name":"asset","required":true,"in":"query","schema":{}},{"name":"signerId","required":true,"in":"query","schema":{}},{"name":"treasury","required":false,"in":"query","description":"Defaults true. false targets a customer wallet.","schema":{}}],"responses":{"200":{"description":"Cap removed","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeleteLimitResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Remove spend cap","tags":["Treasury"],"x-required-scope":"wallets:write"}},"/v1/limits/allowances":{"get":{"description":"Requires scope wallets:read.","operationId":"list-allowances","parameters":[{"name":"safeAddress","required":true,"in":"query","description":"The Safe whose allowances to read","schema":{}},{"name":"chain","required":true,"in":"query","description":"An EVM chain","schema":{}}],"responses":{"200":{"description":"The Safe's active allowances on that chain","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SafeAllowancesDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"List allowances","tags":["Treasury"],"x-required-scope":"wallets:read"}},"/v1/limits/delegates":{"post":{"description":"Requires scope wallets:write.","operationId":"create-delegate-address","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionDelegateDto"}}}},"responses":{"200":{"description":"delegateAddress and entityKey for this signer","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DelegateProvisionResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"forbidden: on-chain limits are a treasury feature — signerId is not a passkey enrolled on this treasury"},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Create delegate address","tags":["Treasury"],"x-required-scope":"wallets:write"}},"/v1/limits/setup":{"post":{"description":"Requires scope wallets:write.","operationId":"prepare-allowance-setup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareAllowanceSetupDto"}}}},"responses":{"200":{"description":"A prepared userOp and its hash","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PreparedAllowanceDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"403":{"description":"forbidden: on-chain limits are a treasury feature — safeAddress is not this tenant's treasury Safe, or the tenant has no treasury"},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Prepare allowance setup","tags":["Treasury"],"x-required-scope":"wallets:write"}},"/v1/limits/spend/prepare":{"post":{"description":"Requires scope transactions:create.","operationId":"prepare-delegate-spend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendPrepareDto"}}}},"responses":{"200":{"description":"The prepared spend and the hash to sign","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SpendPrepareResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"spend_limit_exceeded: the amount exceeds the delegate's remaining allowance."},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Prepare delegate spend","tags":["Treasury"],"x-required-scope":"transactions:create"}},"/v1/limits/spend/submit":{"post":{"description":"Requires scope transactions:create.","operationId":"submit-delegate-spend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendSubmitDto"}}}},"responses":{"200":{"description":"The relay operation the bundler accepted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SpendSubmitResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"409":{"description":"spend_limit_exceeded: the amount exceeds the delegate's remaining allowance."},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Submit delegate spend","tags":["Treasury"],"x-required-scope":"transactions:create"}},"/v1/signing-threshold":{"put":{"description":"Requires scope wallets:write.","operationId":"set-signing-threshold","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSigningThresholdDto"}}}},"responses":{"200":{"description":"Threshold now in force","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SigningThresholdDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Set signing threshold","tags":["Treasury"],"x-required-scope":"wallets:write"},"get":{"description":"Requires scope wallets:read.","operationId":"get-signing-threshold","parameters":[{"name":"treasury","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Threshold in force, and the signers enrolled","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SigningThresholdDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Get signing threshold","tags":["Treasury"],"x-required-scope":"wallets:read"}},"/v1/signing-threshold/pending":{"delete":{"description":"Requires scope wallets:write.","operationId":"discard-pending-threshold-changes","parameters":[{"name":"treasury","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"What was discarded, kept or found landed on each chain","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DiscardPendingThresholdDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Discard pending threshold changes","tags":["Treasury"],"x-required-scope":"wallets:write"}},"/v1/wallets/{id}/threshold":{"post":{"description":"Requires scope wallets:write.","operationId":"set-safe-threshold","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetThresholdDto"}}}},"responses":{"200":{"description":"Threshold change submitted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ThresholdResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Set Safe threshold","tags":["Treasury"],"x-required-scope":"wallets:write"},"get":{"description":"Requires scope wallets:read.","operationId":"get-safe-threshold","parameters":[{"name":"chain","required":true,"in":"query","schema":{}}],"responses":{"200":{"description":"Current threshold","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ThresholdResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Get Safe threshold","tags":["Treasury"],"x-required-scope":"wallets:read"}},"/v1/treasury/proposals":{"post":{"description":"Requires scope transactions:create.","operationId":"create-proposal","parameters":[{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepareTreasuryProposalDto"}}}},"responses":{"200":{"description":"The proposal, with the safeTxHash and challenge to sign","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Create proposal","tags":["Treasury"],"x-required-scope":"transactions:create"},"get":{"description":"Requires scope transactions:read.","operationId":"list-proposals","parameters":[{"name":"status","required":false,"in":"query","schema":{}},{"name":"chain","required":false,"in":"query","schema":{}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"responses":{"200":{"description":"Proposals","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalListDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"List proposals","tags":["Treasury"],"x-required-scope":"transactions:read"}},"/v1/treasury/proposals/signatures":{"post":{"description":"Requires scope transactions:create.","operationId":"sign-proposals-in-batch","parameters":[{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitTreasuryProposalSignatureBatchDto"}}}},"responses":{"200":{"description":"Per-proposal submission results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalSignatureBatchResultDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Sign proposals in batch","tags":["Treasury"],"x-required-scope":"transactions:create"}},"/v1/treasury/proposals/{safeTxHash}/signatures":{"post":{"description":"Requires scope transactions:create.","operationId":"sign-proposal","parameters":[{"name":"safeTxHash","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitTreasuryProposalSignatureDto"}}}},"responses":{"200":{"description":"The proposal with the new signature recorded","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Sign proposal","tags":["Treasury"],"x-required-scope":"transactions:create"}},"/v1/treasury/proposals/{safeTxHash}/reject":{"post":{"description":"Requires scope transactions:create.","operationId":"reject-proposal","parameters":[{"name":"safeTxHash","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"responses":{"200":{"description":"The reject proposal to collect signatures for","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Reject proposal","tags":["Treasury"],"x-required-scope":"transactions:create"}},"/v1/treasury/proposals/{safeTxHash}":{"get":{"description":"Requires scope transactions:read.","operationId":"get-proposal","parameters":[{"name":"safeTxHash","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"responses":{"200":{"description":"Proposal","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TreasuryProposalDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Get proposal","tags":["Treasury"],"x-required-scope":"transactions:read"}},"/v1/transactions/approvals":{"get":{"description":"Requires scope wallets:read.","operationId":"list-pending-approvals","parameters":[{"name":"treasury","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"}],"responses":{"200":{"description":"Pending approval collections","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CustodialApprovalListDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"List pending approvals","tags":["Treasury"],"x-required-scope":"wallets:read"}},"/v1/transactions/approvals/{challenge}":{"get":{"description":"Requires scope wallets:read.","operationId":"get-pending-approval","parameters":[{"name":"treasury","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"},{"name":"challenge","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The approval collection","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CustodialApprovalDto"},"status":{"type":"number","example":200},"success":{"type":"boolean","example":true}},"required":["data","status","success"]}}}},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Get pending approval","tags":["Treasury"],"x-required-scope":"wallets:read"},"delete":{"description":"Requires scope wallets:write.","operationId":"cancel-pending-approval","parameters":[{"name":"treasury","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"x-customer-id","in":"header","required":false,"schema":{"type":"string"},"example":"<customer id>"},{"name":"challenge","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Collection cancelled"},"401":{"description":"The Authorization header is missing, malformed, or the API key is unknown or revoked","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/unauthorized"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":401},"code":{"type":"string","enum":["unauthorized"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":401},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}},"429":{"description":"The API key exceeded its request budget for the window","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","example":"https://errors.wallet-infra/rate_limit_exceeded"},"title":{"type":"string","description":"Short, human-readable summary of what went wrong"},"status":{"type":"number","example":429},"code":{"type":"string","enum":["rate_limit_exceeded"],"description":"Machine-readable cause."},"category":{"type":"string","enum":["client"],"description":"Where the fault lies: client (your request), upstream (a chain, node or dependency) or internal (ours)."},"detail":{"type":"string","description":"What to change to make the call succeed, naming the field or value at fault when there is one"},"request_id":{"type":"string","description":"Echo this when reporting the failure"},"retry_safety":{"type":"string","enum":["safe","indeterminate"],"description":"Present only when the service knows whether retrying is safe. safe: nothing was broadcast, so the same request may be retried. indeterminate: the operation may have reached the chain, so check its status before retrying rather than submitting it twice"},"reason":{"type":"string","description":"Present on some refusals: a finer machine-readable cause within code, for example allowance_remaining_exceeded on spend_limit_exceeded."},"facts":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},"description":"Present alongside reason: the figures behind the refusal, for example remainingBaseUnits on allowance_remaining_exceeded"}},"required":["type","title","status","code","category","request_id"]},"status":{"type":"number","example":429},"success":{"type":"boolean","example":false}},"required":["data","status","success"]}}}}},"security":[{"ApiKey":[]}],"summary":"Cancel pending approval","tags":["Treasury"],"x-required-scope":"wallets:write"}}},"info":{"title":"Wallet Infrastructure — Public API","description":"Business integration API (/v1): customers, wallets, transactions, quotes, balances. Authenticate with your API key as a Bearer token. Each operation carries an x-required-scope extension naming the API-key scope the gateway enforces for it.","version":"1.0","contact":{}},"tags":[{"name":"Wallets","description":"Create, provision and read wallets."},{"name":"Balances","description":"Read wallet balances."},{"name":"Quotes","description":"Price a send before it is made."},{"name":"Transactions","description":"Send funds and track transactions."},{"name":"Swaps","description":"Swap between USD₮ and gold (XAUT)."},{"name":"Bridges","description":"Move USD₮ between networks."},{"name":"Customers","description":"Register and read customers."},{"name":"Passkeys","description":"Manage the passkeys that secure a wallet."},{"name":"Guardians","description":"Manage recovery guardians."},{"name":"Recoveries","description":"Start, read and cancel recoveries."},{"name":"Recovery Contacts","description":"Register owner recovery contacts."},{"name":"Treasury","description":"Treasury signers, approvals, proposals and spending limits."},{"name":"Payment Links","description":"Create and settle payment-link payments."},{"name":"Collections","description":"Collection addresses and sweeps."},{"name":"Webhooks","description":"Manage notification endpoints."}],"servers":[{"url":"https://api.pilot.shiga.io","description":"Pilot"}],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"sk_test_ or sk_live_ key","type":"http","description":"Your sk_live_ / sk_test_ API key"}},"schemas":{"CustomerViewDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"reference":{"type":"string","description":"Caller-supplied external reference"},"displayName":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","reference","displayName","email","createdAt","updatedAt"]},"CreateCustomerDto":{"type":"object","properties":{"reference":{"type":"string"}}},"CustomerListResultDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CustomerViewDto"}},"nextCursor":{"type":"string","description":"Keyset cursor for the next page"}},"required":["items"]},"PaymentAddressDto":{"type":"object","properties":{"chain":{"type":"string","description":"Chain family the address was derived under.","enum":["evm","bitcoin","spark","solana","tron","ton"]},"moduleId":{"type":"string","example":"evm_erc4337"},"address":{"type":"string","description":"The one-time address the payer sends to"},"accountIndex":{"type":"number","description":"Index this address was derived at, assigned by the server and never reused"},"asset":{"type":"string","example":"USDT"},"expectedAmount":{"type":"string","description":"Exactly what must arrive for this payment to settle.","example":"1"},"destinationAddress":{"type":"string","description":"Where the money goes once it arrives."},"platformPays":{"type":"boolean","description":"Whether the platform pays the network fee on this chain"},"quotedFee":{"type":"string","description":"Fee quoted at creation, in feeAsset's display unit"},"feeAsset":{"type":"string"}},"required":["chain","moduleId","address","accountIndex","asset","expectedAmount","destinationAddress","platformPays"]},"ApprovalChallengeDto":{"type":"object","properties":{"challenge":{"type":"string","description":"base64url challenge the enclave binds to this exact transaction."},"amount":{"type":"string","example":"248900","description":"Net amount that will be sent if this challenge is signed in the asset's display unit, like a wallet send amount (\"10.5\" USDT, \"0.0001\" BTC)"},"fee":{"type":"string","example":"0.0011","description":"Network fee covered by this challenge in the asset's display unit, like a wallet send amount (\"10.5\" USDT, \"0.0001\" BTC)"},"expiresAt":{"type":"string","format":"date-time","description":"After this the challenge is stale: signing it gets a 409 approval_stale and, for a sweep approval, a fresh challenge"}},"required":["challenge","amount","fee","expiresAt"]},"PaymentAttemptDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the deposit landed on (for example base or polygon, not the evm family)"},"status":{"type":"string","enum":["DEPOSITED","PENDING_APPROVAL","SETTLING","SETTLED","FAILED","APPROVAL_EXPIRED"]},"amountReceived":{"type":"string","description":"What actually arrived"},"depositTxHash":{"type":"string","description":"The payer's transaction"},"settleTxHash":{"type":"string","nullable":true,"description":"The transaction that moved it to the destination"},"actualFee":{"type":"string","nullable":true},"lastError":{"type":"string","nullable":true,"description":"Why the sweep failed, when it did"},"createdAt":{"type":"string","format":"date-time"},"approval":{"description":"Present only on a PENDING_APPROVAL attempt: the challenge the approver has to sign to release this sweep","allOf":[{"$ref":"#/components/schemas/ApprovalChallengeDto"}]}},"required":["id","chain","status","amountReceived","depositTxHash","settleTxHash","actualFee","lastError","createdAt"]},"UnclaimedDepositDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid","description":"The payment-links project this belongs to."},"paymentId":{"type":"string","format":"uuid","nullable":true},"chain":{"type":"string","description":"The chain the money landed on, not the family"},"address":{"type":"string"},"asset":{"type":"string"},"amountReceived":{"type":"string"},"reason":{"type":"string","enum":["UNDERPAID","OVERPAID_REMAINDER","LATE","EXPIRED","SIBLING_AFTER_FULFILMENT","CANCELLED","WRONG_ASSET"]},"status":{"type":"string","enum":["OPEN","RECOVERING","RECOVERED"]},"depositTxHash":{"type":"string"},"recoveryTxHash":{"type":"string","nullable":true},"recoveryDestination":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","paymentId","chain","address","asset","amountReceived","reason","status","depositTxHash","recoveryTxHash","recoveryDestination","createdAt"]},"PaymentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid","description":"The payment-links project this belongs to."},"reference":{"type":"string","description":"The business's own reference."},"status":{"type":"string","enum":["AWAITING_PAYMENT","FULFILLED","EXPIRED","CANCELLED"]},"expiresAt":{"type":"string","format":"date-time","description":"After this, a deposit no longer settles the payment"},"watchUntil":{"type":"string","format":"date-time","description":"Grace period end."},"addresses":{"description":"One address per chain family asked for.","type":"array","items":{"$ref":"#/components/schemas/PaymentAddressDto"}},"attempts":{"description":"What actually arrived and how far it got.","type":"array","items":{"$ref":"#/components/schemas/PaymentAttemptDto"}},"unclaimed":{"description":"Every unclaimed deposit recorded against this payment, in any status: late or sibling-chain deposits and overpayment remainders.","type":"array","items":{"$ref":"#/components/schemas/UnclaimedDepositDto"}}},"required":["id","projectId","reference","status","expiresAt","watchUntil","addresses"]},"CreatePaymentDto":{"type":"object","properties":{"reference":{"description":"Your own reference for this payment.","type":"string","minLength":1,"maxLength":200},"destinations":{"description":"One entry per chain family you will accept.","type":"object","additionalProperties":{"type":"object","properties":{"asset":{"description":"Asset the payer sends, e.g.","type":"string","minLength":1},"amount":{"description":"Exactly what must arrive on this chain, in the asset's display unit, the same way a wallet send takes its amount: \"10.5\" is 10.5 USDT and \"0.0001\" is 0.0001 BTC.","type":"string","pattern":"^\\d+(\\.\\d+)?$"},"destinationAddress":{"description":"Where the money goes once it arrives.","type":"string","minLength":1}},"required":["asset","amount","destinationAddress"]}}},"required":["reference","destinations"]},"PaymentListAddressDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"],"description":"The wallet module the address was minted under"},"chain":{"type":"string","example":"base","description":"The concrete chain, not the family"},"asset":{"type":"string","example":"USDT"},"expectedAmount":{"type":"string","example":"1","description":"What must arrive on this chain in the asset's display unit, like a wallet send amount (\"10.5\" USDT, \"0.0001\" BTC)."},"destinationAddress":{"type":"string","description":"Where a settled payment on this chain is swept to"}},"required":["moduleId","chain","asset","expectedAmount","destinationAddress"]},"PaymentAttemptSummaryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the deposit landed on"},"status":{"type":"string","enum":["DEPOSITED","PENDING_APPROVAL","SETTLING","SETTLED","FAILED","APPROVAL_EXPIRED"]},"amountReceived":{"type":"string"}},"required":["id","chain","status","amountReceived"]},"PaymentListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid","description":"The payment-links project this belongs to."},"reference":{"type":"string"},"status":{"type":"string","enum":["AWAITING_PAYMENT","FULFILLED","EXPIRED","CANCELLED"]},"feeMode":{"type":"string","example":"inclusive"},"expiresAt":{"type":"string","format":"date-time"},"watchUntil":{"type":"string","format":"date-time"},"fulfilledAt":{"type":"string","format":"date-time","nullable":true},"addresses":{"description":"One entry per chain this payment can be paid on, with the exact amount and the destination it settles to.","type":"array","items":{"$ref":"#/components/schemas/PaymentListAddressDto"}},"paidChain":{"type":"string","nullable":true,"description":"The chain the payment was paid on, once it is FULFILLED."},"attempts":{"description":"Every attempt on this payment, oldest first.","type":"array","items":{"$ref":"#/components/schemas/PaymentAttemptSummaryDto"}},"openUnclaimedCount":{"type":"number","description":"How many of this payment's unclaimed deposits are still OPEN"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","reference","status","feeMode","expiresAt","watchUntil","fulfilledAt","addresses","paidChain","attempts","openUnclaimedCount","createdAt"]},"PaymentListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PaymentListItemDto"}},"pendingApprovalCount":{"type":"number","description":"How many attempts are waiting on an approver across everything this caller can read, not just this page, whatever filters were applied"},"nextCursor":{"type":"string","description":"Pass back as ?cursor= for the next page."}},"required":["items","pendingApprovalCount"]},"CancelledPaymentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["CANCELLED"]},"reference":{"type":"string","description":"Your own reference, unchanged."}},"required":["id","status","reference"]},"PasskeyPublicKeyDto":{"type":"object","properties":{"x":{"type":"string","description":"Passkey P-256 public key X coordinate (0x + 64 hex)"},"y":{"type":"string","description":"Passkey P-256 public key Y coordinate (0x + 64 hex)"}},"required":["x","y"]},"WalletReferenceDto":{"type":"object","properties":{"entityKey":{"type":"string","description":"Deterministic key identifying the owning entity"},"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"businessId":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"customerId":{"type":"string","description":"Present only for non-treasury (customer) wallets"},"treasury":{"type":"boolean"},"chain":{"type":"string","enum":["evm","bitcoin","spark","solana","tron","ton"]},"address":{"type":"string","nullable":true,"description":"Derived address."},"passkeyPublicKey":{"description":"The wallet passkey's P-256 coordinates, decoded from the supplied credentialPublicKey.","allOf":[{"$ref":"#/components/schemas/PasskeyPublicKeyDto"}]}},"required":["entityKey","moduleId","businessId","projectId","treasury","chain","address"]},"CreateWalletDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"isTreasury":{"type":"boolean"},"passkeyRegistration":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"description":"The authenticator COSE public key (CBOR bytes) as base64url — the encoding browsers and @simplewebauthn emit.","type":"string"},"counter":{"description":"Not persisted at creation — omit.","type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"description":"Informational only — not persisted.","type":"array","items":{"type":"string"}},"rpId":{"type":"string"},"origins":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","rpId","origins"]}},"required":["moduleId","passkeyRegistration"]},"DeploymentStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["deployed","submitted"]},"userOpHash":{"type":"string","description":"Present when the deploy UserOp hash is known"},"transactionHash":{"type":"string","description":"Present once the deploy is confirmed on-chain"}},"required":["status"]},"ChainDeploymentStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["deployed","submitted"]},"userOpHash":{"type":"string","description":"Present when the deploy UserOp hash is known"},"transactionHash":{"type":"string","description":"Present once the deploy is confirmed on-chain"},"chain":{"type":"string","description":"The EVM chain this deployment status refers to"}},"required":["status","chain"]},"ProvisionWalletResultDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"chain":{"type":"string","enum":["evm","bitcoin","spark","solana","tron","ton"]},"address":{"type":"string","nullable":true},"status":{"type":"string","enum":["created","already_exists","failed"]},"error":{"type":"string","description":"Error code, present only when status is failed"},"deployment":{"description":"Present only on the evm_erc4337 entry when a passkey-Safe deploy was queued (or, with PASSKEY_SAFE_DEPLOY_INLINE, attempted) as part of this call.","allOf":[{"$ref":"#/components/schemas/DeploymentStatusDto"}]},"deployments":{"description":"Per-chain deploy status for the evm_erc4337 passkey Safe.","type":"array","items":{"$ref":"#/components/schemas/ChainDeploymentStatusDto"}}},"required":["moduleId","chain","address","status"]},"ProvisionWalletsResultDto":{"type":"object","properties":{"wallets":{"type":"array","items":{"$ref":"#/components/schemas/ProvisionWalletResultDto"}},"passkeyPublicKey":{"description":"The shared passkey's P-256 coordinates for the batch, decoded from the supplied credentialPublicKey.","allOf":[{"$ref":"#/components/schemas/PasskeyPublicKeyDto"}]}},"required":["wallets"]},"ProvisionWalletsDto":{"type":"object","properties":{"isTreasury":{"type":"boolean"},"passkeyRegistration":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"description":"The authenticator COSE public key (CBOR bytes) as base64url — the encoding browsers and @simplewebauthn emit.","type":"string"},"counter":{"description":"Not persisted at creation — omit.","type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"description":"Informational only — not persisted.","type":"array","items":{"type":"string"}},"rpId":{"type":"string"},"origins":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","rpId","origins"]},"modules":{"type":"array","minItems":1,"maxItems":6,"items":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]}}},"required":["passkeyRegistration"]},"BalanceEntryDto":{"type":"object","properties":{"chain":{"type":"string","description":"Concrete chain id (evm chains are expanded)","example":"base"},"asset":{"type":"string","description":"Asset symbol","example":"USDT"},"amount":{"type":"string","description":"Amount in base units (stringified integer)","example":"1000000"},"decimals":{"type":"number","example":6}},"required":["chain","asset","amount","decimals"]},"WalletWithBalancesDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"moduleId":{"type":"string"},"address":{"type":"string","description":"First address of the wallet."},"balances":{"type":"array","items":{"$ref":"#/components/schemas/BalanceEntryDto"}},"errors":{"description":"Per-chain read failures.","type":"array","items":{"type":"string"}}},"required":["walletId","moduleId","address","balances"]},"WalletBalancesResultDto":{"type":"object","properties":{"wallets":{"type":"array","items":{"$ref":"#/components/schemas/WalletWithBalancesDto"}},"nextCursor":{"type":"string","description":"Keyset cursor for the next page"}},"required":["wallets"]},"WalletAddressDto":{"type":"object","properties":{"chain":{"type":"string"},"address":{"type":"string"}},"required":["chain","address"]},"WalletListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"entityKey":{"type":"string"},"moduleId":{"type":"string"},"treasury":{"type":"boolean"},"label":{"type":"string","nullable":true},"status":{"type":"string"},"customerId":{"type":"string","format":"uuid","nullable":true},"createdAt":{"type":"string","format":"date-time"},"addresses":{"type":"array","items":{"$ref":"#/components/schemas/WalletAddressDto"}}},"required":["id","entityKey","moduleId","treasury","label","status","customerId","createdAt","addresses"]},"WalletListResultDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WalletListItemDto"}},"nextCursor":{"type":"string","description":"Keyset cursor for the next page"}},"required":["items"]},"UsdtLegDto":{"type":"object","properties":{"contract":{"type":"string","description":"The contract this leg spends"},"symbol":{"type":"string","enum":["USDT","USD₮0"],"example":"USDT"},"amount":{"type":"string","description":"Amount this leg moves, human-readable"}},"required":["contract","symbol","amount"]},"UsdtSwapDto":{"type":"object","properties":{"fromContract":{"type":"string","description":"The contract swapped from (USD₮0 on optimism)"},"fromSymbol":{"type":"string","example":"USD₮0"},"toContract":{"type":"string","description":"The canonical USDT contract the recipient receives"},"amountIn":{"type":"string","description":"Amount swapped, human-readable."},"expectedOut":{"type":"string","description":"Quoted output at the current pool price"},"minOut":{"type":"string","description":"The least the swap may return."},"fee":{"type":"string","description":"amountIn minus expectedOut, never negative."}},"required":["fromContract","fromSymbol","toContract","amountIn","expectedOut","minOut","fee"]},"QuoteResultDto":{"type":"object","properties":{"chain":{"type":"string"},"moduleId":{"type":"string","description":"Wallet module the quote is for","example":"evm_erc4337"},"senderAddress":{"type":"string","nullable":true,"description":"The wallet this quote is for, resolved by the server from moduleId, the x-customer-id header and the treasury flag — never sent by the caller."},"token":{"type":"string","nullable":true,"description":"Asset being transferred.","example":"usdt"},"gasToken":{"type":"string","nullable":true,"description":"Asset the gas/fee is charged in.","example":"usdt"},"gas":{"type":"string","description":"Estimated gas/fee, human-readable, denominated in gasToken"},"sponsored":{"type":"boolean"},"userCost":{"type":"string","description":"Cost to the user."},"maxSendable":{"type":"string","description":"The largest amount this wallet could send in one transfer after the fee, in the asset's display unit."},"legs":{"description":"How a usdt transfer will be drawn from the wallet.","type":"array","items":{"$ref":"#/components/schemas/UsdtLegDto"}},"swap":{"description":"Present when the wallet held its USDT across two contracts on this chain (optimism: USDT and USD₮0) and neither covered the amount alone.","allOf":[{"$ref":"#/components/schemas/UsdtSwapDto"}]}},"required":["chain","moduleId","senderAddress","token","gasToken","gas","sponsored","userCost"]},"CreateQuoteDto":{"type":"object","properties":{"moduleId":{"description":"Selects the wallet to quote for.","type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"treasury":{"description":"Set true to quote for the customer's treasury wallet rather than their ordinary one.","type":"boolean"},"txParams":{"type":"object","properties":{"chain":{"description":"Chain to price on: an EVM chain name on evm_erc4337 (base, ethereum, …), otherwise the module's own chain (bitcoin, spark, solana, tron, ton).","type":"string"},"amount":{"description":"Amount in the display unit of the asset — BTC on bitcoin/spark, token units on the others — never base units (satoshis, lamports, wei).","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d+)?$"},"recipientAddress":{"description":"The destination, in the chain's own address format and on the network this deployment runs: bitcoin — base58check starting 1 or 3, or bech32 starting bc1 (bc1q and bc1p both accepted).","type":"string"},"token":{"description":"Asset to price. evm_erc4337: \"usdt\" (default) or \"xaut\" — case-insensitive. solana: \"USDT\" or a base58 mint address. tron: \"USDT\" or the token's TRC-20 contract exactly as GasFree publishes it (that match is case-sensitive). ton: a jetton master address, defaulting to USD₮. bitcoin and spark ignore it — the fee is always BTC.","type":"string"},"senderAddress":{"description":"Optional, quotes only.","type":"string"}},"required":["chain","amount","recipientAddress"]}},"required":["moduleId","txParams"]},"SparkQuoteResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"spark"},"moduleId":{"type":"string","example":"spark"},"operation":{"type":"string","enum":["quoteWithdraw","quoteLightningPayment"],"example":"quoteWithdraw","description":"The operation that was priced, echoed back."},"fee":{"type":"string","description":"The fee as a DISPLAY string, formatted by the enclave: US dollars to 6 decimal places when btcUsdRate was sent, otherwise BTC as a decimal.","example":"0.784000"},"feeSats":{"type":"integer","format":"int64","description":"The same fee as an exact integer count of satoshis.","example":1206},"sparkData":{"type":"object","description":"The pricing detail behind the scalar, passed through from the enclave."}},"required":["chain","moduleId","operation","fee","sparkData"]},"SparkQuoteDto":{"type":"object","properties":{"operation":{"description":"What to price. quoteWithdraw prices a cooperative exit from Spark to a Bitcoin L1 address and needs withdrawalAddress + amountSats. quoteLightningPayment prices paying a Lightning invoice and needs encodedInvoice.","type":"string","enum":["quoteWithdraw","quoteLightningPayment"]},"treasury":{"description":"Set true to price against the customer's treasury spark wallet rather than their ordinary one.","type":"boolean"},"withdrawalAddress":{"description":"quoteWithdraw only, and required for it: the Bitcoin L1 address the exit pays out to.","type":"string"},"amountSats":{"description":"quoteWithdraw only, and required for it: the amount to withdraw, as an integer count of satoshis.","type":"integer","minimum":0,"exclusiveMinimum":true},"encodedInvoice":{"description":"quoteLightningPayment only, and required for it: the BOLT-11 invoice to pay.","type":"string"},"btcUsdRate":{"description":"Optional BTC/USD rate.","type":"number","minimum":0,"exclusiveMinimum":false}},"required":["operation"]},"SwapQuoteResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"ethereum"},"moduleId":{"type":"string","example":"evm_erc4337"},"senderAddress":{"type":"string","description":"The Safe this swap was priced for"},"fromToken":{"type":"string","description":"Token sold","example":"usdt"},"toToken":{"type":"string","description":"Token bought","example":"xaut"},"amountIn":{"type":"string","description":"Amount sold, human-readable"},"amountOut":{"type":"string","description":"Quoted output at the current route price, human-readable"},"minAmountOut":{"type":"string","description":"Guaranteed minimum output after the slippage buffer."},"slippageBps":{"type":"number","description":"Slippage tolerance applied to minAmountOut, in basis points.","example":100},"feeToken":{"type":"string","description":"Token the gas fee is charged in.","example":"usdt"},"gas":{"type":"string","description":"Gas fee, human-readable, denominated in feeToken."},"sponsored":{"type":"boolean","description":"Always false.","example":false},"userCost":{"type":"string","description":"Cost to the customer, denominated in feeToken."},"gasEstimated":{"type":"boolean","description":"True when the fee came from the conservative fallback table because the paymaster could not price the operation, rather than from a live quote."}},"required":["chain","moduleId","senderAddress","fromToken","toToken","amountIn","amountOut","minAmountOut","slippageBps","feeToken","gas","sponsored","userCost","gasEstimated"]},"SwapQuoteDto":{"type":"object","properties":{"chain":{"description":"Only ethereum is routable for USDT/XAUT today.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"fromToken":{"description":"Token being sold.","type":"string","enum":["usdt","xaut"]},"toToken":{"description":"Token being bought.","type":"string","enum":["usdt","xaut"]},"amount":{"description":"Amount of fromToken to sell, in token units (for example \"100\" USDT).","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the swap.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain","fromToken","toToken","amount","safeAddress"]},"SwapMaxResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"ethereum"},"safeAddress":{"type":"string"},"fromToken":{"type":"string","example":"usdt"},"toToken":{"type":"string","example":"xaut"},"balance":{"type":"string","description":"The wallet's balance of fromToken, human-readable"},"feeToken":{"type":"string","description":"Token the gas fee is charged in.","example":"usdt"},"gas":{"type":"string","description":"Gas reserved out of the balance, priced against a swap of the whole balance"},"gasEstimated":{"type":"boolean","description":"True when gas came from the fallback table because the whole-balance route could not be priced"},"maxAmountIn":{"type":"string","description":"The largest amount of fromToken that can be swapped: balance minus the reserved gas."},"belowMinimum":{"type":"boolean","description":"True when maxAmountIn falls below the per-token minimum, so no swap is possible at this balance"}},"required":["chain","safeAddress","fromToken","toToken","balance","feeToken","gas","gasEstimated","maxAmountIn","belowMinimum"]},"MaxSwapDto":{"type":"object","properties":{"chain":{"description":"Only ethereum is routable for USDT/XAUT today.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"fromToken":{"description":"Token being sold.","type":"string","enum":["usdt","xaut"]},"toToken":{"description":"Token being bought.","type":"string","enum":["usdt","xaut"]},"safeAddress":{"description":"The Safe doing the swap.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]}},"required":["chain","fromToken","toToken","safeAddress","passkeyPublicKey"]},"SwapPrepareResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"ethereum"},"safeAddress":{"type":"string"},"userOp":{"type":"object","description":"The unsigned batched userOperation, bigint-free"},"userOpHash":{"type":"string","description":"Sign this with the passkey and return the assertion to POST /v1/swaps."},"fromToken":{"type":"string","example":"usdt"},"toToken":{"type":"string","example":"xaut"},"amountIn":{"type":"string"},"amountOut":{"type":"string"},"minAmountOut":{"type":"string"},"slippageBps":{"type":"number","example":100},"feeToken":{"type":"string","example":"usdt"}},"required":["chain","safeAddress","userOp","userOpHash","fromToken","toToken","amountIn","amountOut","minAmountOut","slippageBps","feeToken"]},"PrepareSwapDto":{"type":"object","properties":{"chain":{"description":"Only ethereum is routable for USDT/XAUT today.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"fromToken":{"description":"Token being sold.","type":"string","enum":["usdt","xaut"]},"toToken":{"description":"Token being bought.","type":"string","enum":["usdt","xaut"]},"amount":{"description":"Amount of fromToken to sell, in token units (for example \"100\" USDT).","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the swap.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]}},"required":["chain","fromToken","toToken","amount","safeAddress","passkeyPublicKey"]},"SwapSubmitResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"ethereum"},"safeAddress":{"type":"string"},"userOpHash":{"type":"string"},"fromToken":{"type":"string","example":"usdt"},"toToken":{"type":"string","example":"xaut"},"amountIn":{"type":"string"},"transactionHash":{"type":"string","description":"On-chain transaction hash once the bundler reported one"},"pendingUserOp":{"type":"boolean","description":"True when the bundler accepted the userOperation but no transaction hash is known yet."}},"required":["chain","safeAddress","userOpHash","fromToken","toToken","amountIn"]},"SubmitSwapDto":{"type":"object","properties":{"chain":{"description":"Only ethereum is routable for USDT/XAUT today.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"fromToken":{"description":"Token being sold.","type":"string","enum":["usdt","xaut"]},"toToken":{"description":"Token being bought.","type":"string","enum":["usdt","xaut"]},"amount":{"description":"Amount of fromToken to sell, in token units (for example \"100\" USDT).","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the swap.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"The passkey assertion over the userOpHash returned by POST /v1/swaps/prepare.","type":"object","additionalProperties":{}},"userOp":{"description":"The userOperation returned verbatim by POST /v1/swaps/prepare.","type":"object","additionalProperties":{}},"userOpHash":{"description":"The userOpHash returned by POST /v1/swaps/prepare, which the passkey assertion signs.","type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["chain","fromToken","toToken","amount","safeAddress","passkeyPublicKey","passkeyData","userOp","userOpHash"]},"BridgeQuoteResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"destinationChain":{"type":"string","example":"arbitrum","description":"Where the USD₮ lands: one of the other Across-covered EVM chains, or tron."},"moduleId":{"type":"string","example":"evm_erc4337"},"senderAddress":{"type":"string","description":"The Safe this bridge was priced for"},"recipient":{"type":"string","description":"The destination-chain address the USD₮ is delivered to"},"asset":{"type":"string","example":"usdt"},"amountIn":{"type":"string","description":"Amount leaving the Safe, human-readable"},"amountOut":{"type":"string","description":"What the recipient is expected to receive after the bridge fee, human-readable."},"minAmountOut":{"type":"string","description":"The least the recipient can receive."},"bridgeFee":{"type":"string","description":"The bridge fee taken out of the USD₮ (relayer capital, liquidity provider and destination gas), human-readable"},"bridgeFeeBps":{"type":"number","description":"The same fee as a share of amountIn, in basis points","example":34},"estimatedFillSeconds":{"type":"number","description":"The relayer's expected time to fill, in seconds","example":2},"quoteExpiresAt":{"type":"string","format":"date-time","description":"When this route's price stops being honoured."},"feeToken":{"type":"string","example":"usdt","description":"Token the gas fee is charged in."},"gas":{"type":"string","description":"Source-chain gas, human-readable, denominated in feeToken and charged by the paymaster on top of amountIn"},"sponsored":{"type":"boolean","example":false,"description":"Always false."},"userCost":{"type":"string","description":"Cost to the customer in feeToken."},"gasEstimated":{"type":"boolean","description":"True when the gas figure came from the fallback table because the paymaster could not price the operation"},"provider":{"type":"string","example":"across"}},"required":["chain","destinationChain","moduleId","senderAddress","recipient","asset","amountIn","amountOut","minAmountOut","bridgeFee","bridgeFeeBps","estimatedFillSeconds","quoteExpiresAt","feeToken","gas","sponsored","userCost","gasEstimated","provider"]},"QuoteBridgeDto":{"type":"object","properties":{"chain":{"description":"The chain the USD₮ leaves from: ethereum, arbitrum, polygon, optimism, base or plasma.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma"]},"destinationChain":{"description":"Where the USD₮ lands: any of the six source chains other than chain, or tron.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma","tron"]},"recipient":{"description":"The address that receives the USD₮ on destinationChain: a 0x address for an EVM destination, a base58 T... address for tron.","type":"string","minLength":1,"maxLength":128},"amount":{"description":"Amount of USD₮ to send, in token units (for example \"100\").","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the bridge.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain","destinationChain","recipient","amount","safeAddress"]},"BridgePrepareResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"destinationChain":{"type":"string","example":"arbitrum","description":"Where the USD₮ lands: one of the other Across-covered EVM chains, or tron."},"moduleId":{"type":"string","example":"evm_erc4337"},"senderAddress":{"type":"string","description":"The Safe this bridge was priced for"},"recipient":{"type":"string","description":"The destination-chain address the USD₮ is delivered to"},"asset":{"type":"string","example":"usdt"},"amountIn":{"type":"string","description":"Amount leaving the Safe, human-readable"},"amountOut":{"type":"string","description":"What the recipient is expected to receive after the bridge fee, human-readable."},"minAmountOut":{"type":"string","description":"The least the recipient can receive."},"bridgeFee":{"type":"string","description":"The bridge fee taken out of the USD₮ (relayer capital, liquidity provider and destination gas), human-readable"},"bridgeFeeBps":{"type":"number","description":"The same fee as a share of amountIn, in basis points","example":34},"estimatedFillSeconds":{"type":"number","description":"The relayer's expected time to fill, in seconds","example":2},"quoteExpiresAt":{"type":"string","format":"date-time","description":"When this route's price stops being honoured."},"feeToken":{"type":"string","example":"usdt","description":"Token the gas fee is charged in."},"gas":{"type":"string","description":"Source-chain gas, human-readable, denominated in feeToken and charged by the paymaster on top of amountIn"},"sponsored":{"type":"boolean","example":false,"description":"Always false."},"userCost":{"type":"string","description":"Cost to the customer in feeToken."},"gasEstimated":{"type":"boolean","description":"True when the gas figure came from the fallback table because the paymaster could not price the operation"},"provider":{"type":"string","example":"across"},"bridgeId":{"type":"string","format":"uuid","description":"The bridge record created by this prepare."},"safeAddress":{"type":"string"},"userOp":{"type":"object","description":"The unsigned batched userOperation, bigint-free"},"userOpHash":{"type":"string","description":"Sign this with the passkey and return the assertion to POST /v1/bridges."}},"required":["chain","destinationChain","moduleId","senderAddress","recipient","asset","amountIn","amountOut","minAmountOut","bridgeFee","bridgeFeeBps","estimatedFillSeconds","quoteExpiresAt","feeToken","gas","sponsored","userCost","gasEstimated","provider","bridgeId","safeAddress","userOp","userOpHash"]},"PrepareBridgeDto":{"type":"object","properties":{"chain":{"description":"The chain the USD₮ leaves from: ethereum, arbitrum, polygon, optimism, base or plasma.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma"]},"destinationChain":{"description":"Where the USD₮ lands: any of the six source chains other than chain, or tron.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma","tron"]},"recipient":{"description":"The address that receives the USD₮ on destinationChain: a 0x address for an EVM destination, a base58 T... address for tron.","type":"string","minLength":1,"maxLength":128},"amount":{"description":"Amount of USD₮ to send, in token units (for example \"100\").","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the bridge.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]}},"required":["chain","destinationChain","recipient","amount","safeAddress","passkeyPublicKey"]},"BridgeSubmitResultDto":{"type":"object","properties":{"bridgeId":{"type":"string","format":"uuid"},"chain":{"type":"string","example":"base"},"destinationChain":{"type":"string","example":"arbitrum"},"safeAddress":{"type":"string"},"recipient":{"type":"string"},"userOpHash":{"type":"string"},"amountIn":{"type":"string"},"amountOut":{"type":"string"},"status":{"type":"string","enum":["prepared","submitted","deposited","filled","refunded","failed","stalled"],"example":"submitted","description":"Always submitted here."},"transactionHash":{"type":"string","description":"Source-chain transaction hash once the bundler reported one"},"pendingUserOp":{"type":"boolean","description":"True when the bundler accepted the userOperation but no transaction hash is known yet."}},"required":["bridgeId","chain","destinationChain","safeAddress","recipient","userOpHash","amountIn","amountOut","status"]},"SubmitBridgeDto":{"type":"object","properties":{"chain":{"description":"The chain the USD₮ leaves from: ethereum, arbitrum, polygon, optimism, base or plasma.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma"]},"destinationChain":{"description":"Where the USD₮ lands: any of the six source chains other than chain, or tron.","type":"string","enum":["ethereum","arbitrum","polygon","optimism","base","plasma","tron"]},"recipient":{"description":"The address that receives the USD₮ on destinationChain: a 0x address for an EVM destination, a base58 T... address for tron.","type":"string","minLength":1,"maxLength":128},"amount":{"description":"Amount of USD₮ to send, in token units (for example \"100\").","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The Safe doing the bridge.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"The passkey assertion over the userOpHash returned by POST /v1/bridges/prepare.","type":"object","additionalProperties":{}},"userOp":{"description":"The userOperation returned verbatim by POST /v1/bridges/prepare.","type":"object","additionalProperties":{}},"userOpHash":{"description":"The userOpHash returned by POST /v1/bridges/prepare, which the passkey assertion signs.","type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["chain","destinationChain","recipient","amount","safeAddress","passkeyPublicKey","passkeyData","userOp","userOpHash"]},"BridgeStatusDto":{"type":"object","properties":{"bridgeId":{"type":"string","format":"uuid"},"chain":{"type":"string","example":"base"},"destinationChain":{"type":"string","example":"tron"},"safeAddress":{"type":"string"},"recipient":{"type":"string"},"asset":{"type":"string","example":"usdt"},"amountIn":{"type":"string"},"amountOut":{"type":"string"},"minAmountOut":{"type":"string"},"bridgeFee":{"type":"string"},"provider":{"type":"string","example":"across"},"status":{"type":"string","enum":["prepared","submitted","deposited","filled","refunded","failed","stalled"],"example":"filled","description":"prepared: built, not yet signed. submitted: signed and handed to the bundler. deposited: the source transaction is mined and the deposit is with the relayers. filled: the USD₮ arrived at the recipient. refunded: the relayers could not fill and the USD₮ returned to the Safe on the source chain. failed: the source userOperation reverted or was refused, nothing left the Safe. stalled: the tracker gave up before seeing an outcome."},"userOpHash":{"type":"string"},"transactionHash":{"type":"string","nullable":true,"description":"Source-chain transaction hash: the bundle the userOperation was mined in, as the bundler reported it or as the tracker read it from the receipt"},"depositId":{"type":"string","nullable":true,"description":"Across's deposit id for this bridge, read from the FundsDeposited event in the userOperation receipt once the source deposit is mined."},"fillDeadlineAt":{"type":"string","format":"date-time","nullable":true,"description":"The fill deadline encoded in the signed deposit."},"acceptedUserOpHash":{"type":"string","nullable":true,"description":"The ERC-4337 userOperation hash the bundler accepted — the one explorers and eth_getUserOperationReceipt know. userOpHash is the Safe signing hash the passkey signed and is not visible on-chain."},"fillTransactionHash":{"type":"string","nullable":true,"description":"Destination-chain fill transaction, once filled"},"refundTransactionHash":{"type":"string","nullable":true,"description":"Source-chain refund transaction, once refunded"},"error":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time","nullable":true},"settledAt":{"type":"string","format":"date-time","nullable":true}},"required":["bridgeId","chain","destinationChain","safeAddress","recipient","asset","amountIn","amountOut","minAmountOut","bridgeFee","provider","status","userOpHash","transactionHash","depositId","fillDeadlineAt","acceptedUserOpHash","fillTransactionHash","refundTransactionHash","error","createdAt","submittedAt","settledAt"]},"TransactionResultDto":{"type":"object","properties":{"chain":{"type":"string"},"moduleId":{"type":"string"},"safeAddress":{"type":"string","description":"The wallet the transfer was sent from, on the erc4337 lane — the Safe the server resolved for this customer, echoed back."},"userOpHash":{"type":"string","description":"UserOperation hash (erc4337 lane)"},"transactionHash":{"type":"string","description":"On-chain transaction hash, once known"},"signedUserOpHash":{"type":"string","description":"Signed UserOperation hash (custodial lane)"},"pendingUserOp":{"type":"boolean","description":"True while the userOp is still pending on-chain"},"newCounter":{"type":"number","description":"New signing counter (custodial lane)"},"sponsored":{"type":"boolean"},"tonTransferContext":{"type":"object","description":"TON-specific transfer context"},"legs":{"description":"The usdt legs this transfer moved (erc4337 lane).","type":"array","items":{"$ref":"#/components/schemas/UsdtLegDto"}},"swap":{"description":"Present when the wallet held its USDT across two contracts on this chain (optimism: USDT and USD₮0) and neither covered the amount alone.","allOf":[{"$ref":"#/components/schemas/UsdtSwapDto"}]}},"required":["chain"]},"CreateTransactionDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"treasury":{"type":"boolean"},"txParams":{"type":"object","properties":{"chain":{"type":"string"},"amount":{"description":"Amount in the display unit of the asset — BTC on bitcoin/spark, token units on the others — never base units (satoshis, lamports, wei).","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d+)?$"},"selectedPayment":{"type":"string"},"senderAddress":{"description":"Optional, quotes only.","type":"string"},"recipientAddress":{"description":"The destination, in the chain's own address format and on the network this deployment runs: bitcoin — base58check starting 1 or 3, or bech32 starting bc1 (bc1q and bc1p both accepted).","type":"string"},"transactionId":{"description":"Your own integer sequence number for this transfer.","type":"integer"},"accountIndex":{"description":"Do not send — the infrastructure owns the derivation index.","type":"integer"},"networkConfig":{"description":"Only the asset selector is read (tokenMint / tokenRoot).","type":"object","additionalProperties":{}}},"required":["chain","amount","selectedPayment","networkConfig"]},"passkeyData":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"description":"The challenge the assertion answers.","type":"string"},"expectedOrigins":{"description":"Ignored on custodial transfers, possession proofs and add-device — the server uses the origins bound to the stored credential.","type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"description":"Ignored on custodial transfers, possession proofs and add-device — the server uses the RP id bound to the stored credential.","type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"description":"Ignored on transfers/proofs and on add-device — the server verifies against the credential's sealed key.","type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","counter"]}},"required":["credential","expectedChallenge","authenticator"]}},"required":["moduleId","txParams"]},"TransactionListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"treasury":{"type":"boolean"},"chain":{"type":"string"},"direction":{"type":"string","enum":["outgoing","incoming"],"example":"outgoing","description":"Which way the value moved: outgoing is a transfer this wallet sent, incoming is a deposit it received."},"purpose":{"type":"string","nullable":true,"enum":["transfer","swap","bridge","paylink_deposit","paylink_sweep","paylink_recovery"],"example":"transfer","description":"What the transaction was for: `transfer`, `swap`, or one of the payment-link movements: `paylink_deposit` (a payer's deposit to a payment address), `paylink_sweep` (the settlement from the payment address to the business) and `paylink_recovery` (money that arrived but did not settle, sent to a destination the business named)."},"paymentId":{"type":"string","format":"uuid","nullable":true,"description":"The payment link payment this transaction belongs to, for paylink_deposit, paylink_sweep and paylink_recovery rows."},"reference":{"type":"string"},"status":{"type":"string","enum":["submitted","pending","confirmed","failed"],"example":"submitted","description":"Lifecycle status. submitted and pending are both in flight and are NOT a failure. confirmed is the single settled status on every chain. failed covers both a proven on-chain failure and a transfer whose outcome we could not establish before the confirmation lane gave up: read outcomeUndetermined to tell the two apart, and error for the reason."},"error":{"type":"string","nullable":true,"description":"Why the transfer failed."},"outcomeUndetermined":{"type":"boolean","description":"True when status is failed only because the confirmation lane could not establish an outcome, not because the transfer provably failed."},"transactionHash":{"type":"string","nullable":true},"customerId":{"type":"string","format":"uuid","nullable":true},"summary":{"type":"object","nullable":true,"description":"Human-readable transaction summary"},"senderAddress":{"type":"string","nullable":true,"description":"Who sent the value."},"destinationAddress":{"type":"string","nullable":true,"description":"Who received the value."},"signerCredentialId":{"type":"string","nullable":true,"description":"The passkey credential that authorised this transaction."},"signerLabel":{"type":"string","nullable":true,"description":"The name that credential was enrolled under, if it was given one."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","walletId","projectId","treasury","chain","direction","purpose","paymentId","reference","status","transactionHash","customerId","summary","senderAddress","destinationAddress","signerCredentialId","signerLabel","createdAt","updatedAt","submittedAt","reconciledAt"]},"TransactionListResultDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/TransactionListItemDto"}},"nextCursor":{"type":"string","description":"Keyset cursor for the next page"}},"required":["items"]},"UsdtContractBalanceDto":{"type":"object","properties":{"address":{"type":"string","description":"The family contract's address"},"symbol":{"type":"string","enum":["USDT","USD₮0"],"example":"USD₮0"},"balance":{"type":"string","description":"This contract's share of the usdt balance, human-readable"}},"required":["address","symbol","balance"]},"ChainBalancesDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"address":{"type":"string"},"native":{"type":"string","description":"Native balance in wei (stringified integer)"},"usdt":{"type":"string","description":"USDT balance in base units (stringified integer)."},"usdtContracts":{"description":"Per-contract breakdown of usdt, present only when at least two family contracts hold a non-zero balance","type":"array","items":{"$ref":"#/components/schemas/UsdtContractBalanceDto"}},"xaut":{"type":"string","description":"XAUT balance."}},"required":["chain","address","native","usdt"]},"BlockingChainDto":{"type":"object","properties":{"chain":{"type":"string"},"reason":{"type":"string","enum":["owner","malformed","unverifiable"],"description":"owner: the signer is still an owner there. malformed: the stored key cannot be read, which will not clear on retry. unverifiable: the chain could not be read this time."}},"required":["chain","reason"]},"ChainRemovalResultDto":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"skipped":{"type":"boolean","description":"True when the signer was already absent from that chain"},"userOpHash":{"type":"string","description":"The userOpHash to sign, present when a removal was prepared on that chain"},"threshold":{"type":"number","description":"Signatures this chain requires before it broadcasts"},"collected":{"type":"number","description":"Signatures collected so far"},"error":{"type":"string"}},"required":["chain","ok"]},"RemovePasskeyResultDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"credentialId":{"type":"string"},"signerAddress":{"type":"string"},"status":{"type":"string","enum":["removing","revoked"],"description":"revoked only once the signer is provably gone from every chain the wallet lives on"},"removedChains":{"type":"array","items":{"type":"string"}},"pendingChains":{"description":"Chains still to clear.","type":"array","items":{"type":"string"}},"complete":{"type":"boolean"},"blockedBy":{"$ref":"#/components/schemas/BlockingChainDto"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ChainRemovalResultDto"}}},"required":["walletId","credentialId","signerAddress","status","removedChains","pendingChains","complete","results"]},"RemovePasskeyDto":{"type":"object","properties":{"existingOwner":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]}},"required":["existingOwner"]},"PreparedAllowanceDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string"},"userOp":{"type":"object","description":"The unsigned ERC-4337 UserOperation"},"userOpHash":{"type":"string","description":"Sign this with an owner passkey and submit it to POST /v1/userops/{hash}/signatures"}},"required":["chain","safeAddress","userOp","userOpHash"]},"SetLimitResultDto":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"onChain":{"description":"Present only when onChain was supplied.","allOf":[{"$ref":"#/components/schemas/PreparedAllowanceDto"}]}},"required":["status"]},"SetLimitDto":{"type":"object","properties":{"treasury":{"description":"Which wallet the cap applies to.","type":"boolean","default":true},"signerId":{"type":"string","minLength":1},"asset":{"type":"string","minLength":1},"limitBaseUnits":{"type":"string","pattern":"^\\d+$"},"windowSeconds":{"type":"integer","minimum":0,"exclusiveMinimum":true},"onChain":{"description":"Links this cap to its on-chain allowance.","type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"safeAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"delegate":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain","safeAddress","delegate","token"]}},"required":["signerId","asset","limitBaseUnits"]},"LimitOnChainLinkDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string","description":"The Safe the allowance sits on"},"delegate":{"type":"string","description":"The delegate the allowance is granted to"},"token":{"type":"string","description":"Token contract address"}},"required":["chain","safeAddress","delegate","token"]},"LimitCapDto":{"type":"object","properties":{"entityKey":{"type":"string","description":"Deterministic key of the wallet this cap applies to, treasury or customer"},"signerId":{"type":"string","description":"The passkey credential being capped."},"asset":{"type":"string","example":"USDT"},"limitBaseUnits":{"type":"string","description":"Cap in the asset's smallest unit","example":"5000000000"},"windowSeconds":{"type":"number","description":"Rolling window, not a calendar period","example":2592000},"onChain":{"description":"Present when this cap is linked to an on-chain allowance.","allOf":[{"$ref":"#/components/schemas/LimitOnChainLinkDto"}]}},"required":["entityKey","signerId","asset","limitBaseUnits","windowSeconds"]},"LimitListResultDto":{"type":"object","properties":{"caps":{"type":"array","items":{"$ref":"#/components/schemas/LimitCapDto"}}},"required":["caps"]},"DeleteLimitResultDto":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]}},"required":["status"]},"DelegateProvisionResultDto":{"type":"object","properties":{"delegateAddress":{"type":"string","description":"Name this in the allowances of POST /v1/limits/setup"},"entityKey":{"type":"string","description":"Send this as delegateEntityKey when submitting a spend"}},"required":["delegateAddress","entityKey"]},"ProvisionDelegateDto":{"type":"object","properties":{"signerId":{"type":"string","minLength":1}},"required":["signerId"]},"PrepareAllowanceSetupDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"safeAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"includeModuleEnable":{"type":"boolean","default":false},"feeToken":{"type":"string","enum":["usdt","xaut"]},"allowances":{"type":"array","minItems":1,"items":{"type":"object","properties":{"delegate":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"capBaseUnits":{"type":"string","pattern":"^\\d+$"},"windowMinutes":{"type":"string","pattern":"^\\d+$"}},"required":["delegate","token","capBaseUnits","windowMinutes"]}}},"required":["chain","passkeyPublicKey","allowances"]},"SpendPrepareResultDto":{"type":"object","properties":{"transferHash":{"type":"string","description":"The hash the delegate passkey must sign"},"nonce":{"type":"string","description":"Allowance nonce for this spend"},"moduleAddress":{"type":"string","description":"Allowance Module address"}},"required":["transferHash","nonce","moduleAddress"]},"SpendPrepareDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"safeAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"delegate":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountBaseUnits":{"type":"string","pattern":"^\\d+$"}},"required":["chain","safeAddress","delegate","token","to","amountBaseUnits"]},"SpendSubmitResultDto":{"type":"object","properties":{"userOpHash":{"type":"string","description":"The ERC-4337 userOpHash of the sponsored relay operation the bundler accepted."},"transactionHash":{"type":"string","description":"The on-chain transaction hash, present only when the relay already knows it at response time."}},"required":["userOpHash"]},"SpendSubmitDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"safeAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"delegate":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountBaseUnits":{"type":"string","pattern":"^\\d+$"},"delegateEntityKey":{"type":"string","minLength":1},"passkeyData":{"type":"object","additionalProperties":{}}},"required":["chain","safeAddress","delegate","token","to","amountBaseUnits","delegateEntityKey","passkeyData"]},"SigningThresholdDto":{"type":"object","properties":{"threshold":{"type":"number","description":"Approvals required before a transfer is signed"},"signers":{"type":"number","description":"Passkey signers currently enrolled for this owner"},"pendingThreshold":{"type":"number","description":"Present while a threshold change is in flight, in either direction: the target a PUT asked for (the same value as pendingLower or pendingRaise). threshold keeps the current value — and is what every transfer still needs — until every deployed chain has taken the change, after which the record moves to it"},"pendingLower":{"type":"number","description":"Present while a lowering is in flight: the lower threshold."},"pendingRaise":{"type":"number","description":"Present while a raise is in flight: the higher threshold."},"pendingLane":{"type":"string","enum":["userop","proposal"],"description":"How the pending change is being carried: userop (per-chain userOps approved within minutes, re-prepared automatically) or proposal (7-day threshold_change treasury proposals."},"chains":{"description":"erc4337 owners only: one entry per EVM deploy chain, carrying the on-chain Safe threshold change (on a set) or the on-chain Safe threshold (on a read).","type":"array","items":{"$ref":"#/components/schemas/SigningThresholdChainDto"}},"approveWithinSeconds":{"type":"number","description":"On a set that left a userOp awaiting_signature: how long (seconds) the sponsor keeps that userOp valid.","example":180},"approvalNote":{"type":"string","description":"Present with approveWithinSeconds: the same advice in words, recommending lane proposal (threshold_change proposals that collect signatures for days) for changes that need several people"}},"required":["threshold","signers"]},"SetSigningThresholdDto":{"type":"object","properties":{"treasury":{"description":"Which owner the threshold belongs to.","type":"boolean"},"threshold":{"description":"How many distinct passkey signers must approve a transfer.","type":"integer","minimum":1,"exclusiveMinimum":false},"lane":{"description":"How the on-chain change is carried. userop (default): one userOp per deployed chain, approved within the quorum window (minutes) and re-prepared when it lapses. proposal: one threshold_change treasury proposal per deployed chain not yet at the target, which approvers sign over days through /v1/treasury/proposals.","type":"string","enum":["userop","proposal"]},"ttlSeconds":{"description":"lane proposal only: how long each proposal collects signatures, from 3600 up to the platform's proposal lifetime (7 days by default).","type":"integer","minimum":3600,"exclusiveMinimum":false}},"required":["threshold"]},"ThresholdResultDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string"},"threshold":{"type":"number","description":"The on-chain m-of-n threshold","example":2},"currentThreshold":{"type":"number","description":"Threshold before the change.","example":1},"userOpHash":{"type":"string","description":"Present only on a change response"},"sponsored":{"type":"boolean"},"transactionHash":{"type":"string"},"pendingUserOp":{"type":"boolean"},"status":{"type":"string","enum":["awaiting_signature"],"description":"Present when the change needs the Safe's current quorum: sign userOpHash with that many owner passkeys and POST each to /v1/userops/{userOpHash}/signatures"},"collected":{"type":"number","description":"Owner signatures collected so far on a prepared change","example":0}},"required":["chain","safeAddress","threshold"]},"SetThresholdDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"threshold":{"type":"integer","minimum":1,"exclusiveMinimum":false},"existingOwner":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","counter"]}},"required":["credential","expectedChallenge","expectedOrigins","expectedRPID","authenticator"]}},"required":["chain","threshold","existingOwner","passkeyData"]},"RecoverySignatureRequestDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"userOpHash":{"type":"string","example":"0xabc123"}},"required":["chain","userOpHash"]},"RecoveryEnrolmentFailureDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"reason":{"type":"string"}},"required":["chain","reason"]},"RecoveryEnrolmentResultDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","example":"base","description":"Present when the call named a single chain"},"chains":{"description":"Present when the call named several chains to prepare","type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["pending","submitted","confirmed"],"description":"pending means a userOpHash is waiting for the customer's signature."},"userOpHash":{"type":"string","example":"0xabc123","description":"The hash to sign, when exactly one chain was prepared"},"guardianSafe":{"type":"string","description":"The guardian account registered on the customer's Safe"},"transactionHash":{"type":"string"},"threshold":{"type":"number","description":"Signatures the Safe requires before the userOperation runs"},"signatureRequests":{"description":"One entry per prepared chain.","type":"array","items":{"$ref":"#/components/schemas/RecoverySignatureRequestDto"}},"failures":{"description":"Chains that could not be prepared.","type":"array","items":{"$ref":"#/components/schemas/RecoveryEnrolmentFailureDto"}}},"required":["walletId","state"]},"EnrolRecoveryDto":{"type":"object","properties":{"chain":{"description":"The one chain to act on.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"chains":{"description":"Several chains to prepare in one call.","type":"array","minItems":1,"items":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]}},"passkeyPublicKey":{"description":"The P-256 coordinates of the customer passkey that owns the Safe.","type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"A passkey assertion.","type":"object","additionalProperties":{}},"ref":{"description":"Your own identifier for this enrolment, which turns chains + passkeyData into a single-assertion call.","type":"string","minLength":1,"maxLength":200}},"required":["passkeyPublicKey"]},"RotateGuardianDto":{"type":"object","properties":{"chain":{"description":"The one chain to act on.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"chains":{"description":"Several chains to prepare in one call.","type":"array","minItems":1,"items":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]}},"passkeyPublicKey":{"description":"The P-256 coordinates of the customer passkey that owns the Safe.","type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"A passkey assertion.","type":"object","additionalProperties":{}},"ref":{"description":"Your own identifier for this enrolment, which turns chains + passkeyData into a single-assertion call.","type":"string","minLength":1,"maxLength":200},"reason":{"description":"Why the guardian is being rotated, up to 500 characters.","type":"string","minLength":1,"maxLength":500}},"required":["passkeyPublicKey"]},"RecoveryUnenrolmentResultDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","example":"base","description":"The chain acted on, when the call named a single chain."},"chains":{"example":["base","arbitrum"],"description":"The chains acted on, when the call named a set.","type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["pending","submitted","revoked"],"description":"pending means a userOpHash is waiting for the customer's passkey signature and nothing has changed on chain yet."},"recoveryStillAvailable":{"type":"boolean","description":"True while the guardian is still registered, so the wallet can still be recovered."},"moduleDisabled":{"type":"boolean","description":"True when the recovery module itself is (or will be) disabled on the Safe, which happens when the revoked guardian was the last one"},"userOpHash":{"type":"string","example":"0xabc123","description":"The hash to sign."},"revokedGuardianSafe":{"type":"string","description":"The guardian account being removed from the customer's Safe"},"transactionHash":{"type":"string"},"threshold":{"type":"number","description":"Signatures the Safe requires before the userOperation runs"},"signatureRequests":{"description":"The single hash to sign with the customer's passkey and submit to POST /v1/userops/{hash}/signatures.","type":"array","items":{"$ref":"#/components/schemas/RecoverySignatureRequestDto"}},"failures":{"description":"Chains recovery could not be turned off on.","type":"array","items":{"$ref":"#/components/schemas/RecoveryEnrolmentFailureDto"}}},"required":["walletId","state","recoveryStillAvailable","moduleDisabled"]},"UnenrolRecoveryDto":{"type":"object","properties":{"chain":{"description":"The one chain to turn recovery off on.","type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"chains":{"description":"Several chains to turn recovery off on in one call.","type":"array","minItems":1,"items":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]}},"passkeyPublicKey":{"description":"The P-256 coordinates of the customer passkey that owns the Safe.","type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"A passkey assertion.","type":"object","additionalProperties":{}},"ref":{"description":"Your own identifier for this removal, which turns chains + passkeyData into a single-assertion call.","type":"string","minLength":1,"maxLength":200}},"required":["passkeyPublicKey"]},"RecoveryEnrolmentChainDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"state":{"type":"string","enum":["pending","submitted","confirmed","skipped","failed","revoking","revoked"],"description":"confirmed is the only state in which this chain carries a guardian that can sign a recovery. revoking means the customer asked to turn recovery off and the revocation has not landed yet, so recovery is still available."},"guardianSafe":{"type":"string","nullable":true,"description":"The guardian registered on this chain, once confirmed"},"pendingGuardianSafe":{"type":"string","nullable":true,"description":"A guardian whose registration has not confirmed yet"},"srmAddress":{"type":"string","nullable":true,"description":"The recovery module enabled on this chain's Safe"},"attempts":{"type":"number"},"lastError":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true}},"required":["chain","state","guardianSafe","pendingGuardianSafe","srmAddress","attempts","lastError","verifiedAt"]},"RecoveryEnrolmentStatusDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"ready":{"type":"boolean","description":"True once at least one chain carries a confirmed guardian, so a recovery can be started"},"chains":{"type":"array","items":{"$ref":"#/components/schemas/RecoveryEnrolmentChainDto"}}},"required":["walletId","ready","chains"]},"ChainSovereigntyDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string"},"deployed":{"type":"boolean"},"ownerCount":{"type":"number"},"passkeyOwnerCount":{"type":"number"},"eoaOwnerCount":{"type":"number"},"threshold":{"type":"number"},"singleKey":{"type":"boolean","description":"True when the customer's passkey is the Safe's only owner"},"unreadable":{"type":"boolean","description":"True when this chain's RPC could not be read."}},"required":["chain","safeAddress","deployed"]},"WalletSovereigntyDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"selfCustodial":{"type":"boolean"},"singleKey":{"type":"boolean","nullable":true,"description":"True when the customer holds the only key on at least one readable chain. null when no chain could be judged — none deployed, or none readable."},"chains":{"type":"array","items":{"$ref":"#/components/schemas/ChainSovereigntyDto"}}},"required":["walletId","selfCustodial","singleKey","chains"]},"StartRecoveryDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chains":{"type":"array","minItems":1,"items":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]}},"newPasskey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"credentialId":{"type":"string","minLength":1},"passkeyBlob":{"type":"string"},"credentialPublicKey":{"description":"The new passkey's WebAuthn COSE public key, base64url or hex — the same value you send as passkeyRegistration.credentialPublicKey when provisioning.","type":"string","minLength":1},"rpId":{"description":"The relying party the new passkey was created under.","type":"string","minLength":1},"origins":{"description":"The origins the new passkey signs from.","type":"array","minItems":1,"items":{"type":"string","minLength":1}},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["x","y","credentialId","credentialPublicKey","rpId","origins"]},"verification":{"description":"A business attestation over the recovery.","type":"object","properties":{"payload":{"type":"object","properties":{"businessId":{"type":"string","minLength":1},"customerId":{"type":"string","minLength":1},"walletId":{"type":"string","minLength":1},"newSignerAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chains":{"type":"array","minItems":1,"items":{"type":"string","minLength":1}},"intent":{"type":"string","enum":["recovery"]},"nonce":{"type":"string","minLength":1},"issuedAt":{"type":"integer"},"expiresAt":{"type":"integer"}},"required":["businessId","customerId","walletId","newSignerAddress","chains","intent","nonce","issuedAt","expiresAt"]},"signatureB64":{"type":"string","minLength":1}},"required":["payload","signatureB64"]},"recoveryToken":{"description":"A single-use token from POST /v1/recoveries/challenge/verify, proving the customer holds the recovery code.","type":"string","minLength":1},"recoveryContact":{"description":"The customer's recovery email address, recorded for future recoveries.","type":"string","format":"email","maxLength":320}},"required":["walletId","address","chains","newPasskey"]},"RecoveryCancelDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","example":"CANCELLING"},"signatureRequests":{"description":"Present for a prepared passkey cancellation.","type":"array","items":{"$ref":"#/components/schemas/RecoverySignatureRequestDto"}},"onChainRevocationRequired":{"type":"boolean","description":"present when the cancellation was accepted here but the recovery module still holds a live request."},"liveOnChainChains":{"description":"the chains whose recovery module still holds a live request","type":"array","items":{"type":"string"}},"revocationSignedBy":{"type":"string","enum":["wallet_passkey"],"description":"who can sign the revocation. cancelRecovery is gated on the wallet being the caller, so only the wallet's own passkey can revoke a live request — a cancellation token cannot."},"revocationSubmittedChains":{"description":"passkey cancels only: the chains whose on-chain revocation this request submitted.","type":"array","items":{"type":"string"}}},"required":["id","status"]},"CancelRecoveryDto":{"type":"object","properties":{"token":{"description":"The cancellationToken returned once in the POST /v1/recoveries response — not the recoveryToken that started the recovery, and not a recovery-contact verifyToken.","type":"string","minLength":1},"passkey":{"description":"A passkey that currently owns the Safe.","type":"object","properties":{"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"type":"object","additionalProperties":{}}},"required":["passkeyPublicKey"]}}},"RecoveryChainStatusDto":{"type":"object","properties":{"chain":{"type":"string"},"status":{"type":"string"},"confirmUserOpHash":{"type":"string","nullable":true},"finalizeUserOpHash":{"type":"string","nullable":true},"onChainExecuteAfter":{"type":"number","nullable":true,"description":"Unix seconds after which execution is allowed"},"lastError":{"type":"string","nullable":true,"description":"Why this chain last failed, in the chain service's own words — null while the chain is healthy."}},"required":["chain","status","confirmUserOpHash","finalizeUserOpHash","onChainExecuteAfter","lastError"]},"RecoveryStatusDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"status":{"type":"string"},"graceEndsAt":{"type":"string","format":"date-time","nullable":true},"abortableUntil":{"type":"string","format":"date-time","description":"the instant the abort window closes."},"chains":{"type":"array","items":{"$ref":"#/components/schemas/RecoveryChainStatusDto"}},"onChainRevocationRequired":{"type":"boolean","description":"present while this recovery was cancelled here but the recovery module still holds a live request."},"liveOnChainChains":{"description":"the chains whose recovery module still holds a live request","type":"array","items":{"type":"string"}},"revocationSignedBy":{"type":"string","enum":["wallet_passkey"],"description":"who can sign the revocation. cancelRecovery is gated on the wallet being the caller, so only the wallet's own passkey can revoke a live request — a cancellation token cannot."}},"required":["id","walletId","status","graceEndsAt","chains"]},"RecoveryCodeChallengeDto":{"type":"object","properties":{"challengeId":{"type":"string","format":"uuid"},"expiresAt":{"type":"string","format":"date-time"},"deliveredTo":{"type":"number","description":"How many destinations the code was delivered to"},"route":{"type":"string","enum":["business","platform"],"description":"business means the code went to your registered endpoint for you to pass on to the customer. platform means it went to the customer directly, which happens only once the business has been marked defunct."}},"required":["challengeId","expiresAt","deliveredTo","route"]},"RequestRecoveryCodeDto":{"type":"object","properties":{"customerId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"}},"required":["customerId","walletId"]},"RecoveryCodeVerifiedDto":{"type":"object","properties":{"recoveryToken":{"type":"string","description":"A single-use authorisation."},"expiresAt":{"type":"string","format":"date-time"}},"required":["recoveryToken","expiresAt"]},"VerifyRecoveryCodeDto":{"type":"object","properties":{"challengeId":{"description":"The challengeId returned by POST /v1/recoveries/challenge","type":"string","format":"uuid"},"code":{"description":"The six-digit code as the customer typed it","type":"string","pattern":"^[0-9]{6}$"}},"required":["challengeId","code"]},"RecoveryCoverageWalletDto":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["none","pending","verified"]}},"required":["walletId","status"]},"RecoveryCoverageResultDto":{"type":"object","properties":{"total":{"type":"number","description":"Distinct wallet ids read, after duplicates were removed"},"verified":{"type":"number"},"pending":{"type":"number"},"missing":{"type":"number","description":"Wallets with no recovery contact nominated at all"},"wallets":{"type":"array","items":{"$ref":"#/components/schemas/RecoveryCoverageWalletDto"}},"unrecoverableIfBusinessClosed":{"description":"Every wallet whose contact is not verified.","type":"array","items":{"type":"string"}}},"required":["total","verified","pending","missing","wallets","unrecoverableIfBusinessClosed"]},"ReadRecoveryCoverageDto":{"type":"object","properties":{"walletIds":{"description":"The wallets to report on, at most 500 per call.","type":"array","minItems":1,"maxItems":500,"items":{"type":"string","format":"uuid"}}},"required":["walletIds"]},"ChallengeDto":{"type":"object","properties":{"challenge":{"type":"string","description":"base64url-encoded random challenge","example":"q1w2e3r4t5y6u7i8o9p0"}},"required":["challenge"]},"RequestContactChallengeDto":{"type":"object","properties":{"contact":{"description":"The address to bind the challenge to.","type":"string","format":"email","maxLength":320}},"required":["contact"]},"ContactPendingDto":{"type":"object","properties":{"status":{"type":"string","example":"pending"}},"required":["status"]},"SetRecoveryContactDto":{"type":"object","properties":{"contact":{"description":"The address recovery alerts go to.","type":"string","format":"email","maxLength":320},"challenge":{"description":"The challenge returned by POST /v1/recovery-contacts/challenge.","type":"string","minLength":1},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","minLength":1},"y":{"type":"string","minLength":1}},"required":["x","y"]},"passkeyData":{"description":"An assertion over the challenge from a passkey that currently owns the customer's Safe.","type":"object","additionalProperties":{}}},"required":["contact","challenge","passkeyPublicKey","passkeyData"]},"ContactVerifiedDto":{"type":"object","properties":{"status":{"type":"string","example":"verified"}},"required":["status"]},"VerifyRecoveryContactDto":{"type":"object","properties":{"contactId":{"description":"The contactId returned when the contact was set.","type":"string","format":"uuid"},"token":{"description":"The verifyToken returned when the contact was set, after you have confirmed with the contact that it reached them.","type":"string","minLength":1,"maxLength":512}},"required":["contactId","token"]},"ContactStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["none","pending","verified"]}},"required":["status"]},"SignatureRequestDto":{"type":"object","properties":{"userOpHash":{"type":"string","description":"Use this as the WebAuthn challenge, then submit the assertion to POST /v1/userops/signatures."},"chains":{"description":"The chains this one approval authorises.","type":"array","items":{"type":"string"}}},"required":["userOpHash","chains"]},"ChainEnrolResultDto":{"type":"object","properties":{"chain":{"type":"string"},"ok":{"type":"boolean"},"skipped":{"type":"boolean","description":"True when already enrolled on that chain"},"userOpHash":{"type":"string","description":"Present on a successful new enrolment"},"error":{"type":"string","description":"Present on failure"}},"required":["chain","ok"]},"PasskeyOnChainDto":{"type":"object","properties":{"status":{"type":"string","enum":["active","enrolling","not_started"],"description":"Read this before anything else on the object. `enrolling` means the owner-add is prepared but not yet authorised: approve every signatureRequest and submit them. `active` means the chain confirmed it. `not_started` means the credential was recorded but the Safe half never ran, and only reason, code and retryable are present."},"walletId":{"type":"string","format":"uuid"},"signerAddress":{"type":"string"},"enrolledChains":{"type":"array","items":{"type":"string"}},"pendingChains":{"type":"array","items":{"type":"string"}},"complete":{"type":"boolean"},"signatureRequests":{"description":"Present when status is `enrolling`.","type":"array","items":{"$ref":"#/components/schemas/SignatureRequestDto"}},"results":{"type":"array","items":{"$ref":"#/components/schemas/ChainEnrolResultDto"}},"reason":{"type":"string","description":"Present when status is `not_started`."},"code":{"type":"string","description":"Present when status is `not_started`."},"retryable":{"type":"boolean","description":"Present when status is `not_started`."},"warning":{"type":"string","description":"Present when the Safe half started but our credential record was not re-activated."}},"required":["status"]},"PasskeyReferenceDto":{"type":"object","properties":{"entityKey":{"type":"string","description":"Deterministic key identifying the owning entity"},"credentialId":{"type":"string","description":"Base64url credential id"},"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"],"description":"The wallet whose seed the enrolment was checked against."},"label":{"type":"string","description":"The name you gave this signer, if you sent one"},"onChain":{"description":"Present only when this customer also holds an evm_erc4337 wallet, in which case the same passkey was also added as an on-chain Safe co-owner.","allOf":[{"$ref":"#/components/schemas/PasskeyOnChainDto"}]}},"required":["entityKey","credentialId","moduleId"]},"RegisterPasskeyDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"treasury":{"type":"boolean"},"passkeyRegistration":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"description":"The authenticator COSE public key (CBOR bytes) as base64url — the encoding browsers and @simplewebauthn emit.","type":"string"},"counter":{"description":"Not persisted at creation — omit.","type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"description":"Informational only — not persisted.","type":"array","items":{"type":"string"}},"rpId":{"type":"string"},"origins":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","rpId","origins"]},"passkeyData":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"description":"Ignored on custodial transfers, possession proofs and add-device — the server uses the origins bound to the stored credential.","type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"description":"Ignored on custodial transfers, possession proofs and add-device — the server uses the RP id bound to the stored credential.","type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"description":"Ignored on transfers/proofs and on add-device — the server verifies against the credential's sealed key.","type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","counter"]}},"required":["credential","authenticator"]}},"required":["moduleId","passkeyRegistration","passkeyData"]},"RetrySafeOwnerDto":{"type":"object","properties":{"treasury":{"type":"boolean"},"existingOwner":{"description":"The P-256 coordinates of a passkey that is already a Safe owner and will approve this change.","type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]}},"required":["existingOwner"]},"PasskeyCredentialDto":{"type":"object","properties":{"credentialId":{"type":"string","description":"Base64url credential id"},"label":{"type":"string","description":"The name given to this signer when it was enrolled."},"rpId":{"type":"string","description":"Relying-party id pinned at enrolment."},"origins":{"description":"Origins the ceremony may run from, pinned at enrolment","type":"array","items":{"type":"string"}},"proofRequired":{"type":"boolean","description":"True while the credential still owes a possession proof"},"provenAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["credentialId"]},"PasskeyListResultDto":{"type":"object","properties":{"credentials":{"type":"array","items":{"$ref":"#/components/schemas/PasskeyCredentialDto"}}},"required":["credentials"]},"PreparedUseropDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string"},"userOp":{"type":"object","description":"The unsigned ERC-4337 UserOperation the owner(s) must sign"},"userOpHash":{"type":"string","description":"The userOpHash each owner signs with a WebAuthn assertion"},"threshold":{"type":"number","description":"Owner signatures required (the on-chain m-of-n threshold)","example":2},"sponsored":{"type":"boolean"},"collected":{"type":"number","description":"Owner signatures collected so far (0 on a fresh prepare)","example":0},"status":{"type":"string","enum":["pending","signing","signed","expired"],"description":"Quorum state."},"legs":{"description":"The usdt legs this userOp moves (erc4337 lane).","type":"array","items":{"$ref":"#/components/schemas/UsdtLegDto"}},"swap":{"description":"Present when the wallet held its USDT across two contracts on this chain (optimism: USDT and USD₮0) and neither covered the amount alone.","allOf":[{"$ref":"#/components/schemas/UsdtSwapDto"}]}},"required":["chain","safeAddress","userOp","userOpHash","threshold","sponsored","collected","status"]},"PrepareUserOpDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"token":{"type":"string","enum":["usdt","xaut"]},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"description":"Amount in token units (for example \"12.5\" USDT) — digits with at most one decimal point and at most 6 decimal places.","type":"string","maxLength":80,"pattern":"^\\d+(\\.\\d{1,6})?$"},"safeAddress":{"description":"The wallet's Safe address, as returned when the wallet was provisioned.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"treasury":{"type":"boolean"}},"required":["chain","to","amount","safeAddress","passkeyPublicKey"]},"SubmitSignatureBatchDto":{"type":"object","properties":{"signatures":{"type":"array","minItems":1,"maxItems":16,"items":{"type":"object","properties":{"userOpHash":{"type":"string","pattern":"^0x[0-9a-fA-F]+$"},"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","counter"]}},"required":["credential","expectedChallenge","expectedOrigins","expectedRPID","authenticator"]}},"required":["userOpHash","passkeyPublicKey","passkeyData"]}}},"required":["signatures"]},"UseropStatusDto":{"type":"object","properties":{"userOpHash":{"type":"string"},"threshold":{"type":"number"},"collected":{"type":"number","description":"Distinct owner signatures collected so far"},"status":{"type":"string","enum":["pending","signing","signed","expired"]},"transactionHash":{"type":"string","description":"Present once the combined userOp is broadcast"}},"required":["userOpHash","threshold","collected","status"]},"SubmitSignatureDto":{"type":"object","properties":{"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","counter"]}},"required":["credential","expectedChallenge","expectedOrigins","expectedRPID","authenticator"]}},"required":["passkeyPublicKey","passkeyData"]},"WebhookSecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"secret":{"type":"string","description":"Signing secret, shown once on creation and never again","example":"whsec_0123456789abcdef0123456789abcdef"}},"required":["id","secret"]},"CreateWebhookEndpointDto":{"type":"object","properties":{"url":{"description":"Public https endpoint that receives the signed POST.","type":"string","format":"uri"},"events":{"description":"Event types to subscribe to.","type":"array","minItems":1,"items":{"type":"string","enum":["wallet.created","wallet.passkey.enrolled","wallet.passkey.revoked","wallet.passkey.removal_blocked","transaction.approval_required","transaction.submitted","transaction.pending","transaction.reconciled","transaction.success","transaction.failed","transaction.reconciliation_expired","transaction.summary_corrected","deposit.detected","deposit.confirmed","bridge.filled","bridge.refunded","bridge.failed","bridge.stalled","payment.created","payment.detected","payment.approval_required","payment.approval_expired","payment.settled","payment.unclaimed","payment.recovered","payment.cancelled","payment.expired","payment.settlement_stalled","recovery.code","recovery.started","recovery.reminder","recovery.completed","recovery.cancelled","recovery.failed"]}}},"required":["url","events"]},"WebhookEndpointDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","example":"https://example.com/webhooks"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]},"lastDeliveryAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","url","events","status","lastDeliveryAt","createdAt"]},"UpdateWebhookEndpointDto":{"type":"object","properties":{"events":{"type":"array","minItems":1,"items":{"type":"string","enum":["wallet.created","wallet.passkey.enrolled","wallet.passkey.revoked","wallet.passkey.removal_blocked","transaction.approval_required","transaction.submitted","transaction.pending","transaction.reconciled","transaction.success","transaction.failed","transaction.reconciliation_expired","transaction.summary_corrected","deposit.detected","deposit.confirmed","bridge.filled","bridge.refunded","bridge.failed","bridge.stalled","payment.created","payment.detected","payment.approval_required","payment.approval_expired","payment.settled","payment.unclaimed","payment.recovered","payment.cancelled","payment.expired","payment.settlement_stalled","recovery.code","recovery.started","recovery.reminder","recovery.completed","recovery.cancelled","recovery.failed"]}},"status":{"description":"Disable to stop delivery without losing the signing secret.","type":"string","enum":["active","disabled"]}}},"SafeAllowancesDto":{"type":"object","properties":{"chain":{"type":"string","example":"base","description":"The EVM chain the allowances were read on"},"safeAddress":{"type":"string","description":"The Safe the allowances belong to"},"moduleAddress":{"type":"string","description":"The Allowance Module contract the allowances live on"},"deployed":{"type":"boolean","description":"Whether the Safe is deployed on this chain"},"moduleEnabled":{"type":"boolean","description":"Whether the Allowance Module is enabled on the Safe."},"allowances":{"description":"Every active allowance read from the module, with spent and remaining for the current window","type":"array","items":{"$ref":"#/components/schemas/SafeAllowanceDto"}}},"required":["chain","safeAddress","moduleAddress","deployed","moduleEnabled","allowances"]},"SafeAllowanceDto":{"type":"object","properties":{"delegate":{"type":"string","description":"The delegate address the allowance lets spend from the Safe"},"token":{"type":"string","description":"The token contract address"},"asset":{"type":"string","example":"USDT","description":"The asset, when the token is one this platform pins"},"amountBaseUnits":{"type":"string","example":"5000000","description":"The allowance per reset window, in base units"},"spentBaseUnits":{"type":"string","example":"1000000","description":"Spent in the current window, in base units."},"remainingBaseUnits":{"type":"string","example":"4000000","description":"amountBaseUnits minus spentBaseUnits"},"amount":{"type":"string","example":"5","description":"amountBaseUnits in decimal, for a pinned asset"},"spent":{"type":"string","example":"1"},"remaining":{"type":"string","example":"4"},"resetTimeMinutes":{"type":"number","example":1440,"description":"Minutes between resets of spent."},"nextResetAt":{"type":"string","format":"date-time","description":"When spent next resets to 0."}},"required":["delegate","token","amountBaseUnits","spentBaseUnits","remainingBaseUnits","resetTimeMinutes"]},"SigningThresholdChainDto":{"type":"object","properties":{"chain":{"type":"string","example":"base"},"status":{"type":"string","enum":["unchanged","awaiting_signature","safe_not_deployed","deployed","behind","lowered","raised","proposed","failed"],"description":"On a set: unchanged (the Safe already has this threshold), awaiting_signature (sign userOpHash with the Safe's current threshold of owner passkeys), safe_not_deployed, or failed."},"safeTxHash":{"type":"string","description":"With lane proposal: the threshold_change treasury proposal created for this chain."},"nonce":{"type":"number","description":"With lane proposal: the Safe nonce the proposal takes"},"requiredSignatures":{"type":"number","description":"With lane proposal: owner signatures the proposal needs — the chain's current threshold (or the recorded one when higher)"},"proposalStatus":{"type":"string","description":"With lane proposal: the proposal's status when created"},"statusReason":{"type":"string","description":"With lane proposal: why the proposal is waiting, for example the proposal ahead of it in the Safe nonce queue"},"expiresAt":{"type":"string","description":"With lane proposal: when the proposal's signature window ends"},"userOpHash":{"type":"string","description":"The userOp to sign and POST to /v1/userops/{userOpHash}/signatures."},"pendingKind":{"type":"string","enum":["threshold_change","owner_add","recovery_key_removal","module_removal"],"description":"What the userOpHash does, on a read of a chain with a repair in flight and on a set that found one already in flight for the chain — threshold_change moves this chain's Safe to the recorded threshold, or to the pending lower one while a lowering is in flight (removing the platform recovery key and disabling every foreign module in the same userOp when it lands above 1)."},"recoveryKeyPresent":{"type":"boolean","description":"On a read: whether the platform recovery key (the bootstrap EOA) is still an owner of the Safe on this chain."},"foreignModules":{"description":"On a read of a treasury: the modules enabled on the Safe on this chain other than the Safe 4337 module and the Allowance Module (for example the social recovery module).","type":"array","items":{"type":"string"}},"currentThreshold":{"type":"number","description":"On a set: the Safe's threshold now, which is how many owner signatures the change itself needs","example":1},"threshold":{"type":"number","description":"On a read: the Safe's on-chain threshold on this chain","example":2},"passkeyOwners":{"type":"number","description":"On a read: passkey owners of the Safe on this chain.","example":2},"allowances":{"description":"On a read of a treasury Safe with the Allowance Module enabled on this chain: every active delegate allowance (delegate, token, amount, spent and remaining in the current window, and the reset window).","type":"array","items":{"$ref":"#/components/schemas/SafeAllowanceDto"}},"allowancesUnreadable":{"type":"boolean","description":"On a read: true when this chain's allowances could not be read. allowances is then absent."},"missingOwners":{"description":"On a read of a treasury: credentialIds of registered, usable treasury passkeys (never one being removed) that are not owners of the Safe on this chain.","type":"array","items":{"type":"string"}},"reason":{"type":"string","description":"Why this chain failed"}},"required":["chain","status"]},"DiscardPendingThresholdDto":{"type":"object","properties":{"threshold":{"type":"number","description":"The recorded threshold after the discard"},"cleared":{"type":"boolean","description":"true when the pending raise or lowering itself was abandoned: nothing was kept in flight and no chain had taken it"},"pendingThreshold":{"type":"number"},"pendingLower":{"type":"number"},"pendingRaise":{"type":"number"},"pendingLane":{"type":"string","enum":["userop","proposal"]},"chains":{"description":"One entry per chain that had a pending change","type":"array","items":{"$ref":"#/components/schemas/DiscardPendingThresholdChainDto"}}},"required":["threshold","cleared","chains"]},"DiscardPendingThresholdChainDto":{"type":"object","properties":{"chain":{"type":"string","example":"plasma"},"outcome":{"type":"string","enum":["discarded","kept","landed"],"description":"discarded: the change provably never broadcast (its approvals never reached the bundler, or its quorum lapsed with no transaction and the chain is unchanged), so it was dropped and its userOp can no longer be signed. kept: it may still land (handed to the bundler, the chain could not be read, or it is a live treasury proposal) and stays reported. landed: the chain already reads it"},"userOpHash":{"type":"string","description":"The userOpHash (or a proposal's safeTxHash) that was pending on this chain"},"pendingKind":{"type":"string","enum":["threshold_change","owner_add","recovery_key_removal","module_removal"]},"reason":{"type":"string","description":"Why it was kept or how it settled"}},"required":["chain","outcome","userOpHash","pendingKind"]},"PrepareTreasuryProposalDto":{"type":"object","properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","polygon","celo","optimism","plasma"]},"kind":{"description":"What the Safe transaction does. params takes the matching shape: payment {token?, to, amount|amountBaseUnits}.","type":"string","enum":["payment","owner_add","owner_remove","threshold_change","reject"]},"params":{"oneOf":[{"type":"object","properties":{"token":{"description":"What to send: an ERC-20 contract address, usdt (default), xaut, or native for the chain's coin.","type":"string","minLength":1},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"description":"Amount in display units for usdt, xaut and native.","type":"string","minLength":1},"amountBaseUnits":{"description":"Exact amount in the token's smallest unit.","type":"string","pattern":"^\\d+$"}},"required":["to"]},{"type":"object","properties":{"passkeyPublicKey":{"description":"The P-256 public key of the passkey to add as a Safe owner.","type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"threshold":{"description":"The Safe threshold after the add.","type":"integer","minimum":1,"exclusiveMinimum":false}},"required":["passkeyPublicKey"]},{"oneOf":[{"type":"object","properties":{"credentialId":{"description":"A treasury passkey to remove, by credential id.","type":"string","minLength":1},"threshold":{"description":"The Safe threshold after the removal.","type":"integer","minimum":1,"exclusiveMinimum":false}},"required":["credentialId"]},{"type":"object","properties":{"ownerAddress":{"description":"An owner address to remove, when the platform does not know its passkey.","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"threshold":{"description":"The Safe threshold after the removal.","type":"integer","minimum":1,"exclusiveMinimum":false}},"required":["ownerAddress"]}]},{"type":"object","properties":{"threshold":{"type":"integer","minimum":1,"exclusiveMinimum":false}},"required":["threshold"]},{"type":"object","properties":{"nonce":{"description":"The Safe nonce to burn with an empty self-call.","type":"integer","minimum":0,"exclusiveMinimum":false}},"required":["nonce"]}]},"nonce":{"description":"Pin the Safe nonce (for a replacement or a rejection).","type":"integer","minimum":0,"exclusiveMinimum":false},"ttlSeconds":{"description":"How long this proposal collects signatures, in seconds: at least 3600 and at most the platform window (default 7 days).","type":"integer","minimum":3600,"exclusiveMinimum":false}},"required":["chain","kind","params"]},"TreasuryProposalDto":{"type":"object","properties":{"safeTxHash":{"type":"string","description":"The Safe's EIP-712 SafeTx hash: domain {chainId, verifyingContract: the treasury Safe} over the tx fields."},"challenge":{"type":"string","description":"base64url of the 32 safeTxHash bytes: the WebAuthn challenge each signer's assertion must answer."},"chain":{"type":"string","example":"base"},"safeAddress":{"type":"string","description":"The treasury Safe"},"nonce":{"type":"number","description":"The Safe nonce this proposal executes at."},"kind":{"type":"string","enum":["payment","threshold_change","owner_add","owner_remove","reject"]},"summary":{"type":"object","description":"Human-readable digest of what the transaction does, per kind (for a payment: token, asset, to, amountBaseUnits, decimals)"},"tx":{"description":"Every field the hash commits to, so a client can recompute safeTxHash before signing","allOf":[{"$ref":"#/components/schemas/SafeTransactionFieldsDto"}]},"requiredSignatures":{"type":"number","description":"Distinct owner signatures needed: the larger of the treasury's recorded signing threshold and the Safe's on-chain threshold, re-read at execution"},"collected":{"type":"number","description":"Signatures recorded so far"},"signers":{"type":"array","items":{"$ref":"#/components/schemas/TreasuryProposalSignerDto"}},"status":{"type":"string","enum":["pending","ready","queued_behind","executing","executed","failed","superseded","rejected","expired"]},"statusReason":{"type":"string","description":"Why the proposal is in a terminal or held state."},"queuePosition":{"type":"number","description":"0 when this proposal is next to execute on its chain, N when N lower nonces are still live ahead of it."},"expiresAt":{"type":"string","description":"When the proposal stops collecting signatures if it has not executed (ISO 8601)"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"relayUserOpHash":{"type":"string","description":"The ERC-4337 hash of the sponsored relay operation that carries execTransaction, once relayed"},"txHash":{"type":"string","description":"The on-chain transaction hash once executed"},"rejectsSafeTxHash":{"type":"string","description":"On a reject proposal: the safeTxHash of the proposal it burns the nonce of"},"rejectedBySafeTxHash":{"type":"string","description":"The safeTxHash of the reject proposal prepared against this one, if any"}},"required":["safeTxHash","challenge","chain","safeAddress","nonce","kind","summary","tx","requiredSignatures","collected","signers","status","queuePosition","expiresAt","createdAt","updatedAt"]},"SafeTransactionFieldsDto":{"type":"object","properties":{"to":{"type":"string","description":"Inner call target"},"value":{"type":"string","description":"Native value in wei, as a decimal string"},"data":{"type":"string","description":"Inner call data, 0x-hex"},"operation":{"type":"number","enum":[0,1],"description":"0 for CALL, 1 for DELEGATECALL"},"safeTxGas":{"type":"string","description":"Always 0 on this lane"},"baseGas":{"type":"string","description":"Always 0 on this lane"},"gasPrice":{"type":"string","description":"Always 0 on this lane"},"gasToken":{"type":"string","description":"Always the zero address on this lane"},"refundReceiver":{"type":"string","description":"Always the zero address on this lane"},"nonce":{"type":"number","description":"The Safe nonce this transaction is bound to"}},"required":["to","value","data","operation","safeTxGas","baseGas","gasPrice","gasToken","refundReceiver","nonce"]},"TreasuryProposalSignerDto":{"type":"object","properties":{"credentialId":{"type":"string","description":"The approving passkey's WebAuthn credential id"},"verifier":{"type":"string","description":"The on-chain WebAuthn verifier address this passkey owns the Safe through."},"approvedAt":{"type":"string","description":"When this signature was verified and recorded (ISO 8601)"},"label":{"type":"string","description":"The label stored for this passkey, when one was set"}},"required":["credentialId","verifier","approvedAt"]},"TreasuryProposalListDto":{"type":"object","properties":{"proposals":{"type":"array","items":{"$ref":"#/components/schemas/TreasuryProposalDto"}}},"required":["proposals"]},"SubmitTreasuryProposalSignatureBatchDto":{"type":"object","properties":{"signatures":{"type":"array","minItems":1,"maxItems":16,"items":{"type":"object","properties":{"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"The owner's WebAuthn assertion whose challenge is the base64url of the proposal's 32 safeTxHash bytes (the challenge field of the prepared proposal).","type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","counter"]}},"required":["credential","expectedChallenge","expectedOrigins","expectedRPID","authenticator"]},"safeTxHash":{"description":"The proposal's EIP-712 SafeTx hash, as returned when it was prepared.","type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["passkeyPublicKey","passkeyData","safeTxHash"]}}},"required":["signatures"]},"TreasuryProposalSignatureBatchResultDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/TreasuryProposalSignatureResultDto"}}},"required":["results"]},"TreasuryProposalSignatureResultDto":{"type":"object","properties":{"safeTxHash":{"type":"string"},"ok":{"type":"boolean"},"proposal":{"$ref":"#/components/schemas/TreasuryProposalDto"},"error":{"type":"string"},"httpStatus":{"type":"number"},"code":{"type":"string"}},"required":["safeTxHash","ok"]},"SubmitTreasuryProposalSignatureDto":{"type":"object","properties":{"passkeyPublicKey":{"type":"object","properties":{"x":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"y":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["x","y"]},"passkeyData":{"description":"The owner's WebAuthn assertion whose challenge is the base64url of the proposal's 32 safeTxHash bytes (the challenge field of the prepared proposal).","type":"object","properties":{"credential":{"type":"object","additionalProperties":{}},"expectedChallenge":{"type":"string"},"expectedOrigins":{"type":"array","minItems":1,"items":{"type":"string"}},"expectedRPID":{"type":"string"},"authenticator":{"type":"object","properties":{"credentialId":{"type":"string"},"credentialPublicKey":{"type":"string"},"counter":{"type":"integer","minimum":0,"exclusiveMinimum":false},"transports":{"type":"array","items":{"type":"string"}}},"required":["credentialId","credentialPublicKey","counter"]}},"required":["credential","expectedChallenge","expectedOrigins","expectedRPID","authenticator"]}},"required":["passkeyPublicKey","passkeyData"]},"CustodialApprovalListDto":{"type":"object","properties":{"approvals":{"description":"Every pending, unexpired approval collection for this treasury, oldest first.","type":"array","items":{"$ref":"#/components/schemas/CustodialApprovalDto"}}},"required":["approvals"]},"CustodialApprovalDto":{"type":"object","properties":{"challenge":{"type":"string","description":"The transfer challenge: base64url SHA-256 over the entity key, moduleId and the transfer intent."},"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"intent":{"description":"What the collected approvals authorise, read off the first approver's txParams.","allOf":[{"$ref":"#/components/schemas/CustodialApprovalIntentDto"}]},"collected":{"type":"number","description":"Distinct passkey approvals collected so far"},"required":{"type":"number","description":"The treasury's signing threshold when the last approval landed"},"approvals":{"description":"Who has approved so far, by credential id.","type":"array","items":{"$ref":"#/components/schemas/CustodialApproverDto"}},"createdAt":{"type":"string","description":"When the first approval opened this collection (ISO 8601)"},"expiresAt":{"type":"string","description":"When the collection lapses (ISO 8601): CUSTODIAL_APPROVAL_TTL_SECONDS after createdAt, 72 hours by default."},"status":{"type":"string","enum":["pending","signed"],"description":"pending while approvals are still being collected."}},"required":["challenge","moduleId","intent","collected","required","approvals","createdAt","expiresAt","status"]},"CustodialApprovalIntentDto":{"type":"object","properties":{"moduleId":{"type":"string","enum":["evm_erc4337","bitcoin","spark","solana","tron","ton"]},"chain":{"type":"string","description":"The chain named in txParams.chain"},"recipientAddress":{"type":"string","description":"The destination address every approver signed for"},"amount":{"type":"string","description":"The amount every approver signed for, as sent in txParams.amount"},"asset":{"type":"string","description":"The asset the transfer moves (BTC on bitcoin and spark."},"txParams":{"type":"object","additionalProperties":true,"description":"The exact transfer intent the first approver submitted, after the server-owned gas rail was dropped and networkConfig was reduced to its asset selector (tokenMint / tokenRoot)."}},"required":["moduleId","chain","recipientAddress","amount","txParams"]},"CustodialApproverDto":{"type":"object","properties":{"credentialId":{"type":"string","description":"The approving passkey's WebAuthn credential id"},"approvedAt":{"type":"string","description":"When this approval was verified and counted (ISO 8601)"}},"required":["credentialId","approvedAt"]}}}}