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

# Accept

> Accepts a previously retrieved offline rate proposal and books the hedge accordingly.



## OpenAPI

````yaml POST /customers/{customerId}/hedges/accept-offline-quote
openapi: 3.1.0
info:
  title: Grain API
  version: 1.0.0
  description: >-
    Grain's API provides a comprehensive set of endpoints for managing hedging,
    spot transactions, pricing, and fund movements - enabling seamless
    integration of FX workflows into your platform. Each API call follows REST
    conventions, uses secure authentication, and returns standardized responses
    for consistency across environments.
  license:
    name: Creative Commons Attribution 3.0
  contact:
    name: Grain Finance
    url: https://docs.grainfinance.co
    email: support@grainfinance.co
  termsOfService: https://grainfinance.co/terms-of-service/
  x-apiClientRegistration:
    url: https://grainfinance.co/partners
servers:
  - url: https://api.grainfinance.co/v1
    description: Grain API
security: []
tags:
  - name: Hedges
    description: >-
      Hedge objects represent transactions that lock exchange rates for future
      dates. A single hedge locks an exchange rate for a future transaction
      between two currencies.
  - name: Dual Hedges
    description: >-
      A dual hedge mitigates FX risk by automatically generating two linked
      hedge legs - a customer leg and a supplier leg - both routed through the
      customer's functional currency. This structure reduces exposure to
      currency fluctuations for both cash flow and accounting purposes, while
      allowing independent tracking and reporting of each hedge leg.
  - name: Customers
    description: >-
      Customer objects represent your end customers on the Grain platform. A
      customer must be created before a hedge or spot transaction can be
      initiated.
  - name: Pricing
    description: >-
      Pricing endpoints provide access to FX rates for currency pairs that are
      not being hedged. These endpoints can be used for live rate display or
      bulk retrieval to support high-volume quoting workflows.
  - name: Spots
    description: >-
      Spot objects represent currency conversions executed for immediate or
      near-term settlement.
  - name: Conversions
    description: >-
      Conversion objects represent currency conversions executed for immediate
      or near-term settlement.
  - name: Wallets
    description: Endpoints to view balances, manage funding, and perform transfers.
paths:
  /customers/{customerId}/hedges/accept-offline-quote:
    post:
      tags:
        - Hedges
      description: >-
        Accepts a previously retrieved offline rate proposal and books the hedge
        accordingly.
      operationId: Offline Accept
      parameters:
        - description: The id of the customer within the Grain platform.
          in: path
          name: customerId
          required: true
          schema:
            type: string
        - in: header
          name: X-Customer-IP
          required: true
          schema:
            $ref: '#/components/schemas/CustomerIP'
      requestBody:
        description: The payload required in order to accept an offline quote hedge
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcceptOfflineHedgeProposalRequestBody'
              description: The payload required in order to accept an offline quote hedge
      responses:
        '200':
          description: Hedge Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AcceptOfflineHedgeResponseBody'
        '400':
          description: >-
            The request failed because it is not well-formed or is syntactically
            incorrect or violates schema.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AcceptOfflineHedgeBadParamsErrorResponse'
        '404':
          description: The request failed because the resource does not exist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: The request failed because a business rule constraint was violated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '412':
          description: The request failed because one or more preconditions were not met.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: >-
            The request failed because it is either semantically incorrect or
            has failed business validation.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/AcceptOfflineHedgeRevisionExpiredErrorResponse
        '428':
          description: The request failed because a required precondition was not provided.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '451':
          description: The request failed due to legal restrictions.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RejectedByIPError'
      security:
        - api-key: []
