> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Initiate an intent with Permit3

> Funds a quote gaslessly with a signed Permit3 authorization. Requires an API key.

Funds a quote gaslessly with a signed Permit3 authorization. `target.quoteId` names the quote, each `permit3.permits[]` entry names the quote's `execution.vault` as its `account`, and `signature` is the top-level EIP-712 signature over the Permit3 payload. The first submission answers `202` with a gasless job; resending the same signature returns the existing job with `200`.

Requires `x-api-key`. Partner pricing, attribution, and enabled features are tied to the key. Without a key the gateway can answer `403` with a plain JSON body (`{"Message": "User is not authorized ..."}`); a key that is unknown, revoked, or not enabled for v1 answers `401 invalid-api-key`. No requests-per-second quota is published. Handle `429` and honor `Retry-After` when present. See [Errors and retries](/api-reference/errors) for common errors and retry handling.

Examples use mainnet token and contract addresses with placeholder wallets, hashes, signatures, and IDs. They are illustrative and must not be used to transfer funds.


## OpenAPI

````yaml api-v1.openapi.json POST /v1/intents/submit/permit3
openapi: 3.1.0
info:
  title: Eco API
  version: v1
  description: >-
    Reference for the Eco API at https://api.eco.com/v1: quotes, chain and token
    discovery, gasless funding, intent status, and Circle Gateway fast deposits.
    Every operation requires an API key except the Circle Gateway operations,
    which are open.
servers:
  - url: https://api.eco.com
    description: Eco API
security: []
tags:
  - name: quotes
  - name: intents
  - name: status
  - name: discovery
  - name: circle-gateway
