fxapis-com Events API

The event log: every event in this workspace, exactly as webhooks deliver it, kept 7, 30 or 90 days by plan. To catch up after downtime, ask for everything `after` the last event you read from this list (not the last webhook: webhooks arrive out of order). Needs `history:read`, on plans with webhooks.

Operations 2

GET /v1/events List events #
GET /v1/events/{id} Read one event #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/fxapis-com:fxapis-com-events-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

fxapis-com-events-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: fxapis Events API
  version: 0.1.0
  description: 'fxapis is the MetaTrader 5 API. Connect an MT5 account once, then trade it, read its positions

    and its history over plain HTTP. Choose whether each account stays connected or comes online

    only when you need it.


    ### Conventions


    - Every successful response is `{ "data": … }`; every failure is `{ "error": { "code", "message" } }`.

    Match on `code`, which is stable. `message` is written for a human and may change.

    - Every response carries `requestId`. Quote it in a support request and the entire call can be found.

    - Times are RFC 3339 in UTC. Money and prices are never floats in a request body.


    ### Bringing an account online is not instant


    A broker login takes as long as the broker takes — usually seconds, occasionally much longer.

    `POST /accounts/{id}/warm` brings an account online and returns **202** with a `pollUrl` rather than

    holding the request open, so your client''s timeout never becomes a question about someone else''s

    network. Poll `GET /accounts/{id}/status` until `state` is `ready`.


    ### Credentials


    The MT5 password you send is encrypted before it is stored, with a data key that is bound to that

    one account, and is never returned by any endpoint, written to the account record or included in

    a log line. We cannot show it back to you — if it is lost, it is reset at the broker.'
servers:
- url: https://api.fxapis.com
  description: Production
security:
- apiKey: []
tags:
- name: Events
  description: 'The event log: every event in this workspace, exactly as webhooks deliver it, kept 7, 30 or 90 days by plan. To catch up after downtime, ask for everything `after` the last event you read from this list (not the last webhook: webhooks arrive out of order). Needs `history:read`, on plans with webhooks.'
