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

# POST /v0/wallet/transfer-offers

> Create an offer to directly transfer a given amount of Amulet to another party.
Direct transfers are a three-step process:
1. The sender creates a transfer offer
2. The receiver accepts the offer
3. The sender's wallet automation consumes the accepted offer and transfers the amount.
   Amulets are not locked for direct transfers.
   If the sender's wallet does not have enough Amulet to fulfill the offer at this point,
   the transfer will fail.




## OpenAPI

````yaml /openapi/splice/validator/wallet-external.yaml post /v0/wallet/transfer-offers
openapi: 3.0.0
info:
  title: Wallet API
  version: 0.0.1
servers:
  - url: https://example.com/api/validator
security: []
tags:
  - name: wallet
paths:
  /v0/wallet/transfer-offers:
    post:
      tags:
        - wallet
      summary: POST /v0/wallet/transfer-offers
      description: >
        Create an offer to directly transfer a given amount of Amulet to another
        party.

        Direct transfers are a three-step process:

        1. The sender creates a transfer offer

        2. The receiver accepts the offer

        3. The sender's wallet automation consumes the accepted offer and
        transfers the amount.
           Amulets are not locked for direct transfers.
           If the sender's wallet does not have enough Amulet to fulfill the offer at this point,
           the transfer will fail.
      operationId: createTransferOffer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTransferOfferRequest'
      responses:
        '200':
          description: The transfer offer has been created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateTransferOfferResponse'
        '400':
          description: |
            Invalid request, check the error response for details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: |
            The submitter’s wallet could not be found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: >-
            A transfer offer with the same tracking id has been created. Check
            the status endpoint for the current status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: >-
            A transfer offer with the same tracking id is currently being
            processed, which may or may not succeed. Retry submitting the
            request with exponential back-off.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          $ref: '#/components/responses/500'
      security:
        - walletUserAuth: []
components:
  schemas:
    CreateTransferOfferRequest:
      type: object
      required:
        - receiver_party_id
        - amount
        - description
        - expires_at
        - tracking_id
      properties:
        receiver_party_id:
          description: |
            The party id of the receiver.
          type: string
        amount:
          description: |
            The amount of Amulet to transfer.
          type: string
        description:
          description: >
            An arbitrary, user chosen text.

            This should be a human readable string that describes the purpose of
            the transfer.

            It will be shown to the receiver when they decide whether to accept
            the offer.
          type: string
        expires_at:
          description: >
            Expiry time of the transfer offer as unix timestamp in microseconds.
            After this time, the offer can no longer be accepted

            and automation in the wallet will eventually expire the transfer
            offer.

            Note that this time is compared against the ledger effective time of
            the Daml transaction accepting or expiring an offer, and can skew
            from the wall clock

            time measured on the caller's machine. See
            https://docs.daml.com/concepts/time.html

            for how ledger effective time is bound to the record time of a
            transaction on a domain.
          type: integer
          format: int64
        tracking_id:
          description: >
            Tracking id to support exactly once submission. Once submitted, all
            successive calls with the same tracking id

            will get rejected with a 409 or 429 status code unless the command
            fails and the offer did not get created.

            Clients should create a fresh tracking id when they try to create a
            new transfer offer. If that command submission fails

            with a retryable error or the application crashed and got restarted,
            successive command submissions must reuse the same

            tracking id to ensure they don't create the same offer multiple
            times.
          type: string
    CreateTransferOfferResponse:
      type: object
      required:
        - offer_contract_id
      properties:
        offer_contract_id:
          type: string
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
  responses:
    '500':
      description: internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    walletUserAuth:
      description: >
        JWT token as described in
        [spliceAppBearerAuth]("../../../../common/src/main/openapi/common-external.yaml#/components/securitySchemes/spliceAppBearerAuth").

        The subject of the token must be ledger API user of the user whose
        wallet the endpoint affects.
      type: http
      scheme: bearer
      bearerFormat: JWT

````