Layer Playable v1
PLAYABLEFeaturedlayer-playable-v1
Layer Playable v1 from Layer is the first AI model purpose-built for generating playable ads — interactive mini-game experiences used in mobile user acquisition campaigns. Unlike traditional static or video ads, playable ads let potential players engage with a short, scaled-down version of a game’s core mechanics before installing, delivering up to 3× higher conversion rates and 30–40% better retention than standard formats. The model takes your existing game assets — characters, backgrounds, UI elements, and reward screens — and composes them into a self-contained HTML5 playable unit ready for deployment across major ad networks. Designed for UA creative teams producing at scale, it dramatically reduces the turnaround from concept to live playable, enabling rapid A/B testing of gameplay hooks, difficulty curves, and visual themes.
curl --request POST \ --url https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "prompt": "a knight standing in a snowy forest", "guidance_file_reference_image": [ { "url": "<file_url>" } ], "guidance_file_reference_video": [ { "url": "<file_url>" } ], "guidance_file_reference_audio": [ { "url": "<file_url>" } ]}'import requests
url = "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences"
payload = { "prompt": "a knight standing in a snowy forest", "guidance_file_reference_image": [{ "url": "<file_url>" }], "guidance_file_reference_video": [{ "url": "<file_url>" }], "guidance_file_reference_audio": [{ "url": "<file_url>" }]}headers = { "Authorization": "Bearer <token>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const url = 'https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"prompt":"a knight standing in a snowy forest","guidance_file_reference_image":[{"url":"<file_url>"}],"guidance_file_reference_video":[{"url":"<file_url>"}],"guidance_file_reference_audio":[{"url":"<file_url>"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences"
payload := strings.NewReader("{\n \"prompt\": \"a knight standing in a snowy forest\",\n \"guidance_file_reference_image\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_video\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_audio\": [\n {\n \"url\": \"<file_url>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'prompt' => 'a knight standing in a snowy forest', 'guidance_file_reference_image' => [ [ 'url' => '<file_url>' ] ], 'guidance_file_reference_video' => [ [ 'url' => '<file_url>' ] ], 'guidance_file_reference_audio' => [ [ 'url' => '<file_url>' ] ] ]), CURLOPT_HTTPHEADER => [ "Authorization: Bearer <token>", "Content-Type: application/json" ],]);
$response = curl_exec($curl);$err = curl_error($curl);
curl_close($curl);
if ($err) { echo "cURL Error #:" . $err;} else { echo $response;}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "{\n \"prompt\": \"a knight standing in a snowy forest\",\n \"guidance_file_reference_image\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_video\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_audio\": [\n {\n \"url\": \"<file_url>\"\n }\n ]\n}");Request request = new Request.Builder() .url("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences") .post(body) .addHeader("Authorization", "Bearer <token>") .addHeader("Content-Type", "application/json") .build();
Response response = client.newCall(request).execute();require 'uri'require 'net/http'
url = URI("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences")
http = Net::HTTP.new(url.host, url.port)http.use_ssl = true
request = Net::HTTP::Post.new(url)request["Authorization"] = 'Bearer <token>'request["Content-Type"] = 'application/json'request.body = "{\n \"prompt\": \"a knight standing in a snowy forest\",\n \"guidance_file_reference_image\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_video\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_audio\": [\n {\n \"url\": \"<file_url>\"\n }\n ]\n}"
response = http.request(request)puts response.read_bodyvar client = new RestClient("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/layer-playable-v1/inferences");var request = new RestRequest("", Method.Post);request.AddHeader("Authorization", "Bearer <token>");request.AddHeader("Content-Type", "application/json");request.AddParameter("application/json", "{\n \"prompt\": \"a knight standing in a snowy forest\",\n \"guidance_file_reference_image\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_video\": [\n {\n \"url\": \"<file_url>\"\n }\n ],\n \"guidance_file_reference_audio\": [\n {\n \"url\": \"<file_url>\"\n }\n ]\n}", ParameterType.RequestBody);var response = client.Execute(request);Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Id of the workspace that owns the resource.
Id of the workspace that owns the resource.
Query Parameters
Section titled “Query Parameters”Header Parameters
Section titled “Header Parameters”Opaque key making this request safe to retry. The first request with a given key executes; a later request with the same key returns that first response with Idempotent-Replayed: true instead of executing again. The key covers the method, path, query, and body it was first used with; reusing it for a different request is rejected with 422. Replayable for 24 hours.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Guides style and content without being modified
A single guidance/reference file supplied to a reference_image_list field.
The slot’s guidance type is fixed by the field it’s attached to; the caller
supplies the file URL and, where the model supports per-file weighting, a weight.
object
Guides style and motion without being modified
A single guidance/reference file supplied to a reference_image_list field.
The slot’s guidance type is fixed by the field it’s attached to; the caller
supplies the file URL and, where the model supports per-file weighting, a weight.
object
Guides style and voice without being modified
A single guidance/reference file supplied to a reference_image_list field.
The slot’s guidance type is fixed by the field it’s attached to; the caller
supplies the file URL and, where the model supports per-file weighting, a weight.
object
Advanced field.
Example
{ "prompt": "a knight standing in a snowy forest", "guidance_file_reference_image": [ { "url": "<file_url>" } ], "guidance_file_reference_video": [ { "url": "<file_url>" } ], "guidance_file_reference_audio": [ { "url": "<file_url>" } ]}Responses
Section titled “Responses”Successful Response
object
Unique identifier for this forge run.
Current status: IN_PROGRESS.
Suggested polling interval in seconds.
Timestamp of when the run was created.
Inference parameters after model-specific normalization.
These reflect the actual values used for generation, including model defaults applied for any parameters not explicitly set.
Example
{ "status": "in_progress"}Unauthenticated — missing or invalid Bearer token.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Forbidden — insufficient permissions, or the access token lacks the scope the operation requires.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Resource not found.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}The request with this Idempotency-Key is still running — retry after the number of seconds in Retry-After.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Invalid input parameters, or an Idempotency-Key reused for a different request.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Rate limited — retry after the number of seconds in Retry-After.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Internal server error.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}