/transaction/submitSubmit a signed operationSubmit what the client signed for a prepared operation. One endpoint serves every rail, and exactly one of signature or signedTransaction is required. Re-sending the same payload is idempotent on both shapes.
- UserOperation rail: the signature covers the userOperationHash, and operationId is always required with it.
- Executor rail, including a prepare that answered rail "sponsored": the eth_signTypedData_v4 signature over the returned signingPayload, again with operationId.
- Self-funded rail: the account signs a whole transaction, so send signedTransaction instead — those bytes are the operation's identity. operationId follows what the prepare answered: present for a swap, whose router call is checked against its quote. It is absent for a native transfer, whose operation is created here and whose id comes back in the response.
- Authorization is EIP-7702 only and is refused with 400 on the rails that delegate nothing.
- 404 on submit when the prepared operation is unknown or expired: verify the id, then prepare again if needed.
- 409 when it was already submitted, and for two coded retryable conflicts: AUTHORIZATION_IN_FLIGHT, a concurrent EIP-7702 first-operation authorization for this account, and SENDER_OPERATION_IN_FLIGHT, a previous operation that has not settled yet.
- 429 when the rate limit is exceeded; check the Retry-After response header.
Authentication: X-API-Key
Input — request body
operationIdstring- Operation id from prepare. Required with signature; on the self-funded rail send it for a swap and omit it for a native transfer.
signaturestring- Required unless signedTransaction is sent. On the UserOperation rail, a raw secp256k1 signature of the 32-byte userOperationHash (no EIP-191 prefix). On the executor rail, and on a prepare that answered rail "sponsored", the eth_signTypedData_v4 signature over signingPayload. 0x-prefixed hex, max 4096 chars.
signedTransactionstring- Self-funded rail only, and mutually exclusive with signature: the account's own serialized signed EIP-1559 transaction. 0x-prefixed hex.
authorizationobject- EIP-7702 authorization tuple, required when the current prepare returns authorizationRequired=true, and refused on rails without delegation. All six fields are required when present: chainId (integer >= 1), address (0x-prefixed 20-byte hex), nonce (integer >= 0), yParity (0|1), r and s (0x-prefixed 32-byte hex)
Input — example request
{
"operationId": "ugtp_operation_E6SnXDoAl9AQ",
"signature": "0xa3087507768f541a4eaa9d46b581c351d29c3137…65 bytes"
}Output — example response (200)
{
"operationId": "ugtp_operation_E6SnXDoAl9AQ",
"status": "queued",
"userOperationHash": "0x1a4fece09e742c04398006ebdae6d03227aa7e822ba825e0c64b44fc78d12cb3",
"networkId": "42161"
}Output — every status this endpoint answers with
| Status | When |
|---|---|
200 | Submission result |
400 | Invalid submit body or signed transaction. Inspect code for the rejected transaction field, chain or rail. |
401 | Missing or invalid credentials |
404 | Operation not found or expired — prepare it again |
409 | An existing operation, transaction or in-flight submission conflicts with this request. Inspect code before retrying; do not assume every 409 means success. |
429 | Rate limit exceeded — retry after the number of seconds in the `Retry-After` response header |
500 | Internal server error |
502 | SIGNED_TRANSACTION_IDENTITY_MISMATCH or SELF_FUNDED_BROADCAST_REFUSED. Re-sending identical bytes is permitted; this does not authorize signing a new transaction. |
503 | SELF_FUNDED_CHAIN_UNAVAILABLE or SELF_FUNDED_RECORD_UNAVAILABLE. Retry the same signed bytes with bounded backoff. |