paths:
  /v1/events:
    get:
      summary: List events
      tags:
      - Events
      description: 'Everything that happened in this workspace while its plan included webhooks, exactly as webhooks deliver it, kept 7, 30 or 90 days by plan — whether or not a webhook endpoint was listening. Events from a time the plan did not include webhooks are not recorded, so they are not listed.


        An event appears in the list a few seconds after it happens, and only once every earlier event has, so a page never moves past one that has not appeared yet — except an event stuck more than 15 minutes before it could be prepared for sending (rare; we alert on it), which stops holding the list back and so, once it does appear, may fall behind an `after=` loop that already paged past its moment.


        **Catching up after downtime:** keep an anchor id taken only from the last item of a list page you processed — never from a webhook: webhooks do not arrive in list order (sends run in parallel and retries are spread out), so a webhook''s id can be newer than an event still retrying. On start, call `?after=` and keep calling with the last id of each page until a page comes back empty. Then check `delivery_status=failed`, or run a replay, for anything given up on. Deduplicate on `id`. With `after`, events come oldest first. Without it, newest first, paged by `nextCursor`. An `after` id older than your plan keeps answers `400 EVENT_NOT_IN_HISTORY`: resume from `since` instead.'
      parameters:
      - schema:
          type: string
        in: query
        name: after
        required: false
        description: 'An event id: return the events after it, oldest first. To catch up, pass the id of the last event of a list page you processed — never a webhook''s id, since webhooks can arrive out of order.'
      - schema:
          type: string
          format: date-time
        in: query
        name: since
        required: false
        description: Events at or after this time.
      - schema:
          type: string
          format: date-time
        in: query
        name: until
        required: false
        description: Events before this time.
      - schema:
          anyOf:
          - type: string
          - type: array
            items:
              type: string
              enum:
              - order.filled
              - order.rejected
              - order.unresolved
              - order.resolved
              - order.cancelled
              - position.opened
              - position.closed
              - account.state_changed
              - wave.settled
              - copy.executed
              - copy.skipped
              - copy.failed
              - copy.subscription_stopped
              - copy.drift_corrected
              - copy.master_disconnected
        in: query
        name: type
        required: false
        description: 'Only these types: repeat it (`type=a&type=b`) or separate with commas.'
      - schema:
          type: string
          format: uuid
        in: query
        name: account_id
        required: false
        description: Events about this MT5 account, including multi-account orders with a leg on it.
      - schema:
          type: string
          enum:
          - failed
        in: query
        name: delivery_status
        required: false
        description: '`failed`: events at least one of your endpoints has not received — given up on, or still retrying after a failure.'
      - schema:
          type: integer
          minimum: 1
          maximum: 200
          default: 50
        in: query
        name: limit
        required: false
      - schema:
          type: string
          maxLength: 200
        in: query
        name: cursor
        required: false
        description: 'Without `after`: the previous page''s `nextCursor`.'
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      description: 'Exactly the body a webhook delivery carries: one handler can process both.'
                      properties:
                        id:
                          type: string
                          format: uuid
                          description: The same id webhooks send in the body and `fxapis-event-id`. Deduplicate on it.
                        type:
                          type: string
                          enum:
                          - order.filled
                          - order.rejected
                          - order.unresolved
                          - order.resolved
                          - order.cancelled
                          - position.opened
                          - position.closed
                          - account.state_changed
                          - wave.settled
                          - copy.executed
                          - copy.skipped
                          - copy.failed
                          - copy.subscription_stopped
                          - copy.drift_corrected
                          - copy.master_disconnected
                        createdAt:
                          type: string
                          format: date-time
                        data:
                          type: object
                          additionalProperties: true
                          description: The resource as the REST API presented it when the event was sent out.
                  page:
                    type: object
                    properties:
                      hasMore:
                        type: boolean
                      nextCursor:
                        type:
                        - 'null'
                        - string
        '400':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '401':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '402':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '403':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
      operationId: getV1Events
      x-operation-id-source: derived
  /v1/events/{id}:
    get:
      summary: Read one event
      tags:
      - Events
      description: Exactly as a webhook delivery carried it.
      parameters:
      - schema:
          type: string
          format: uuid
        in: path
        name: id
        required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    description: 'Exactly the body a webhook delivery carries: one handler can process both.'
                    properties:
                      id:
                        type: string
                        format: uuid
                        description: The same id webhooks send in the body and `fxapis-event-id`. Deduplicate on it.
                      type:
                        type: string
                        enum:
                        - order.filled
                        - order.rejected
                        - order.unresolved
                        - order.resolved
                        - order.cancelled
                        - position.opened
                        - position.closed
                        - account.state_changed
                        - wave.settled
                        - copy.executed
                        - copy.skipped
                        - copy.failed
                        - copy.subscription_stopped
                        - copy.drift_corrected
                        - copy.master_disconnected
                      createdAt:
                        type: string
                        format: date-time
                      data:
                        type: object
                        additionalProperties: true
                        description: The resource as the REST API presented it when the event was sent out.
        '401':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '402':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '403':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
        '404':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable, machine-readable. Match on this, not on the message.
                      message:
                        type: string
                        description: For a human. May change between releases.
                      details:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                    required:
                    - code
                    - message
                  requestId:
                    type: string
                    description: Also on every response. Quote it in a support request and the whole call can be found.
      operationId: getV1EventsById
      x-operation-id-source: derived
components:
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer fx_live_<id>_<secret>`.


        A key is shown once, at creation. We cannot show it again or recover it for you.

        Keys carry a label (`live` or `test`) in the key itself, so each configuration is easy to tell

        apart. Both reach real brokers: test with a broker demo account.


        Scopes are per key. A key without `accounts:write` can read accounts and nothing else.'
    adminKey:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer fx_admin_<id>_<secret>`.


        An admin key manages this workspace''s ordinary API keys (`/v1/api-keys`) and can do nothing else.

        Only the workspace owner makes one, in the console, optionally limited to IP addresses and given

        an expiry. Every request made with one is audited.'