{
  "openapi": "3.0.1",
  "info": {
    "title": "Prix des API LLM (OpenRouter, models.dev, LiteLLM)",
    "description": "Collecte et normalise les tarifs des API de modèles de langage depuis OpenRouter, models.dev et LiteLLM. Détecte les changements de prix, les nouveaux modèles, les dépréciations et les modifications de contexte. Historique automatique entre les runs.",
    "version": "1.0",
    "x-build-id": "cdwVgEkOshKSQozoF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rosmax~llm-api-pricing/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rosmax-llm-api-pricing",
        "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/rosmax~llm-api-pricing/runs": {
      "post": {
        "operationId": "runs-sync-rosmax-llm-api-pricing",
        "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/rosmax~llm-api-pricing/run-sync": {
      "post": {
        "operationId": "run-sync-rosmax-llm-api-pricing",
        "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": [
          "mode",
          "sources",
          "maxItems",
          "historyStoreName"
        ],
        "properties": {
          "mode": {
            "title": "Mode de collecte",
            "enum": [
              "snapshot",
              "changes"
            ],
            "type": "string",
            "description": "snapshot = tous les modèles normalisés ; changes = uniquement les différences depuis le dernier relevé",
            "default": "snapshot"
          },
          "sources": {
            "title": "Sources de données",
            "minItems": 1,
            "uniqueItems": true,
            "type": "array",
            "description": "Sources à interroger (au moins une requise)",
            "items": {
              "type": "string",
              "enum": [
                "openrouter",
                "modelsdev",
                "litellm"
              ],
              "enumTitles": [
                "OpenRouter",
                "models.dev",
                "LiteLLM"
              ]
            },
            "default": [
              "openrouter",
              "modelsdev",
              "litellm"
            ]
          },
          "maxItems": {
            "title": "Nombre maximum d'items total",
            "minimum": 1,
            "type": "integer",
            "description": "Limite stricte du nombre total d'enregistrements à produire",
            "default": 1000
          },
          "maxItemsPerSource": {
            "title": "Nombre maximum d'items par source",
            "minimum": 0,
            "type": "integer",
            "description": "Limite par source (0 = répartition équitable de maxItems). Avec 3 sources et maxItems=1000, chaque source est limitée à ~333 items.",
            "default": 0
          },
          "providers": {
            "title": "Filtrer par fournisseurs",
            "type": "array",
            "description": "Liste de fournisseurs à inclure (vide = tous). Ex: openai, anthropic, google",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "onlyFree": {
            "title": "Seulement les modèles gratuits",
            "type": "boolean",
            "description": "Filtrer uniquement les modèles avec tarification à 0",
            "default": false
          },
          "minContext": {
            "title": "Contexte minimum",
            "minimum": 0,
            "type": "integer",
            "description": "Filtrer les modèles avec au moins N tokens de contexte (0 = désactivé)",
            "default": 0
          },
          "historyStoreName": {
            "title": "Nom du Key-Value Store d'historique",
            "type": "string",
            "description": "Nom du store pour conserver l'historique entre runs",
            "default": "llm-pricing-history"
          },
          "emitBaselineOnFirstRun": {
            "title": "Émettre la baseline au premier run en mode changes",
            "type": "boolean",
            "description": "Au premier run en mode changes, émettre tous les items marqués is_baseline=true (sinon 0 item)",
            "default": true
          },
          "snapshotRetention": {
            "title": "Nombre de snapshots datés à conserver",
            "minimum": 0,
            "type": "integer",
            "description": "Nombre de relevés datés à garder dans l'historique (0 = désactivé)",
            "default": 7
          },
          "minPriceChangePct": {
            "title": "Seuil minimal de variation de prix (%)",
            "minimum": 0,
            "type": "number",
            "description": "Ignorer les variations de prix inférieures à ce seuil en % (0 = toutes les variations)",
            "default": 1
          },
          "webhookUrl": {
            "title": "URL de webhook pour les alertes",
            "pattern": "^(https?://.*)?$",
            "type": "string",
            "description": "URL optionnelle pour recevoir un POST JSON avec le résumé des changements",
            "default": ""
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}