{
  "openapi": "3.0.1",
  "info": {
    "title": "FFXIV Market Board Price Checker + Deal Monitor",
    "description": "Returns FFXIV market board prices per item from the official Universalis API (cheapest listing, sale velocity, recent sales) for a world, Data Centre or region, with price-drop alerts in monitor mode. Inputs: item IDs, world/DC/region. Agent-ready: pay per event (x402 and MCP), per item checked.",
    "version": "0.1",
    "x-build-id": "cJMSGISyUABef7SMn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nerolabs~ffxiv-market-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nerolabs-ffxiv-market-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/nerolabs~ffxiv-market-monitor/runs": {
      "post": {
        "operationId": "runs-sync-nerolabs-ffxiv-market-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/nerolabs~ffxiv-market-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-nerolabs-ffxiv-market-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "itemIds",
          "worldDcRegion"
        ],
        "properties": {
          "itemIds": {
            "title": "Item IDs",
            "type": "array",
            "description": "Universalis/game item IDs to check, e.g. 5333. Find an item's ID on universalis.app (search the item, the ID is in the page URL) or garlandtools.org. Accepts one or many.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "worldDcRegion": {
            "title": "World, Data Center, or Region",
            "type": "string",
            "description": "Scopes the price check. A single world (e.g. 'Excalibur') checks that server only. A Data Center (e.g. 'Aether', 'Chaos', 'Mana') checks every world in it and finds the cheapest. A Region (e.g. 'North-America', 'Europe', 'Japan', 'Oceania') is the widest scope. Wider scope means more listings to find a deal in, but a Data Center is usually the realistic buy/sell range since cross-DC travel isn't free in-game."
          },
          "listingsPerItem": {
            "title": "Raw listings to include per item",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many of the cheapest current listings to include in the output for each item, beyond the summary stats. 0 skips raw listings entirely (smaller, cheaper runs).",
            "default": 5
          },
          "includeHistory": {
            "title": "Include recent sale history",
            "type": "boolean",
            "description": "Include the most recent completed sales for each item, not just current listings. Useful for gauging real sale velocity, not just asking prices.",
            "default": true
          },
          "historyEntriesPerItem": {
            "title": "History entries per item",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many recent sales to include per item, if 'Include recent sale history' is on.",
            "default": 5
          },
          "monitorMode": {
            "title": "Monitor mode (alert on price drops)",
            "type": "boolean",
            "description": "When true, the Actor remembers the cheapest price it saw last time for each item and only flags an alert when the price drops meaningfully since then, or crosses your target price. Schedule this Actor to run on the same itemIds, worldDcRegion, and watchlistId (e.g. hourly) for ongoing deal-hunting.",
            "default": false
          },
          "watchlistId": {
            "title": "Watchlist ID (Monitor mode only)",
            "type": "string",
            "description": "Only needed if you're running more than one independent watchlist from the same Apify account and want their price history kept separate. Leave as default otherwise.",
            "default": "default"
          },
          "priceDropAlertPercent": {
            "title": "Alert threshold, percent price drop (Monitor mode only)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Alert when the cheapest listing price for an item drops by at least this percent since the last check.",
            "default": 10
          },
          "targetPriceGil": {
            "title": "Target price in gil (optional, Monitor mode only)",
            "minimum": 0,
            "type": "integer",
            "description": "If set, also alert the moment the cheapest listing price drops to or below this absolute price, even if the percent-drop threshold isn't met. Only fires once, on the transition into that range, not on every run spent below it. Applies to every item in this run, so it's best used with a single item or items of similar value."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}