> ## 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 a gasless deposit with EIP-2612

> Funds a deposit address gaslessly with a signed EIP-2612 permit.

Funds a deposit address gaslessly with a signed EIP-2612 permit. `target.depositAddress` must equal `permit.spender`. The first submission answers `202` with a gasless job; resending the same signature returns the existing job with `200`.

No API key is required: Circle Gateway operations are open so that any wallet or relay can create and fund a deposit address. A supplied key that is unknown, revoked, or not enabled for v1 is still rejected with `401 invalid-api-key`, so send no key rather than a wrong one. 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/circle-gateway/deposit-addresses/submit/erc-2612
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/circle-gateway/deposit-addresses/submit/erc-2612:
    post:
      tags:
        - circle-gateway
      summary: Initiate a gasless deposit with EIP-2612
      description: >-
        Funds a deposit address gaslessly with a signed EIP-2612 permit.
        `target.depositAddress` must equal `permit.spender`. The first
        submission answers `202` with a gasless job; resending the same
        signature returns the existing job with `200`.


        No API key is required: Circle Gateway operations are open so that any
        wallet or relay can create and fund a deposit address. A supplied key
        that is unknown, revoked, or not enabled for v1 is still rejected with
        `401 invalid-api-key`, so send no key rather than a wrong one.


        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: gateway-submit-erc-2612
      parameters:
        - name: x-api-key
          in: header
          required: false
          schema:
            type: string
          description: >-
            Optional. A key that is unknown, revoked, or not enabled for v1 is
            rejected with 401.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                chainId:
                  type: integer
                  exclusiveMinimum: 0
                target:
                  type: object
                  properties:
                    depositAddress:
                      type: string
                  required:
                    - depositAddress
                  additionalProperties: false
                permit:
                  type: object
                  properties:
                    owner:
                      type: string
                    spender:
                      type: string
                    value:
                      type: string
                      maxLength: 78
                    nonce:
                      type: string
                      maxLength: 78
                    deadline:
                      type: integer
                      minimum: 0
                  required:
                    - owner
                    - spender
                    - value
                    - nonce
                    - deadline
                signature:
                  type: string
                  minLength: 130
                  maxLength: 132
              required:
                - chainId
                - target
                - permit
                - signature
            examples:
              vault-target:
                summary: >-
                  Fund the deposit address above with an EIP-2612 permit;
                  permit.spender must equal target.depositAddress (placeholder
                  signature)
                value:
                  chainId: 8453
                  target:
                    depositAddress: '0x379BAB257e7Eb159538F01165B766A1BEaf2D954'
                  permit:
                    owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
                    spender: '0x379BAB257e7Eb159538F01165B766A1BEaf2D954'
                    value: '1000000'
                    nonce: '0'
                    deadline: 1789526504
                  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: >-
                  chainId: Invalid input: expected number, received undefined;
                  target: Invalid input: expected object, received undefined;
                  permit: Invalid input: expected object, received undefined;
                  signature: Invalid input: expected string, received undefined
                errors:
                  - field: chainId
                    detail: 'Invalid input: expected number, received undefined'
                  - field: target
                    detail: 'Invalid input: expected object, received undefined'
                  - field: permit
                    detail: 'Invalid input: expected object, received undefined'
                  - field: signature
                    detail: 'Invalid input: expected string, received undefined'
                requestId: f371e43e6fd4406b10e19487b3170edf
        '401':
          description: >-
            The supplied x-api-key is unknown, revoked, or not enabled for the
            v1 API. Returned for every v1 endpoint by the gateway, with
            Content-Type application/json. Submit endpoints also answer 401 from
            the API itself, as application/problem+json: `invalid-signature`
            when the signature does not recover to the expected signer,
            `authorization-expired` when 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:
                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: Access denied for the supplied key.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://api.eco.com/v1/errors/permission-denied
                title: The caller may not perform this operation
                status: 403
                code: permission-denied
                requestId: a9a151aa45c9dbf44c78513905f6606a
        '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: []
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

````

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