{
    "openapi": "3.1.0",
    "info": {
        "title": "CYFARE Unified API",
        "version": "1.0.0",
        "description": "Threat intelligence, advisories, exploits and file transfer. API keys are issued at https://cyfare.net/shop/.",
        "contact": {
            "url": "https://cyfare.net/api/enterprise/"
        }
    },
    "servers": [
        {
            "url": "https://cyfare.net"
        }
    ],
    "security": [
        {
            "ApiKeyAuth": []
        }
    ],
    "components": {
        "securitySchemes": {
            "ApiKeyAuth": {
                "type": "apiKey",
                "in": "header",
                "name": "X-API-Key",
                "description": "Also accepted as Authorization: Bearer <key> or ?api_key="
            }
        },
        "schemas": {
            "Error": {
                "type": "object",
                "properties": {
                    "status": {
                        "type": "string",
                        "enum": [
                            "error"
                        ]
                    },
                    "code": {
                        "type": "string"
                    },
                    "error": {
                        "type": "string"
                    },
                    "request_id": {
                        "type": "string"
                    }
                },
                "required": [
                    "status",
                    "error"
                ]
            },
            "Threat": {
                "type": "object",
                "properties": {
                    "status": {
                        "type": "string"
                    },
                    "request_id": {
                        "type": "string"
                    },
                    "endpoint": {
                        "type": "string"
                    },
                    "hash": {
                        "type": "string"
                    },
                    "found": {
                        "type": "boolean"
                    },
                    "sources": {
                        "type": "object",
                        "additionalProperties": true
                    }
                }
            },
            "Advisory": {
                "type": "object",
                "properties": {
                    "status": {
                        "type": "string"
                    },
                    "request_id": {
                        "type": "string"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "meta": {
                        "type": "object"
                    }
                }
            },
            "Exploit": {
                "type": "object",
                "properties": {
                    "status": {
                        "type": "string"
                    },
                    "request_id": {
                        "type": "string"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "meta": {
                        "type": "object"
                    }
                }
            }
        }
    },
    "paths": {
        "/api/enterprise/api.php": {
            "get": {
                "operationId": "query",
                "summary": "Query a public dataset",
                "parameters": [
                    {
                        "name": "endpoint",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "threat | ultrahash | advisory | exploit | upload"
                    },
                    {
                        "name": "api_key",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Alternative to the X-API-Key header"
                    },
                    {
                        "name": "hash",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "MD5/SHA1/SHA256 (threat, ultrahash)"
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Search term (advisory, exploit)"
                    },
                    {
                        "name": "severity",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Comma-separated severities"
                    },
                    {
                        "name": "reviewed",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "boolean"
                        },
                        "description": "Only reviewed advisories"
                    },
                    {
                        "name": "year",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Advisory year"
                    },
                    {
                        "name": "date_from",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "YYYY-MM-DD"
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "YYYY-MM-DD"
                    },
                    {
                        "name": "author",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Exploit author"
                    },
                    {
                        "name": "platform",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Exploit platform (PHP, Linux, …)"
                    },
                    {
                        "name": "type",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Exploit type"
                    },
                    {
                        "name": "verified",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "boolean"
                        },
                        "description": "Only verified exploits"
                    },
                    {
                        "name": "sort_by",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Sort column"
                    },
                    {
                        "name": "sort_dir",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "asc | desc"
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Page (default 1)"
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Page size (1–100, default 20)"
                    },
                    {
                        "name": "token",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Download token (endpoint=upload&action=download)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Result",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "oneOf": [
                                        {
                                            "$ref": "#/components/schemas/Threat"
                                        },
                                        {
                                            "$ref": "#/components/schemas/Advisory"
                                        },
                                        {
                                            "$ref": "#/components/schemas/Exploit"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing/invalid key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Inactive/expired key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Server error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "operationId": "upload",
                "summary": "Upload a file (multipart)",
                "parameters": [
                    {
                        "name": "endpoint",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "upload"
                    },
                    {
                        "name": "api_key",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Alternative to the X-API-Key header"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "file": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                },
                                "required": [
                                    "file"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Upload accepted"
                    },
                    "400": {
                        "description": "Missing file",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/advisory/query.php": {
            "get": {
                "operationId": "advisorySearch",
                "summary": "Public advisory search",
                "security": [],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Search term"
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Page"
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Page size"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Advisories (status envelope; results in data.results)"
                    },
                    "400": {
                        "description": "Bad request"
                    }
                }
            }
        }
    }
}