PodPSD 合成 API 文档

参数风格兼容主流 PSD 合成服务,便于迁移。基址:https://psd.elmdesk.com/api

基本说明

所有接口均为标准 HTTP 请求,请求体为 JSON(文件上传接口除外),响应为 JSON。支持图片替换文字替换text + font,见「生成图片」)。

替换按图层名匹配:请求 data 里的 name 需与 PSD 中智能对象/文字图层名一致(字母/数字,字母开头)。未提供替换的图层会回退显示其原内容
超时建议:单次合成服务端墙钟上限 180 秒(超时返回失败);同步调用请把客户端 HTTP 超时设为 ≥120 秒。大批量请使用纯异步 POST /api/shengchengtu/submit(毫秒级受理)+ 回调/轮询取结果。

身份验证

三种鉴权方式任选其一,放入请求 Header:

方式Header适用场景
API Key(推荐)X-Api-Key: pod_live_xxxxxxxx对外/程序化调用,按租户计费。控制台「API Key」处创建
会话 JWTAuthorization: Bearer <jwt>网页控制台 / 管理后台(登录后自动携带)
内部 TokenAuthorization: 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操作失败(参数错误/权限/合成失败/队列已满等)
10002token 失效

上传模板 PSD

POST/api/psd/save

通过 http 链接上传 PSD 模板。异步受理:接口立即返回模板 sku,系统在后台下载、解析尺寸与智能对象槽位、上传对象存储并生成预览图。

参数类型说明
title必传string模板标题(自定义,用于列表快速识别)
url必传stringPSD 的 http 下载链接(有效文件)
typenumber1=500 / 5=1800 / 9=10000,仅用于筛选
{ "title": "T恤正面", "url": "https://your.com/muban.psd", "type": 5 }
{ "code": 10000, "data": { "sku": "1783579695159834921" }, "msg": "请求成功" }
队列:受理后任务进入后台导入队列(默认最多 500 条待处理)。队列满时返回 code=10001msg 为「导入队列已满,请稍后重试」。可通过 GET /health 查看 psd_queue_depth
轮询:受理后模板 status=9(处理中)。请用 GET /api/psd/item?sku=xxx 查询进度;status=1 表示可用(含 width/height/slots/preview),status=0 表示导入失败需重新上传。处理完成前不可用该 sku 调用合图接口。

上传模板(本地文件) 扩展

POST/api/psd/upload_file

multipart/form-data 直接上传 PSD 文件(批量导入用)。返回同 /psd/save(含 preview)。

字段类型说明
file必传filePSD/PSB 文件
titlestring自定义标题,留空则取文件名
typenumber1 / 5 / 9
group_idnumber归入已有模板组 id(可选)
group_namestring按组名归入,不存在则自动创建(与 group_id 二选一)

修改模板 / 自定义标题 PSD

POST/api/psd/update

修改模板信息,目前支持自定义标题。

{ "sku": "1712345678901234567", "title": "夏季新款-正面主图" }

生成模板预览图 PSD

POST/api/psd/preview

(重新)渲染模板缩略预览图并上传对象存储,返回 preview 链接。用于给历史模板补预览。

{ "sku": "1712345678901234567" }
{ "code":10000, "data": { "sku":"...", "preview":"https://.../psd-preview/xxx.jpg" }, "msg":"请求成功" }

模板详情 PSD

GET/api/psd/item?sku=xxx
返回字段说明
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

POST/api/psd/index
参数类型说明
pagenumber页码,默认 1
rowsnumber每页条数,默认 20
typenumber按类型筛选
contentstring搜索 sku 或 title
group_idnumber/string按组过滤:组 id / "none"(或 0)=未分组 / 不传=全部

列表每项含 preview(预览图直链)与 group_id(所属组,null 表示未分组)。

{ "code":10000, "data": { "list":[ ... ], "totalPage":1, "totalRow":2, "curPage":1 }, "msg":"请求成功" }

删除模板 PSD

POST/api/psd/delete
{ "sku": "1712345678901234567" }

模板组 分组

用于把“一套商品图”(通常 6 个 PSD)归为一组,便于管理与批量套图。组与未分组模板共存——模板可以不属于任何组。以下接口鉴权方式同其它 PSD 接口(X-Api-Key / Bearer / POD_TOKEN)。

POST/api/psd/group/create

新建组。

{ "name": "夏季连衣裙-101", "note": "可选备注" }
{ "code":10000, "data": { "id": 12, "name": "夏季连衣裙-101" }, "msg":"请求成功" }
POST/api/psd/group/index

组列表(含每组模板数量 count)。请求体可为空 {}

{ "code":10000, "data": { "list": [ { "id":12, "name":"夏季连衣裙-101", "count":6, "note":"", "created_at":"..." } ] }, "msg":"请求成功" }
POST/api/psd/group/update

重命名 / 改备注。

{ "id": 12, "name": "夏季连衣裙-101-改", "note": "新备注" }
POST/api/psd/group/delete

删除组,组内模板自动转为“未分组”,不会删除模板。

{ "id": 12 }
POST/api/psd/group/assign

把一个或多个模板移入组;group_id 传 0 表示移出分组。

{ "group_id": 12, "skus": ["sku1","sku2","sku3"] }
{ "code":10000, "data": { "moved": 3 }, "msg":"已移动" }

上传素材(获取链接) 素材

POST/api/pod/upload_material

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

生成图片 图片

POST/api/shengchengtu/save/:订阅sku

基于模板 + 图层描述合成图片。合成图上传对象存储后返回图片 skuoss 链接。

