Add website favicon API and manual favicon profile updates.

Expose GET /tenants/{domain}/website/favicon for storefront tab icons, allow faviconMediaId on profile PATCH, and sync website API docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-26 00:51:11 +03:30
co-authored by Cursor
parent 6ce6f959ac
commit ead16080b8
13 changed files with 318 additions and 13 deletions
+95 -2
View File
@@ -176,7 +176,8 @@
},
"faviconUrl": {
"type": "string",
"nullable": true
"nullable": true,
"description": "Tab icon URL. Dedicated favicon when uploaded; otherwise same as logoUrl."
},
"specialProductsSource": {
"type": "string",
@@ -332,7 +333,99 @@
],
"responses": {
"200": {
"description": "Business public profile"
"description": "Business public profile",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": { "type": "string" },
"name": { "type": "string" },
"nameFa": { "type": "string" },
"about": { "type": "string" },
"vision": { "type": "string" },
"logoUrl": { "type": "string", "nullable": true },
"logoDarkUrl": {
"type": "string",
"nullable": true,
"description": "Logo for dark backgrounds; null when not set."
},
"faviconUrl": {
"type": "string",
"nullable": true,
"description": "Dedicated favicon when uploaded; otherwise same as logoUrl."
},
"emails": {
"type": "array",
"items": { "type": "string" }
},
"phoneNumbers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "type": "string", "enum": ["landline", "cell"] },
"number": { "type": "string" }
}
}
},
"socialMedia": { "type": "object" },
"addresses": { "type": "array", "items": { "type": "object" } }
}
}
}
}
}
}
}
},
"/tenants/{domain}/website/favicon": {
"get": {
"tags": [
"Homepage"
],
"summary": "Favicon and logo URLs for site chrome",
"description": "Use `faviconUrl` for `<link rel=\"icon\">` or Next.js `metadata.icons`. When no dedicated favicon is uploaded, `faviconUrl` equals `logoUrl`. Prefer this endpoint over tenant resolve when you only need branding assets.",
"parameters": [
{
"$ref": "#/components/parameters/domain"
}
],
"responses": {
"200": {
"description": "Branding asset URLs",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"faviconUrl": {
"type": "string",
"nullable": true,
"description": "Use for browser tab icon. Falls back to logoUrl when no dedicated favicon exists."
},
"logoUrl": {
"type": "string",
"nullable": true,
"description": "Light-theme logo."
},
"logoDarkUrl": {
"type": "string",
"nullable": true,
"description": "Dark-theme logo; null when not set."
},
"hasDedicatedFavicon": {
"type": "boolean",
"description": "True when the business uploaded a separate favicon (not auto-derived from logo)."
}
},
"required": ["faviconUrl", "logoUrl", "logoDarkUrl", "hasDedicatedFavicon"]
}
}
}
},
"404": {
"description": "Unknown domain"
}
}
}