components:
  schemas:
    CustomerIP:
      type: string
      format: IPv4
      description: >-
        The IPv4 address of the browser from which the customer contacts your
        platform. <br />

        _example_: `192.158.1.38`
      pattern: ((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}
    AcceptOfflineHedgeProposalRequestBody:
      description: The required parameters when accepting an offline hedge
      properties:
        revision:
          type: number
          format: double
          description: >-
            The id of the revision that defines the accepted rate for the
            currency-pair and tenor.
          example: 156
        fromCurrency:
          type: string
          description: >-
            The currency in which the transaction should be paid at by your
            customer.
          example: MXN
        toCurrency:
          type: string
          description: the currency you want to buy.
          example: USD
        toCurrencyAmount:
          type: number
          format: double
          description: The amount to hedge in the toCurrency.
          example: 100000
        endAt:
          $ref: '#/components/schemas/GrainDateFormat'
          description: >-
            The date in which the hedge will be settled, denoted in `YYYY-MM-DD`
            format.
          example: '2024-02-23'
        rate:
          type: number
          format: double
          description: >-
            Represents the exchange rate according to the offline map of
            currency pairs to tenor object.


            The calculation of the tenor is based on the difference in calendar
            days between the 'tenorCalculationDate' and the 'endAt' date:


            - If the number of calendar days from 'tenorCalculationDate' to
            `endAt` is less than or equal to 7, the tenor is 7 days.

            - If the number of calendar days from 'tenorCalculationDate' to
            `endAt` is greater than 7 and less than or equal to 14, the tenor is
            14 days.

            - If the number of calendar days from 'tenorCalculationDate' to
            `endAt` is greater than 14 and less than or equal to 30, the tenor
            is 30 days.

            - If the number of calendar days from 'tenorCalculationDate' to
            `endAt` is greater than 30 and less than or equal to 60, the tenor
            is 60 days.

            - ...

            - If the number of calendar days from 'tenorCalculationDate' to
            `endAt` is greater than 330 and less than or equal to 360, the tenor
            is 360 days.


            When counting the difference in calendar days, every day is counted
            as one regardless of the duration of the day. This means that the
            calculation includes all days: weekends, holidays, and weekdays
            alike.


            For example, if the 'endAt' date is 2023-12-16 and the
            'tenorCalculationDate' is 2024-12-15, the result is 1 calendar day.


            To calculate the difference in calendar days accurately, we
            recommend using a date manipulation library, such as date-fns and
            its `differenceInCalendarDays` function, or a similar feature
            provided by other date libraries.
          example: 20.616512
        externalTransactionId:
          type: string
          description: Optional The transaction id, as identified within your system.
          example: 780231b3ae0d7e9e5097nd89
        extraFields:
          $ref: '#/components/schemas/ExtraFieldsParam'
      required:
        - revision
        - fromCurrency
        - toCurrency
        - toCurrencyAmount
        - endAt
        - rate
      type: object
      additionalProperties: false
    AcceptOfflineHedgeResponseBody:
      description: The response of accepting an offline rate for a hedge.
      properties:
        id:
          $ref: '#/components/schemas/UUID'
          description: The id of the created object.
          example: 1b0ada1e-fa1b-4cfe-a553-01b340c5650e
        transactionId:
          $ref: '#/components/schemas/UUID'
          description: The id of the transaction within the Grain platform.
          example: 4d78ac65-2c3f-47e2-8bf3-3f76124e9d27
      required:
        - id
      type: object
      additionalProperties: false
    AcceptOfflineHedgeBadParamsErrorResponse:
      description: An API Error
      properties:
        message:
          type: string
          description: A short code of the error.
          example: REVISION_INVALID
        reason:
          type: string
          description: A detailed description of the reason for the failure.
          example: >-
            The revision number is not valid or does not exist. Please fetch a
            new rate table using the /offline-rates endpoint and pass a valid
            revision.
      required:
        - message
      type: object
      additionalProperties: false
    ErrorResponse:
      description: An API Error
      properties:
        message:
          type: string
          description: A short explanation of the error.
          example: Can't perform this action
        reason:
          type: string
          description: A detailed description of the reason for the failure.
          example: >-
            Supplied object is in *Cancelled* state, which prevents performing
            this action
      required:
        - message
      type: object
      additionalProperties: false
    AcceptOfflineHedgeRevisionExpiredErrorResponse:
      description: An API Error
      properties:
        message:
          type: string
          description: A short code of the error.
          example: REVISION_EXPIRED
        reason:
          type: string
          description: A detailed description of the reason for the failure.
          example: >-
            The revision number has expired. Please fetch a new rate table using
            the /offline-rates endpoint.
      required:
        - message
      type: object
      additionalProperties: false
    RejectedByIPError:
      properties:
        message:
          type: string
          description: A short explanation of the error.
          example: Could not parse IP address (v4 or v6) for ip
      required:
        - message
      type: object
      additionalProperties: false
    GrainDateFormat:
      type: string
      example: '2023-04-15'
      format: YYYY-MM-DD
      description: >-
        The date format accepted by Grain's API. We accept dash separated
        ISO-8601 date-only strings.
      pattern: \d{4}-\d{2}-\d{2}
    ExtraFieldsParam:
      properties: {}
      additionalProperties:
        anyOf:
          - type: string
          - type: number
            format: double
          - type: boolean
      type: object
      example:
        field_a: value_a
        field_b: value_b
      description: |-
        Additional fields that provide further details about the transaction.
        These fields should be specified as a valid JSON object.
    UUID:
      type: string
      format: uuid
      description: |-
        Stringified UUIDv4.
        See [RFC 4112](https://tools.ietf.org/html/rfc4122)
      pattern: >-
        [0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}
  securitySchemes:
    api-key:
      type: http
      scheme: basic
      description: >-
        Basic authentication using the partner API keys from
        https://console.grainfinance.co/keys

````