参数类型说明
psd_sku必传string模板 sku
data必传array图层描述数组,见下
modestring全局填充模式,可选值:auto(默认) / cover / contain / fill / widthAndHeightMax / widthMax / heightMaxdata 内 mode 优先。未知值回退 auto↓ 对照表
callbackstring异步回调地址(GET 回传结果)
xFcInvocationTypestringSync(默认,同步返回结果) / Async(异步,先返回 sku 再回调)
forceDownnumber1=强制重新下载素材,0=复用缓存(默认)
mediaTypestring输出格式 jpg(默认) / png;png 保留透明通道

路径参数::订阅sku/api/shengchengtu/save/:订阅sku)为可选的业务/订阅标识,会原样回写到结果的 typeSku;不需要时用 /api/shengchengtu/save 即可。

data 数组项(图片替换):

字段类型说明
name必传string图层名称,需与 PSD 智能对象图层名一致(字母/数字,字母开头,如 sucai3
content必传string有效图片链接(jpg/jpeg/png/webp)
modestring该图层单独的填充模式(可选值同上),优先级高于全局 mode

data 数组项(文字替换):

字段类型说明
name必传string文字槽图层名(文字图层或文字型智能对象)
text必传string替换后的文字内容(支持 \n 换行)
fontstring字体文件链接(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 / relativeOSS 对象文件名 / 相对路径
dpi写入 JPEG/PNG 的分辨率元数据(当前默认 300,与 Fox 新图一致)
fsize文件字节数
width / height像素宽高(合成画布尺寸)
legacy 异步: xFcInvocationType=Async 时先返回 sku(返回前仍会下载素材),合成完成后向 callbackGET 请求。需要毫秒级受理 + 后台队列时请改用 submit 接口
过载忙响应(code=10002):同步接口在高并发下若排队超过约 20s 仍拿不到合成名额(或内存紧张),会快速返回 { "code":10002, "data":{ "retry":true, "suggest":"submit" }, "msg":"服务繁忙,请稍后重试或改用异步接口 /api/shengchengtu/submit" } 而不再让连接一直挂起。调用方收到 10002退避重试(如 1-3s 后重试,避免立即高频重打),批量场景直接改走 submit 异步接口。这与「合成失败」code=10001 语义不同:10002 是暂时性繁忙、原样重试即可成功。

生成图片(纯异步 submit) 推荐

POST/api/shengchengtu/submit/:订阅sku

纯异步合图:毫秒级受理返回 sku,下载素材/合成/上传在后台队列执行。请求体与 /api/shengchengtu/save 相同(psd_skudatacallbackmodeforceDownmediaType),不需要 xFcInvocationType

{ "code":10000, "data": { "success":1, "sku":"1783579695159834921" }, "msg":"请求成功" }
轮询:GET /api/shengchengtu/item?sku=xxxstatus=9 处理中 / 1 成功 / 0 失败。
回调:完成后向 callbackGET,参数:oss、sku、msg、code、dpi、fsize、width、height(与 save 异步回调一致)。
队列:合图队列满时返回 code=10001msg 为「合图队列已满,请稍后重试」。可通过 GET /health 查看 render_queue_depth

合图模式对照

方式接口HTTP 返回时机是否走队列适用
同步(默认)POST /api/shengchengtu/save合成完成后返回 oss否(直连进程池)单张、需立即拿图
legacy 异步save + xFcInvocationType=Async下载素材后返回 sku兼容旧调用方
纯异步 submitPOST /api/shengchengtu/submit毫秒级返回 sku大批量、避免 HTTP 阻塞
选型建议:单张、需页面即时预览 → 同步 save批量 / 高频 / 大模板(多图层、大画布)→ 请用异步 submit:毫秒受理返回 sku,再用 GET /api/shengchengtu/item?sku= 轮询(status 9 处理中 / 1 成功 / 0 失败)或等 callback 回调取图。同步接口在过载时会返回 code=10002 忙响应,批量任务若继续走同步易被限流;异步走后台队列,天然削峰、不阻塞 HTTP、也不会触发 10002。

图片详情 图片

GET/api/shengchengtu/item?sku=xxx
返回字段说明
sku / psd_sku / business_goods_type_sku图片/模板/订阅 sku
size生成图字节数(同 fsize
dpi / fsize / width / height分辨率元数据、文件大小、像素宽高(与同步返回一致)
posts请求体(data 的 JSON 字符串)
callback / oss / downUrl回调地址 / 图片链接
results结果原始集合(JSON 字符串)
status0 失败 / 1 正常 / 9 待生成
shengchengshijian_date / create_date生成/创建时间

图片列表 图片

POST/api/shengchengtu/index

参数 page / rows / content(搜索 图片sku / psd_sku / 订阅sku)。返回 list / totalPage / totalRow / curPage

填充模式对照

下列所有取值都可用于全局 modedata 项内的 mode;大小写不敏感,未知值一律回退 auto

mode 取值含义实际效果
auto默认不传时的默认策略= cover:铺满并居中裁切,套图效果最佳,无需人工逐套选择
cover铺满不留白按较长边缩放铺满目标框,超出部分居中裁切(保持比例)
contain完整显示按较短边缩放使素材完整可见,不裁切、不拉伸(可能留白)
fill拉伸铺满宽高分别拉伸至目标框,铺满但可能变形
widthAndHeightMax兼容别名等价 fill(按宽高拉伸)
widthMax / heightMax兼容别名等价 cover(按单边最大值)
在线测试页:/tool · Swagger:/docs