{ "openapi": "3.0.0", "info": { "title": "GenStudio API", "description": "API for Adobe GenStudio for Performance Marketing users to retrieve approved GenStudio experiences.", "version": "20260526T234229Z", "license": { "name": "Adobe Proprietary", "url": "https://www.adobe.com/legal/terms.html" } }, "components": { "schemas": { "Channel": { "type": "string", "enum": [ "email", "meta", "meta_organic", "display", "ctv", "linkedin", "linkedin_organic", "tiktok", "chatgpt", "youtube" ] }, "FieldValue": { "type": "object", "properties": { "value": { "type": "string" } }, "required": ["value"], "additionalProperties": false }, "Unauthorized": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Unauthorized. Indicates that the request has not been applied because it lacks valid authentication credentials for the target resource." }, "Forbidden": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Forbidden. Indicates that the server understood the request but refuses to fulfil it." }, "NotFound": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Not Found. Indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists." }, "NotAcceptable": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Not Acceptable. Indicates that the target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request." }, "TooManyRequests": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Too Many Requests. Indicates that the user has sent too many requests in a given amount of time (\"rate limiting\")." }, "ServiceUnavailable": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Service Unavailable. Indicates that the server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay." } }, "securitySchemes": { "OAuth2": { "type": "oauth2", "flows": { "clientCredentials": { "tokenUrl": "https://ims-na1.adobelogin.com/ims/token/v3", "scopes": {} } } }, "ApiKey": { "type": "apiKey", "in": "header", "name": "x-api-key" } } }, "paths": { "/experiences/{experienceId}": { "get": { "operationId": "getExperience", "summary": "Get Experience", "description": "Retrieves a single experience by ID, including all fields, variants, and asset URLs.\n\nSupports conditional requests via the `If-None-Match` header. If the provided ETag matches, returns `304 Not Modified` with no body.\n\n**Backward compatibility**: New optional fields may be added to the response at any time. Clients must tolerate unknown properties.\n\n**Rate limit**: 60 requests per minute per organization.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "example": "urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6" }, "in": "path", "name": "experienceId", "required": true, "description": "GenStudio experience URN." }, { "schema": { "type": "string", "example": "Bearer eyJhbGciOiJSUz..." }, "in": "header", "name": "authorization", "required": true, "description": "Bearer token from Adobe OAuth Server-to-Server credentials" }, { "schema": { "type": "string", "example": "37e7532f1c5a225acf8d2fad131cde8d" }, "in": "header", "name": "x-api-key", "required": true, "description": "Client ID from the Adobe Developer Console project" }, { "schema": { "type": "string", "example": "36031A56669DEACD0A49402F@AdobeOrg" }, "in": "header", "name": "x-ims-org-id", "required": true, "description": "IMS Organization ID (format: {HEX}@AdobeOrg). Found in Adobe Developer Console: open your project, then Credentials → OAuth Server-to-Server → Credential Details → Organization ID." }, { "schema": { "type": "string", "example": "550e8400-e29b-41d4-a716-446655440000" }, "in": "header", "name": "x-request-id", "required": false, "description": "Client-generated UUID for request tracing" }, { "schema": { "type": "string", "example": "corr-abc-123" }, "in": "header", "name": "x-correlation-id", "required": false, "description": "Correlation ID to group related requests" } ], "responses": { "200": { "description": "The full experience object", "content": { "application/json": { "schema": { "type": "object", "properties": { "experienceId": { "type": "string" }, "createdAt": { "type": "string", "format": "date-time" }, "modifiedAt": { "type": "string", "format": "date-time" }, "title": { "type": "string" }, "channel": { "anyOf": [ { "$ref": "#/components/schemas/Channel" }, { "type": "string" } ] }, "externalTemplateSource": { "type": "string" }, "externalTemplateId": { "type": "string" }, "externalTemplateMetadata": { "type": "object", "additionalProperties": {} }, "externalAssetMetadata": { "type": "object", "additionalProperties": {} }, "keywords": { "type": "array", "items": { "type": "string" } }, "prompt": { "type": "string" }, "brands": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "personas": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "products": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "campaigns": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "language": { "type": "array", "items": { "type": "string" } }, "variants": { "type": "array", "items": { "type": "object", "properties": { "variantKey": { "type": "string" }, "aspectRatio": { "type": "string" }, "channel": { "anyOf": [ { "$ref": "#/components/schemas/Channel" }, { "type": "string" } ] }, "isMain": { "type": "boolean" }, "asset": { "type": "object", "properties": { "assetId": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "mimeType": { "type": "string" } }, "required": ["url"], "additionalProperties": false }, "fields": { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/FieldValue" } }, "sections": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "fields": { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/FieldValue" } }, "assets": { "type": "array", "items": { "type": "object", "properties": { "fieldReference": { "type": "string" }, "assetId": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "mimeType": { "type": "string" } }, "required": ["fieldReference"], "additionalProperties": false } } }, "required": ["name", "fields"], "additionalProperties": false } }, "assets": { "type": "array", "items": { "type": "object", "properties": { "fieldReference": { "type": "string" }, "assetId": { "type": "string" }, "url": { "type": "string", "format": "uri" }, "mimeType": { "type": "string" } }, "required": ["fieldReference"], "additionalProperties": false } } }, "required": ["variantKey", "channel", "isMain", "fields"], "additionalProperties": false } } }, "required": [ "experienceId", "createdAt", "modifiedAt", "title", "channel", "keywords", "prompt", "brands", "personas", "products", "campaigns", "language", "variants" ], "additionalProperties": false, "description": "The full experience object" }, "example": { "experienceId": "urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6", "createdAt": "2026-02-16T16:30:00.000Z", "modifiedAt": "2026-02-16T16:30:00.000Z", "title": "Summer Campaign - LinkedIn", "channel": "linkedin", "keywords": ["image", "text"], "prompt": "Create LinkedIn ads with a catchy headline, benefit-focused copy, and a clear call to action.", "brands": [ { "name": "Acme" } ], "personas": [ { "name": "Active Lifestyle Enthusiast" } ], "products": [ { "name": "Trail Runner Pro" } ], "campaigns": [], "language": ["en_US"], "variants": [ { "variantKey": "Variant_linkedin_4x5_0", "aspectRatio": "4:5", "channel": "linkedin", "isMain": true, "asset": { "assetId": "Variant_linkedin_4x5_0.chromeless.gsthumbnail.mp4", "url": "https://genstudio.adobe.io/experiences/urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6/assets/Variant_linkedin_4x5_0.chromeless.gsthumbnail.mp4", "mimeType": "video/mp4" }, "fields": { "headline": { "value": "Bold colors, clean lines — designed for everyday momentum." }, "cta_text": { "value": "Shop Now" } }, "sections": [ { "name": "pod1", "fields": { "headline": { "value": "Pod 1 Title" }, "body": { "value": "Pod 1 Body copy here" } }, "assets": [ { "fieldReference": "pod1_image", "assetId": "urn:aaid:aem:62d4408b-13cb-4d41-8c6f-127fb2cad067", "url": "https://genstudio.adobe.io/experiences/urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6/assets/urn:aaid:aem:62d4408b-13cb-4d41-8c6f-127fb2cad067" } ] } ], "assets": [] }, { "variantKey": "Variant_linkedin_1x1_1", "aspectRatio": "1:1", "channel": "linkedin", "isMain": false, "fields": { "headline": { "value": "Summer deals — don't miss out" }, "cta_text": { "value": "Learn More" } }, "assets": [] } ] } } } }, "304": { "description": "Not Modified" }, "401": { "description": "Unauthorized. Indicates that the request has not been applied because it lacks valid authentication credentials for the target resource.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Unauthorized" } } } }, "403": { "description": "Forbidden. Indicates that the server understood the request but refuses to fulfil it.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Forbidden" } } } }, "404": { "description": "Not Found. Indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/NotFound" } } } }, "406": { "description": "Not Acceptable. Indicates that the target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/NotAcceptable" } } } }, "429": { "description": "Too Many Requests. Indicates that the user has sent too many requests in a given amount of time (\"rate limiting\").", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/TooManyRequests" } } } } } } }, "/experiences": { "get": { "operationId": "listExperiences", "summary": "List Experiences", "description": "Returns a paginated list of Experience summaries filtered by query parameters.\n\nSupports Cursor-based pagination via the `cursor` parameter. Use the `cursor` value from the previous response to retrieve the next page.\n\nSupports conditional requests via the `If-None-Match` header. If the provided ETag matches, returns `304 Not Modified` with no body.\n\n**Filters** (OR semantics within each): `language`, `channel`, `createdAtFrom`, `createdAtTo`.\n\n**Backward compatibility**: New optional fields may be added to items in the response at any time. Clients must tolerate unknown properties.\n\n**Rate limit**: 20 requests per minute per organization.", "parameters": [ { "schema": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ], "example": "en_US" }, "in": "query", "name": "language", "required": false, "description": "Filter by BCP 47 language tag." }, { "schema": { "anyOf": [ { "$ref": "#/components/schemas/Channel" }, { "type": "array", "items": { "$ref": "#/components/schemas/Channel" } } ], "example": "meta" }, "in": "query", "name": "channel", "required": false, "description": "Filter by channel. Accepted values: email, meta, meta_organic, display, ctv, linkedin, linkedin_organic, tiktok, chatgpt, youtube. Unknown values return 400." }, { "schema": { "type": "string", "format": "date-time", "example": "2026-01-01T00:00:00.000Z" }, "in": "query", "name": "createdAtFrom", "required": false, "description": "Inclusive lower bound (ISO 8601) on createdAt." }, { "schema": { "type": "string", "format": "date-time", "example": "2026-12-31T23:59:59.000Z" }, "in": "query", "name": "createdAtTo", "required": false, "description": "Exclusive upper bound (ISO 8601) on createdAt. Must be strictly greater than createdAtFrom." }, { "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 25, "example": 25 }, "in": "query", "name": "limit", "required": false, "description": "Maximum number of items per page (1–50)." }, { "schema": { "type": "string", "minLength": 1, "example": "eyJsYXN0SWQiOiJ1cm46YWFpZDphZW0ifQ" }, "in": "query", "name": "cursor", "required": false, "description": "Opaque cursor from the previous response's `cursor` field." }, { "schema": { "type": "string", "example": "Bearer eyJhbGciOiJSUz..." }, "in": "header", "name": "authorization", "required": true, "description": "Bearer token from Adobe OAuth Server-to-Server credentials" }, { "schema": { "type": "string", "example": "37e7532f1c5a225acf8d2fad131cde8d" }, "in": "header", "name": "x-api-key", "required": true, "description": "Client ID from the Adobe Developer Console project" }, { "schema": { "type": "string", "example": "36031A56669DEACD0A49402F@AdobeOrg" }, "in": "header", "name": "x-ims-org-id", "required": true, "description": "IMS Organization ID (format: {HEX}@AdobeOrg). Found in Adobe Developer Console: open your project, then Credentials → OAuth Server-to-Server → Credential Details → Organization ID." }, { "schema": { "type": "string", "example": "550e8400-e29b-41d4-a716-446655440000" }, "in": "header", "name": "x-request-id", "required": false, "description": "Client-generated UUID for request tracing" }, { "schema": { "type": "string", "example": "corr-abc-123" }, "in": "header", "name": "x-correlation-id", "required": false, "description": "Correlation ID to group related requests" } ], "responses": { "200": { "description": "Paginated list of Experience summaries", "content": { "application/json": { "schema": { "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "experienceId": { "type": "string" }, "createdAt": { "type": "string", "format": "date-time" }, "modifiedAt": { "type": "string", "format": "date-time" }, "title": { "type": "string" }, "channel": { "anyOf": [ { "$ref": "#/components/schemas/Channel" }, { "type": "string" } ] }, "externalTemplateSource": { "type": "string" }, "externalTemplateId": { "type": "string" }, "externalTemplateMetadata": { "type": "object", "additionalProperties": {} }, "externalAssetMetadata": { "type": "object", "additionalProperties": {} }, "keywords": { "type": "array", "items": { "type": "string" } }, "prompt": { "type": "string" }, "brands": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "personas": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "products": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "campaigns": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "language": { "type": "array", "items": { "type": "string" } } }, "required": [ "experienceId", "createdAt", "modifiedAt", "title", "channel", "keywords", "prompt", "brands", "personas", "products", "campaigns", "language" ], "additionalProperties": false } }, "cursor": { "type": "string" }, "total": { "type": "number" } }, "required": ["items", "total"], "additionalProperties": false, "description": "Paginated list of Experience summaries" }, "example": { "items": [ { "experienceId": "urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6", "createdAt": "2026-02-16T16:30:00.000Z", "modifiedAt": "2026-02-16T16:30:00.000Z", "title": "Summer Campaign - LinkedIn", "channel": "linkedin", "keywords": ["image", "text"], "prompt": "Create LinkedIn ads with a catchy headline, benefit-focused copy, and a clear call to action.", "brands": [ { "name": "Acme" } ], "personas": [ { "name": "Active Lifestyle Enthusiast" } ], "products": [ { "name": "Trail Runner Pro" } ], "campaigns": [], "language": ["en_US"] }, { "experienceId": "urn:aaid:aem:5b40812f-71f7-430e-8e6e-1f33bb63d252", "createdAt": "2026-03-01T09:15:00.000Z", "modifiedAt": "2026-03-01T09:15:00.000Z", "title": "Spring Email Blast", "channel": "email", "keywords": ["promotional", "seasonal"], "prompt": "Design a spring promotional email with seasonal imagery and a compelling offer.", "brands": [ { "name": "Acme" }, { "name": "Pinnacle" } ], "personas": [ { "name": "Marketer" } ], "products": [ { "name": "Trail Runner Pro" } ], "campaigns": [], "language": ["en_US"] } ], "cursor": "eyJsYXN0SWQiOiJ1cm46YWFpZDphZW06NWI0MDgxMmYifQ", "total": 42 } } } }, "304": { "description": "Not Modified" }, "400": { "description": "Bad Request. Indicates that the server cannot process the request due to something that is perceived to be a client error (e.g. invalid query parameters or createdAtFrom >= createdAtTo).", "content": { "application/problem+json": { "schema": { "type": "object", "properties": { "type": { "type": "string", "minLength": 1, "description": "A URI reference [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) to a URL, which, when dereferenced, provides human readable documentation for the problem type. The problem type may be equivalent to the `status` or may be a \"sub-type\". This URI is not intended to be parsed by clients; rather it should be treated as an opaque string that uniquely represents the error condition as-is." }, "title": { "type": "string", "minLength": 1, "description": "A short, human-readable summary of the problem type." }, "status": { "type": "integer", "description": "The HTTP status code ([RFC9110], Section 15) generated by the origin server for this occurrence of the problem." }, "detail": { "type": "string", "minLength": 1, "description": "A human-readable explanation specific to this occurrence of the problem." }, "requestId": { "type": "string", "minLength": 1, "description": "A unique identifier that is assigned to the request, either by the API caller or by the service itself." } }, "required": ["type", "title", "status", "detail"], "additionalProperties": false, "description": "Bad Request. Indicates that the server cannot or will not process the request due to something that is perceived to be a client error. The Problem Details object will provide more information about the exact cause." } } } }, "401": { "description": "Unauthorized. Indicates that the request has not been applied because it lacks valid authentication credentials for the target resource.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Unauthorized" } } } }, "403": { "description": "Forbidden. Indicates that the server understood the request but refuses to fulfil it.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Forbidden" } } } }, "406": { "description": "Not Acceptable. Indicates that the target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/NotAcceptable" } } } }, "429": { "description": "Too Many Requests. Indicates that the user has sent too many requests in a given amount of time (\"rate limiting\").", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/TooManyRequests" } } } } } } }, "/experiences/{experienceId}/assets/{assetId}": { "get": { "operationId": "getExperienceAsset", "summary": "Get Experience Asset", "description": "Returns a **302 redirect** to a short-lived pre-signed URL for the requested asset. The 302 is the expected success response — there is no 200 body.\n\nThe client's HTTP library follows the redirect automatically. Each call issues a fresh redirect with a new token.\n\n**Locating the `assetId`**: Use the asset `url` fields returned by `GET /experiences/:id`. Each URL ends with the `assetId` to pass here. The `assetId` must belong to the given `experienceId` — passing an asset from a different experience returns 404.\n\n**Accepted `assetId` formats**:\n- Asset URN: `urn:aaid:aem:62d4408b-13cb-4d41-8c6f-127fb2cad067`\n- Composite asset reference (org + account + URN): `36031A56669DEACD0A49402F@AdobeOrg;acct:aem-cmstg-p106653-e326705@adobe.com;urn:aaid:aem:f773c9cf-7bf1-4986-a4ac-7e9a6d209a1b`\n- Variant rendition name: `Variant_meta_1x1.chromeless.gsthumbnail.mp4`\n\n**Response headers on 302**: `Location` (signed URL, valid up to 60 minutes), `X-Asset-Mime-Type`, `Cache-Control: no-store`.\n\n**Rate limit**: 60 requests per minute per organization.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "example": "urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6" }, "in": "path", "name": "experienceId", "required": true, "description": "GenStudio experience URN." }, { "schema": { "type": "string", "minLength": 1, "example": "urn:aaid:aem:62d4408b-13cb-4d41-8c6f-127fb2cad067" }, "in": "path", "name": "assetId", "required": true, "description": "GenStudio asset URN" }, { "schema": { "type": "string", "example": "Bearer eyJhbGciOiJSUz..." }, "in": "header", "name": "authorization", "required": true, "description": "Bearer token from Adobe OAuth Server-to-Server credentials" }, { "schema": { "type": "string", "example": "37e7532f1c5a225acf8d2fad131cde8d" }, "in": "header", "name": "x-api-key", "required": true, "description": "Client ID from the Adobe Developer Console project" }, { "schema": { "type": "string", "example": "36031A56669DEACD0A49402F@AdobeOrg" }, "in": "header", "name": "x-ims-org-id", "required": true, "description": "IMS Organization ID (format: {HEX}@AdobeOrg). Found in Adobe Developer Console: open your project, then Credentials → OAuth Server-to-Server → Credential Details → Organization ID." }, { "schema": { "type": "string", "example": "550e8400-e29b-41d4-a716-446655440000" }, "in": "header", "name": "x-request-id", "required": false, "description": "Client-generated UUID for request tracing" }, { "schema": { "type": "string", "example": "corr-abc-123" }, "in": "header", "name": "x-correlation-id", "required": false, "description": "Correlation ID to group related requests" } ], "responses": { "302": { "description": "Redirect to pre-signed asset delivery URL", "headers": { "Location": { "schema": { "type": "string", "format": "uri" }, "description": "Pre-signed URL for the asset; valid for up to 60 minutes", "example": "https://delivery-p106653-e326705.adobeaemcloud.com/adobe/assets/e577c7e1-c119-4892-9b97-59a9ab1927f6/as/variant-4x5.png?token=eyJhbGci...&expiryTime=2026-02-23T11:30:00.000Z" }, "X-Asset-Mime-Type": { "schema": { "type": "string" }, "description": "MIME type of the asset at the redirect destination", "example": "image/png" }, "Cache-Control": { "schema": { "type": "string", "enum": ["no-store"] }, "description": "Always no-store — prevents proxy caching so each call issues a fresh signed URL", "example": "no-store" } } }, "401": { "description": "Unauthorized. Indicates that the request has not been applied because it lacks valid authentication credentials for the target resource.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Unauthorized" } } } }, "403": { "description": "Forbidden. Indicates that the server understood the request but refuses to fulfil it.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Forbidden" } } } }, "404": { "description": "Not Found. Indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/NotFound" } } } }, "406": { "description": "Not Acceptable. Indicates that the target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/NotAcceptable" } } } }, "429": { "description": "Too Many Requests. Indicates that the user has sent too many requests in a given amount of time (\"rate limiting\").", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/TooManyRequests" } } } }, "503": { "description": "Service Unavailable. Indicates that the server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/ServiceUnavailable" } } } } } } }, "/experiences/{experienceId}/template": { "get": { "operationId": "getExperienceTemplate", "summary": "Get Experience Template", "description": "Returns the frozen Handlebars HTML template captured at experience creation time.\n\nDepending on the storage provider, this endpoint returns either:\n- **302 redirect** — follow `Location` to fetch the HTML from a short-lived pre-signed URL\n- **200 with body** — the HTML is returned directly as `text/html`\n\nClients must handle both response codes.\n\n**Express experiences are not supported**: Experiences created with Adobe Express do not have a Handlebars template. Calling this endpoint for an Express experience returns `404`.\n\n**Rate limit**: 60 requests per minute per organization.", "parameters": [ { "schema": { "type": "string", "minLength": 1, "example": "urn:aaid:aem:e577c7e1-c119-4892-9b97-59a9ab1927f6" }, "in": "path", "name": "experienceId", "required": true, "description": "GenStudio experience URN." }, { "schema": { "type": "string", "example": "Bearer eyJhbGciOiJSUz..." }, "in": "header", "name": "authorization", "required": true, "description": "Bearer token from Adobe OAuth Server-to-Server credentials" }, { "schema": { "type": "string", "example": "37e7532f1c5a225acf8d2fad131cde8d" }, "in": "header", "name": "x-api-key", "required": true, "description": "Client ID from the Adobe Developer Console project" }, { "schema": { "type": "string", "example": "36031A56669DEACD0A49402F@AdobeOrg" }, "in": "header", "name": "x-ims-org-id", "required": true, "description": "IMS Organization ID (format: {HEX}@AdobeOrg). Found in Adobe Developer Console: open your project, then Credentials → OAuth Server-to-Server → Credential Details → Organization ID." }, { "schema": { "type": "string", "example": "550e8400-e29b-41d4-a716-446655440000" }, "in": "header", "name": "x-request-id", "required": false, "description": "Client-generated UUID for request tracing" }, { "schema": { "type": "string", "example": "corr-abc-123" }, "in": "header", "name": "x-correlation-id", "required": false, "description": "Correlation ID to group related requests" } ], "responses": { "200": { "description": "template content", "content": { "text/html": { "schema": { "type": "string" }, "example": "\n\n
\n{{ body }}
\n