paths:
  /v1/intents/submit/permit3:
    post:
      tags:
        - intents
      summary: Initiate an intent with Permit3
      description: >-
        Funds a quote gaslessly with a signed Permit3 authorization.
        `target.quoteId` names the quote, each `permit3.permits[]` entry names
        the quote's `execution.vault` as its `account`, and `signature` is the
        top-level EIP-712 signature over the Permit3 payload. The first
        submission answers `202` with a gasless job; resending the same
        signature returns the existing job with `200`.


        Requires `x-api-key`. Partner pricing, attribution, and enabled features
        are tied to the key. Without a key the gateway can answer `403` with a
        plain JSON body (`{"Message": "User is not authorized ..."}`); a key
        that is unknown, revoked, or not enabled for v1 answers `401
        invalid-api-key`.


        No requests-per-second quota is published. Handle `429` and honor
        `Retry-After` when present.


        Examples use mainnet token and contract addresses with placeholder
        wallets, hashes, signatures, and IDs. They are illustrative and must not
        be used to transfer funds.
      operationId: intents.submit.permit3
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                target:
                  type: object
                  properties:
                    quoteId:
                      type: string
                  required:
                    - quoteId
                  additionalProperties: false
                permit3:
                  type: object
                  properties:
                    owner:
                      type: string
                    permitContract:
                      type: string
                      description: >-
                        The Permit3 contract the legs were signed against (the
                        EIP-712 verifyingContract)
                    salt:
                      type: string
                    deadline:
                      type: integer
                      minimum: 0
                    timestamp:
                      type: integer
                      minimum: 0
                      maximum: 281474976710655
                      description: Permit3 ordering timestamp (uint48, Unix seconds)
                    merkleRoot:
                      type: string
                      description: Merkle root over the legs, as signed
                    permits:
                      minItems: 1
                      type: array
                      items:
                        type: object
                        properties:
                          chainId:
                            type: integer
                            exclusiveMinimum: 0
                          token:
                            type: string
                          amount:
                            type: string
                            maxLength: 78
                          account:
                            type: string
                            description: >-
                              Recipient (transfer mode) or spender (allowance
                              mode) — on a quote target, the quote's
                              execution.vault
                          modeOrExpiration:
                            type: integer
                            minimum: 0
                            maximum: 281474976710655
                            description: >-
                              0 = transfer mode (funds pushed to account); any
                              other value = allowance mode with this expiration,
                              Unix seconds
                        required:
                          - chainId
                          - token
                          - amount
                          - account
                          - modeOrExpiration
                  required:
                    - owner
                    - permitContract
                    - salt
                    - deadline
                    - timestamp
                    - merkleRoot
                    - permits
                signature:
                  type: string
                  minLength: 130
                  maxLength: 132
              required:
                - target
                - permit3
                - signature
            examples:
              quote-target:
                summary: >-
                  Fund the exact-in quote above with Permit3; account is the
                  quote's execution.vault (placeholder signature)
                value:
                  target:
                    quoteId: quote:8a7cbdcd-2aed-40b0-ab08-c4c10af15f23
                  permit3:
                    owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                    permitContract: '0xEc00030C0000245E27d1521Cc2EE88F071c2Ae34'
                    salt: >-
                      0xec00ec00ec00ec00ec00ec00ec00ec00aaaf8940ec75ab106feed1a7498e986f
                    deadline: 1789526504
                    timestamp: 1789522844
                    merkleRoot: >-
                      0xcf68ff94aa42b6f2cc5e6edc42c853b2bd81dcfc43d892062fac723945cef113
                    permits:
                      - chainId: 8453
                        token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
                        amount: '1000000'
                        account: '0xf6358b8f1d0Ec04EBc9Fe8FdEe5e6791640D1c2F'
                        modeOrExpiration: 0
                  signature: >-
                    0xedc90fdd27654dd49ac1087901450c9c5fdf444943f61faa8d787bee86304d821f06a5db4a67eddf5cf286014d6ec8bd33c64f9e072045a9f3c5e50cc28960fc1b
      responses:
        '200':
          description: Existing job for the same signature and target.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  status:
                    type: string
                    enum:
                      - pending
                      - processing
                      - published
                      - partial
                      - failed
                      - unknown
                  signatureHash:
                    type: string
                  subStatuses:
                    type: array
                    items:
                      type: object
                      properties:
                        chainId:
                          type: integer
                        quoteIds:
                          type: array
                          items:
                            type: string
                        txHash:
                          type:
                            - string
                            - 'null'
                        intentHashes:
                          type: array
                          items:
                            type: string
                        state:
                          type: string
                          enum:
                            - pending
                            - submitted
                            - published
                            - failed
                      required:
                        - chainId
                        - quoteIds
                        - txHash
                        - intentHashes
                        - state
                  createdAt:
                    type: integer
                  updatedAt:
                    type: integer
                required:
                  - id
                  - status
                  - signatureHash
                  - subStatuses
                  - createdAt
                  - updatedAt
              examples:
                job:
                  summary: 'Same signature resent: the existing job'
                  value:
                    id: gasless:0f450218-1b2c-4d3e-8f9a-0b1c2d3e4f5a
                    status: published
                    signatureHash: >-
                      0x94245dddfb2339e6e06fe251c90de895bf2995ff3c5a5fb185390f1850ed6726
                    subStatuses:
                      - chainId: 8453
                        quoteIds:
                          - quote:8a7cbdcd-2aed-40b0-ab08-c4c10af15f23
                        txHash: >-
                          0x3ef97346fd076aadb54c851f33ba9234feb34d27442b9bb0abc7a0d75827af13
                        intentHashes:
                          - >-
                            0x3f1886e7c3a4cab62b4a0661e393600f0917d5a514652e96623b0f17ce0d3749
                        state: published
                    createdAt: 1789522604
                    updatedAt: 1789522654
        '202':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  status:
                    type: string
                    enum:
                      - pending
                      - processing
                      - published
                      - partial
                      - failed
                      - unknown
                  signatureHash:
                    type: string
                  subStatuses:
                    type: array
                    items:
                      type: object
                      properties:
                        chainId:
                          type: integer
                        quoteIds:
                          type: array
                          items:
                            type: string
                        txHash:
                          type:
                            - string
                            - 'null'
                        intentHashes:
                          type: array
                          items:
                            type: string
                        state:
                          type: string
                          enum:
                            - pending
                            - submitted
                            - published
                            - failed
                      required:
                        - chainId
                        - quoteIds
                        - txHash
                        - intentHashes
                        - state
                  createdAt:
                    type: integer
                  updatedAt:
                    type: integer
                required:
                  - id
                  - status
                  - signatureHash
                  - subStatuses
                  - createdAt
                  - updatedAt
              examples:
                job:
                  summary: New gasless job accepted
                  value:
                    id: gasless:0f450218-1b2c-4d3e-8f9a-0b1c2d3e4f5a
                    status: processing
                    signatureHash: >-
                      0x94245dddfb2339e6e06fe251c90de895bf2995ff3c5a5fb185390f1850ed6726
                    subStatuses:
                      - chainId: 8453
                        quoteIds:
                          - quote:8a7cbdcd-2aed-40b0-ab08-c4c10af15f23
                        txHash: null
                        intentHashes: []
                        state: pending
                    createdAt: 1789522604
                    updatedAt: 1789522614
        '400':
          description: Request failed validation
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/invalid-request
                title: Request failed validation
                status: 400
                code: invalid-request
                detail: >-
                  target: Invalid input: expected object, received undefined;
                  permit3: Invalid input: expected object, received undefined;
                  signature: Invalid input: expected string, received undefined
                errors:
                  - field: target
                    detail: 'Invalid input: expected object, received undefined'
                  - field: permit3
                    detail: 'Invalid input: expected object, received undefined'
                  - field: signature
                    detail: 'Invalid input: expected string, received undefined'
                requestId: f371e43e6fd4406b10e19487b3170edf
        '401':
          description: >-
            From the gateway (application/json), without `detail`: the key is
            unknown, revoked, or not enabled for v1. From the API
            (application/problem+json): `invalid-api-key` with `detail: "The
            request could not be attributed to an authorized API key."` means
            the key is enabled for v1 but not yet mapped to a partner (contact
            Eco); `invalid-signature` means the signature does not recover to
            the expected signer; `authorization-expired` means its validity
            window has passed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/invalid-api-key
                title: API key is missing, unknown, or revoked
                status: 401
                code: invalid-api-key
                requestId: 98e4c42f-9c70-4539-843e-8d31803001e6
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                unmapped:
                  summary: 'Live: key valid for v1 but not mapped to a partner'
                  value:
                    type: https://api.eco.com/v1/errors/invalid-api-key
                    title: API key is missing, unknown, or revoked
                    status: 401
                    code: invalid-api-key
                    requestId: f81fb73d-0fd2-4cdc-a14d-882797bb89a7
                    detail: >-
                      The request could not be attributed to an authorized API
                      key.
                invalid-signature:
                  summary: 'Live: signature does not verify'
                  value:
                    type: https://api.eco.com/v1/errors/invalid-signature
                    title: Signature verification failed
                    status: 401
                    code: invalid-signature
                    requestId: 4ece761247bfc14267057f95ee3071bc
                    legacyCode: eco-quotes:1003
        '403':
          description: >-
            No API key supplied. The gateway rejects the request before it
            reaches the API, with a plain JSON body.
          content:
            application/json:
              example:
                Message: >-
                  User is not authorized to access this resource with an
                  explicit deny in an identity-based policy
        '409':
          description: This signature is already pinned to a different target
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/signature-already-bound
                title: This signature is already pinned to a different target
                status: 409
                code: signature-already-bound
                requestId: 3ff33e83251b3cdb7d3daf15d186b89b
        '410':
          description: The quote is unknown or expired at submit time
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/quote-expired
                title: The quote is unknown or expired at submit time
                status: 410
                code: quote-expired
                requestId: 19ff8aa0914e6fbe2fcb7fbe930bf0ea
        '422':
          description: Chain is not supported
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/chain-not-supported
                title: Chain is not supported
                status: 422
                code: chain-not-supported
                requestId: 252dbcdeebe5465fdc089843e8643b37
        '429':
          description: Rate limit exceeded
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/rate-limit-exceeded
                title: Rate limit exceeded
                status: 429
                code: rate-limit-exceeded
                requestId: 1eac3d6cc2aafa524b0c47a039576f8c
        '500':
          description: Internal error
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/internal-error
                title: Internal error
                status: 500
                code: internal-error
                requestId: 02dabcf0f4e3def9a6091526d3d21022
        default:
          description: Error (RFC 9457 problem+json; see x-error-catalog)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
      security:
        - ApiKey: []
components:
  schemas:
    Problem:
      type: object
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
          minLength: 1
        status:
          type: integer
          minimum: 400
          maximum: 599
        code:
          type: string
          description: >-
            Stable, machine-readable error code from the catalog. Branch on this
            and `status`, not on `title` or `detail`.
        detail:
          type: string
        instance:
          type: string
        legacyCode:
          type: string
          description: >-
            The pre-v1 numeric error code this problem maps to, for integrations
            migrating from the older services.
        solverErrors:
          type: array
          items:
            type: object
            properties:
              solver:
                type: string
                description: >-
                  Address on the relevant chain: `0x…` hex for EVM chains,
                  base58 for Solana, `T…` base58 for Tron.
              solverName:
                type: string
                minLength: 1
              code:
                type: string
                minLength: 1
              message:
                type: string
            required:
              - solver
              - message
        errors:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
                minLength: 1
              detail:
                type: string
                minLength: 1
            required:
              - field
              - detail
          description: Field-level validation failures.
        requestId:
          type: string
          description: >-
            Correlation ID for support. Present on router-served errors;
            deposit-address-served errors carry a short numeric value.
      required:
        - type
        - title
        - status
        - code
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.