{
    "openapi": "3.1.0",
    "info": {
        "title": "SourceParts EU \u2014 Supplier API",
        "version": "1.0.0",
        "description": "Suppliers push procurement prices, stock and lead times for SourceParts catalogue SKUs. Access is granted manually: request access via the form on https://shop.sourceparts.eu/supplier-api, and we issue you an API key.",
        "contact": {
            "name": "SourceParts EU",
            "email": "ikben@nickaldewereld.nl"
        },
        "license": {
            "name": "Proprietary API \u2014 access by agreement"
        }
    },
    "servers": [
        {
            "url": "https://shop.sourceparts.eu/api/supplier/v1",
            "description": "Production"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ],
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "spk_live_*",
                "description": "Send your API key as: Authorization: Bearer spk_live_\u2026"
            }
        },
        "schemas": {
            "Offer": {
                "type": "object",
                "required": [
                    "sku",
                    "procure_price"
                ],
                "properties": {
                    "sku": {
                        "type": "string",
                        "description": "Our catalogue SKU (see GET /products).",
                        "example": "SP-B866-4E4P1"
                    },
                    "supplier_sku": {
                        "type": "string",
                        "nullable": true,
                        "description": "Your own order code for this item."
                    },
                    "procure_price": {
                        "type": "number",
                        "format": "float",
                        "description": "Unit purchase price, excl. VAT.",
                        "example": 142.5
                    },
                    "currency": {
                        "type": "string",
                        "minLength": 3,
                        "maxLength": 3,
                        "default": "EUR",
                        "example": "EUR"
                    },
                    "stock": {
                        "type": "integer",
                        "nullable": true,
                        "minimum": 0,
                        "example": 240
                    },
                    "lead_time_days": {
                        "type": "integer",
                        "nullable": true,
                        "minimum": 0,
                        "example": 3
                    },
                    "moq": {
                        "type": "integer",
                        "nullable": true,
                        "minimum": 1,
                        "description": "Minimum order quantity.",
                        "example": 1
                    },
                    "valid_until": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "example": "2026-12-31"
                    },
                    "meta": {
                        "type": "object",
                        "nullable": true,
                        "description": "Any extra fields; stored as-is."
                    }
                }
            },
            "Error": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "object",
                        "properties": {
                            "code": {
                                "type": "string"
                            },
                            "message": {
                                "type": "string"
                            }
                        }
                    }
                }
            }
        }
    },
    "paths": {
        "/ping": {
            "get": {
                "summary": "Verify your API key",
                "responses": {
                    "200": {
                        "description": "Supplier identity"
                    }
                }
            }
        },
        "/products": {
            "get": {
                "summary": "List catalogue SKUs you can quote against",
                "responses": {
                    "200": {
                        "description": "Array of {sku, name}"
                    }
                }
            }
        },
        "/offers": {
            "get": {
                "summary": "List your current offers",
                "responses": {
                    "200": {
                        "description": "Array of offers"
                    }
                }
            },
            "post": {
                "summary": "Bulk create/update offers (idempotent upsert by SKU)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "offers"
                                ],
                                "properties": {
                                    "offers": {
                                        "type": "array",
                                        "minItems": 1,
                                        "maxItems": 1000,
                                        "items": {
                                            "$ref": "#/components/schemas/Offer"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Per-SKU created/updated summary"
                    },
                    "422": {
                        "description": "Validation error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/offers/{sku}": {
            "put": {
                "summary": "Create/update a single offer",
                "parameters": [
                    {
                        "name": "sku",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Offer"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Updated"
                    },
                    "201": {
                        "description": "Created"
                    }
                }
            },
            "delete": {
                "summary": "Withdraw an offer",
                "parameters": [
                    {
                        "name": "sku",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Deleted"
                    },
                    "404": {
                        "description": "No such offer"
                    }
                }
            }
        }
    }
}