Using Adobe Fonts with Photoshop API v2
Photoshop API v2 supports rendering text layers using fonts from the Adobe Fonts library. This lets you reference fonts by PostScript name directly in your API request without uploading or hosting font files yourself. Font access is resolved automatically through your Adobe entitlement.
Prerequisites
- A valid Firefly Services API key and access token
- An Adobe entitlement that includes Adobe Fonts access
- A Fonts product profile configured in the Adobe Admin Console and added to your credential in the Adobe Developer Console
- A PSD file with one or more text layers
Admin Console setup
Before you can use Adobe Fonts in API calls, your organization must have a Fonts service enabled on a product profile in the Adobe Admin Console, and that profile must be associated with your API credential.
Step 1: Create a product profile with Fonts enabled
- Sign in to the Adobe Admin Console
- Go to Products and select Firefly Creative Production for Enterprise
- Click New profile and follow the setup steps
- On the Enable services step, ensure the Fonts toggle is turned on
- Click Save
For detailed instructions on creating product profiles, see Create product profiles.
Step 2: Add the product profile to your project in Developer Console
- Sign in to the Adobe Developer Console
- Open your project. You will land on the project overview page showing your products and credentials
- Under Products & services, click the Photoshop API - Firefly Services title to open the API detail page
- On the API detail page, click Edit product profiles
- Add the Fonts-enabled profile you created in Step 1 and save
Once the profile is linked to your project, API calls made with that credential will have access to Adobe Fonts.
How it works
When your request includes a font PostScript name in fontOptions or characterStyles, the service resolves the font through Adobe Fonts at render time. No file URL is required. If the font cannot be resolved because the PostScript name is incorrect or the font is not covered by your entitlement, the job will fail or fall back to a default font depending on your missingFontStrategy setting.
Request structure
Use the fontOptions object to specify the font at the document level, and reference the same PostScript name in characterStyles at the layer level.
{
"image": {
"source": {
"url": "https://your-storage.example.com/input.psd"
}
},
"fontOptions": {
"defaultFontPostScriptName": "Aboreto-Regular",
"missingFontStrategy": "fail"
},
"edits": {
"layers": [
{
"name": "Your Text Layer Name",
"type": "text_layer",
"operation": {
"type": "edit"
},
"text": {
"content": "Hello from Adobe Fonts",
"characterStyles": [
{
"characterStyle": {
"font": { "postScriptName": "Aboreto-Regular" },
"fontSize": 48
}
}
]
}
}
]
},
"outputs": [
{
"mediaType": "image/jpeg",
"destination": {
"validityPeriod": 3600
}
}
]
}
fontOptions reference
defaultFontPostScriptNamemissingFontStrategyfail returns an error. use_default silently substitutes a fallback font.additionalFontsFinding a font's PostScript name
PostScript names follow the pattern FamilyName-Weight, for example AdobeCaslon-Regular or SourceSans3-Bold.
To find the PostScript name for a specific font:
- Go to fonts.adobe.com
- Browse or search for the font family you want
- Click into a specific style (Regular, Bold, Italic, etc.)
- The PostScript name is listed on the font detail page under the Details tab
Submitting a request
Submit the job:
curl -X POST "https://photoshop-api.adobe.io/v2/create-composite" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"image": {
"source": {
"url": "https://your-storage.example.com/input.psd"
}
},
"fontOptions": {
"defaultFontPostScriptName": "Aboreto-Regular",
"missingFontStrategy": "fail"
},
"edits": {
"layers": [
{
"name": "Your Text Layer Name",
"type": "text_layer",
"operation": {
"type": "edit"
},
"text": {
"content": "Hello from Adobe Fonts",
"characterStyles": [
{
"characterStyle": {
"font": { "postScriptName": "Aboreto-Regular" },
"fontSize": 48
}
}
]
}
}
]
},
"outputs": [
{
"mediaType": "image/jpeg",
"destination": {
"validityPeriod": 3600
}
}
]
}'
A successful submission returns a 202 response with a jobId and statusUrl:
{
"jobId": "a619b1bd-75c8-427f-9660-61b23d2b8dc4",
"statusUrl": "https://photoshop-api.adobe.io/v2/status/a619b1bd-75c8-427f-9660-61b23d2b8dc4"
}
Poll for status using the statusUrl from the response:
curl -X GET "https://photoshop-api.adobe.io/v2/status/YOUR_JOB_ID" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "X-Api-Key: YOUR_API_KEY"
A completed job returns a succeeded status with an output URL:
{
"jobId": "a619b1bd-75c8-427f-9660-61b23d2b8dc4",
"status": "succeeded",
"result": {
"outputs": [
{
"mediaType": "image/jpeg",
"destination": {
"url": "https://photoshop-api.adobe.io/v2/short-url/..."
}
}
]
}
}
Error handling
validation_error Missing required field type"type": "text_layer". Add it alongside the operation field.unauthorized_forbiddenmissingFontStrategy: "fail" to surface this as an explicit error rather than a silent fallback.Using custom fonts
If you need a font that is not in the Adobe Fonts library, supply it as a file reference in additionalFonts. The font file must be accessible via a pre-signed URL.
"fontOptions": {
"additionalFonts": [
{
"source": {
"url": "https://your-storage.example.com/fonts/CustomFont-Regular.ttf"
}
}
],
"defaultFontPostScriptName": "CustomFont-Regular",
"missingFontStrategy": "fail"
}
Supported font formats are TTF and OTF. The PostScript name you reference must match the name embedded in the font file itself.