PodPSD 合成 API 文档
参数风格兼容主流 PSD 合成服务,便于迁移。基址:https://psd.elmdesk.com/api
基本说明
所有接口均为标准 HTTP 请求,请求体为 JSON(文件上传接口除外),响应为 JSON。支持图片替换与文字替换(text + font,见「生成图片」)。
data 里的 name 需与 PSD 中智能对象/文字图层名一致(字母/数字,字母开头)。未提供替换的图层会回退显示其原内容。POST /api/shengchengtu/submit(毫秒级受理)+ 回调/轮询取结果。身份验证
三种鉴权方式任选其一,放入请求 Header:
| 方式 | Header | 适用场景 |
|---|---|---|
| API Key(推荐) | X-Api-Key: pod_live_xxxxxxxx | 对外/程序化调用,按租户计费。控制台「API Key」处创建 |
| 会话 JWT | Authorization: Bearer <jwt> | 网页控制台 / 管理后台(登录后自动携带) |
| 内部 Token | Authorization: Basic <POD_TOKEN> | 内网/管理员直连(Basic 后直接跟 token 原文,非 base64) |
X-Api-Key: pod_live_xxxxxxxx Content-Type: application/json
Bearer > X-Api-Key/Basic。若服务端未配置 POD_TOKEN 且请求无任何凭证,则视为内网开放模式(便于联调)。鉴权失败返回 code=10002。返回结构与错误码
{ "code": 10000, "data": { ... }, "msg": "请求成功" }
| code | 含义 |
|---|---|
10000 | 操作成功 |
10001 | 操作失败(参数错误/权限/合成失败/队列已满等) |
10002 | token 失效 |
上传模板 PSD
通过 http 链接上传 PSD 模板。异步受理:接口立即返回模板 sku,系统在后台下载、解析尺寸与智能对象槽位、上传对象存储并生成预览图。
| 参数 | 类型 | 说明 |
|---|---|---|
| title必传 | string | 模板标题(自定义,用于列表快速识别) |
| url必传 | string | PSD 的 http 下载链接(有效文件) |
| type | number | 1=500 / 5=1800 / 9=10000,仅用于筛选 |
{ "title": "T恤正面", "url": "https://your.com/muban.psd", "type": 5 }
{ "code": 10000, "data": { "sku": "1783579695159834921" }, "msg": "请求成功" }
code=10001,msg 为「导入队列已满,请稍后重试」。可通过 GET /health 查看 psd_queue_depth。status=9(处理中)。请用 GET /api/psd/item?sku=xxx 查询进度;status=1 表示可用(含 width/height/slots/preview),status=0 表示导入失败需重新上传。处理完成前不可用该 sku 调用合图接口。上传模板(本地文件) 扩展
multipart/form-data 直接上传 PSD 文件(批量导入用)。返回同 /psd/save(含 preview)。
| 字段 | 类型 | 说明 |
|---|---|---|
| file必传 | file | PSD/PSB 文件 |
| title | string | 自定义标题,留空则取文件名 |
| type | number | 1 / 5 / 9 |
| group_id | number | 归入已有模板组 id(可选) |
| group_name | string | 按组名归入,不存在则自动创建(与 group_id 二选一) |
修改模板 / 自定义标题 PSD
修改模板信息,目前支持自定义标题。
{ "sku": "1712345678901234567", "title": "夏季新款-正面主图" }
生成模板预览图 PSD
(重新)渲染模板缩略预览图并上传对象存储,返回 preview 链接。用于给历史模板补预览。
{ "sku": "1712345678901234567" }
{ "code":10000, "data": { "sku":"...", "preview":"https://.../psd-preview/xxx.jpg" }, "msg":"请求成功" }
模板详情 PSD
| 返回字段 | 说明 |
|---|---|
| sku / title / url / type | 基本信息 |
| preview | 缩略预览图直链(可能为空,可调 /psd/preview 补生成) |
| group_id | 所属模板组 id(null 表示未分组) |
| width / height / size | 宽 / 高 / 文件字节 |
| number / status | 使用次数 / 状态(0 失败 / 1 正常 / 9 处理中) |
| slots | 可替换图层名数组 |
| last_use_date / create_date / update_date | 时间 |
模板列表 PSD
| 参数 | 类型 | 说明 |
|---|---|---|
| page | number | 页码,默认 1 |
| rows | number | 每页条数,默认 20 |
| type | number | 按类型筛选 |
| content | string | 搜索 sku 或 title |
| group_id | number/string | 按组过滤:组 id / "none"(或 0)=未分组 / 不传=全部 |
列表每项含 preview(预览图直链)与 group_id(所属组,null 表示未分组)。
{ "code":10000, "data": { "list":[ ... ], "totalPage":1, "totalRow":2, "curPage":1 }, "msg":"请求成功" }
删除模板 PSD
{ "sku": "1712345678901234567" }
模板组 分组
用于把“一套商品图”(通常 6 个 PSD)归为一组,便于管理与批量套图。组与未分组模板共存——模板可以不属于任何组。以下接口鉴权方式同其它 PSD 接口(X-Api-Key / Bearer / POD_TOKEN)。
新建组。
{ "name": "夏季连衣裙-101", "note": "可选备注" }
{ "code":10000, "data": { "id": 12, "name": "夏季连衣裙-101" }, "msg":"请求成功" }
组列表(含每组模板数量 count)。请求体可为空 {}。
{ "code":10000, "data": { "list": [ { "id":12, "name":"夏季连衣裙-101", "count":6, "note":"", "created_at":"..." } ] }, "msg":"请求成功" }
重命名 / 改备注。
{ "id": 12, "name": "夏季连衣裙-101-改", "note": "新备注" }
删除组,组内模板自动转为“未分组”,不会删除模板。
{ "id": 12 }
把一个或多个模板移入组;group_id 传 0 表示移出分组。
{ "group_id": 12, "skus": ["sku1","sku2","sku3"] }
{ "code":10000, "data": { "moved": 3 }, "msg":"已移动" }
上传素材(获取链接) 素材
multipart/form-data,字段名 files(可多文件,支持整文件夹)。返回 {图层名: URL},文件名去扩展名即图层名,得到的 URL 可直接填入生成接口 data[].content。仅接受 jpg/jpeg/png/webp。
# 例:上传 sucai3.jpg、sucai4.png
{ "code":10000, "data": { "saved": {
"sucai3": "https://psd.elmdesk.com/api/pod/material/sucai3.jpg",
"sucai4": "https://psd.elmdesk.com/api/pod/material/sucai4.png"
}, "count": 2 }, "msg":"请求成功" }
content。生成图片 图片
基于模板 + 图层描述合成图片。合成图上传对象存储后返回图片 sku 与 oss 链接。
| 参数 | 类型 | 说明 |
|---|---|---|
| psd_sku必传 | string | 模板 sku |
| data必传 | array | 图层描述数组,见下 |
| mode | string | 全局填充模式,可选值:auto(默认) / cover / contain / fill / widthAndHeightMax / widthMax / heightMax;data 内 mode 优先。未知值回退 auto。↓ 对照表 |
| callback | string | 异步回调地址(GET 回传结果) |
| xFcInvocationType | string | Sync(默认,同步返回结果) / Async(异步,先返回 sku 再回调) |
| forceDown | number | 1=强制重新下载素材,0=复用缓存(默认) |
| mediaType | string | 输出格式 jpg(默认) / png;png 保留透明通道 |
路径参数::订阅sku(/api/shengchengtu/save/:订阅sku)为可选的业务/订阅标识,会原样回写到结果的 typeSku;不需要时用 /api/shengchengtu/save 即可。
data 数组项(图片替换):
| 字段 | 类型 | 说明 |
|---|---|---|
| name必传 | string | 图层名称,需与 PSD 智能对象图层名一致(字母/数字,字母开头,如 sucai3) |
| content必传 | string | 有效图片链接(jpg/jpeg/png/webp) |
| mode | string | 该图层单独的填充模式(可选值同上),优先级高于全局 mode |
data 数组项(文字替换):
| 字段 | 类型 | 说明 |
|---|---|---|
| name必传 | string | 文字槽图层名(文字图层或文字型智能对象) |
| text必传 | string | 替换后的文字内容(支持 \n 换行) |
| font | string | 字体文件链接(ttf/otf)。缺省时回退模板导入时登记的默认字体;两者都没有则该项失败 |
text → 文字替换;content 是 http(s) 链接 → 图片替换;content 是非链接纯文本 → 也按文字替换处理。字号、颜色、描边、投影、弧排等版式自动继承 PSD 原文字图层样式。{
"psd_sku": "1712345678901234567",
"data": [
{ "name": "sucai", "content": "https://your.com/a.jpg" },
{ "name": "sucai2", "content": "https://your.com/b.jpg", "mode": "cover" },
{ "name": "sucai3", "text": "Emely", "font": "https://your.com/font.ttf" }
],
"callback": "https://your.com/cb"
}
同步返回:
{ "code":10000, "data": { "success":1, "msg":"操作成功", "sku":"1712...816",
"oss":"https://elmdeskpsd.oss-cn-hangzhou.aliyuncs.com/shengchengtu/20260701/xxx.jpg",
"downUrl":"https://elmdeskpsd.oss-cn-hangzhou.aliyuncs.com/shengchengtu/20260701/xxx.jpg",
"fileName":"xxx.jpg", "relative":"/xxx.jpg",
"dpi":300, "fsize":349678, "width":1000, "height":1000 }, "msg":"请求成功" }
| 字段 | 说明 |
|---|---|
| sku | 图片 SKU(后续查询/对账用) |
| oss / downUrl | 生成图对象存储直链(二者相同) |
| fileName / relative | OSS 对象文件名 / 相对路径 |
| dpi | 写入 JPEG/PNG 的分辨率元数据(当前默认 300,与 Fox 新图一致) |
| fsize | 文件字节数 |
| width / height | 像素宽高(合成画布尺寸) |
xFcInvocationType=Async 时先返回 sku(返回前仍会下载素材),合成完成后向 callback 发 GET 请求。需要毫秒级受理 + 后台队列时请改用 submit 接口。code=10002):同步接口在高并发下若排队超过约 20s 仍拿不到合成名额(或内存紧张),会快速返回 { "code":10002, "data":{ "retry":true, "suggest":"submit" }, "msg":"服务繁忙,请稍后重试或改用异步接口 /api/shengchengtu/submit" } 而不再让连接一直挂起。调用方收到 10002 应退避重试(如 1-3s 后重试,避免立即高频重打),批量场景直接改走 submit 异步接口。这与「合成失败」code=10001 语义不同:10002 是暂时性繁忙、原样重试即可成功。生成图片(纯异步 submit) 推荐
纯异步合图:毫秒级受理返回 sku,下载素材/合成/上传在后台队列执行。请求体与 /api/shengchengtu/save 相同(psd_sku、data、callback、mode、forceDown、mediaType),不需要 xFcInvocationType。
{ "code":10000, "data": { "success":1, "sku":"1783579695159834921" }, "msg":"请求成功" }
GET /api/shengchengtu/item?sku=xxx,status=9 处理中 / 1 成功 / 0 失败。callback 发 GET,参数:oss、sku、msg、code、dpi、fsize、width、height(与 save 异步回调一致)。code=10001,msg 为「合图队列已满,请稍后重试」。可通过 GET /health 查看 render_queue_depth。合图模式对照
| 方式 | 接口 | HTTP 返回时机 | 是否走队列 | 适用 |
|---|---|---|---|---|
| 同步(默认) | POST /api/shengchengtu/save | 合成完成后返回 oss | 否(直连进程池) | 单张、需立即拿图 |
| legacy 异步 | save + xFcInvocationType=Async | 下载素材后返回 sku | 否 | 兼容旧调用方 |
| 纯异步 submit | POST /api/shengchengtu/submit | 毫秒级返回 sku | 是 | 大批量、避免 HTTP 阻塞 |
save;批量 / 高频 / 大模板(多图层、大画布)→ 请用异步 submit:毫秒受理返回 sku,再用 GET /api/shengchengtu/item?sku= 轮询(status 9 处理中 / 1 成功 / 0 失败)或等 callback 回调取图。同步接口在过载时会返回 code=10002 忙响应,批量任务若继续走同步易被限流;异步走后台队列,天然削峰、不阻塞 HTTP、也不会触发 10002。图片详情 图片
| 返回字段 | 说明 |
|---|---|
| sku / psd_sku / business_goods_type_sku | 图片/模板/订阅 sku |
| size | 生成图字节数(同 fsize) |
| dpi / fsize / width / height | 分辨率元数据、文件大小、像素宽高(与同步返回一致) |
| posts | 请求体(data 的 JSON 字符串) |
| callback / oss / downUrl | 回调地址 / 图片链接 |
| results | 结果原始集合(JSON 字符串) |
| status | 0 失败 / 1 正常 / 9 待生成 |
| shengchengshijian_date / create_date | 生成/创建时间 |
图片列表 图片
参数 page / rows / content(搜索 图片sku / psd_sku / 订阅sku)。返回 list / totalPage / totalRow / curPage。
填充模式对照
下列所有取值都可用于全局 mode 或 data 项内的 mode;大小写不敏感,未知值一律回退 auto。
| mode 取值 | 含义 | 实际效果 |
|---|---|---|
auto默认 | 不传时的默认策略 | = cover:铺满并居中裁切,套图效果最佳,无需人工逐套选择 |
cover | 铺满不留白 | 按较长边缩放铺满目标框,超出部分居中裁切(保持比例) |
contain | 完整显示 | 按较短边缩放使素材完整可见,不裁切、不拉伸(可能留白) |
fill | 拉伸铺满 | 宽高分别拉伸至目标框,铺满但可能变形 |
widthAndHeightMax | 兼容别名 | 等价 fill(按宽高拉伸) |
widthMax / heightMax | 兼容别名 | 等价 cover(按单边最大值) |