Skip to main content
PATCH
/
api
/
v1
/
themes
/
{id}
Update a theme
curl --request PATCH \
  --url https://quizquail.com/api/v1/themes/{id} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Midnight Neon",
  "primaryColor": "#3B82F6",
  "secondaryColor": "#6366F1",
  "backgroundColor": "#0A0F1C",
  "textColor": "#F1F5F9",
  "accentColor": "#38BDF8",
  "fontFamily": "Inter",
  "backgroundImageUrl": "<string>",
  "isPublic": false,
  "soundPack": "default",
  "effects": {
    "backgroundImageOpacity": 0.4,
    "backgroundStyle": "blobs",
    "backgroundBlobCount": 3,
    "backgroundBlobOpacity": 0.24,
    "backgroundAnimationSpeed": 1,
    "backgroundGradientIntensity": 0.13,
    "backgroundVignetteIntensity": 0.7,
    "gradientAngle": 135,
    "gradientAnimation": true,
    "backgroundPattern": "none",
    "backgroundPatternOpacity": 0.12,
    "backgroundPatternScale": 1,
    "particleStyle": "none",
    "particleDensity": 0.3,
    "particleSpeed": 1,
    "particleColor": "theme",
    "optionCardVariant": "standard",
    "optionCardOpacity": 0.33,
    "optionStripeWidth": 4,
    "titleLetterSpacing": "-0.02em",
    "textStyle": "solid",
    "titleTextStyle": "solid",
    "textShadowStyle": "subtle",
    "optionFontWeight": 400,
    "frameStyle": "none",
    "frameColor": "#FFFFFF",
    "frameOpacity": 0.5,
    "introRingCount": 3,
    "introParticleCount": 8,
    "outroConfettiCount": 12,
    "outroBurstCount": 3,
    "celebrationStyle": "pulse",
    "celebrationIntensity": 0.7,
    "correctAnswerGlowSize": 30,
    "revealSuspenseFrames": 45,
    "revealDimIntensity": 0.3,
    "urgencyStyle": "vignette",
    "urgencyThreshold": 3,
    "urgencyColor": "#EF4444",
    "transitionStyle": "fade",
    "grainOverlay": "none",
    "grainStyle": "film",
    "audioReactive": false,
    "audioReactiveIntensity": 0.5,
    "audioReactiveBpm": 120
  }
}
'
import requests

url = "https://quizquail.com/api/v1/themes/{id}"

payload = {
"name": "Midnight Neon",
"primaryColor": "#3B82F6",
"secondaryColor": "#6366F1",
"backgroundColor": "#0A0F1C",
"textColor": "#F1F5F9",
"accentColor": "#38BDF8",
"fontFamily": "Inter",
"backgroundImageUrl": "<string>",
"isPublic": False,
"soundPack": "default",
"effects": {
"backgroundImageOpacity": 0.4,
"backgroundStyle": "blobs",
"backgroundBlobCount": 3,
"backgroundBlobOpacity": 0.24,
"backgroundAnimationSpeed": 1,
"backgroundGradientIntensity": 0.13,
"backgroundVignetteIntensity": 0.7,
"gradientAngle": 135,
"gradientAnimation": True,
"backgroundPattern": "none",
"backgroundPatternOpacity": 0.12,
"backgroundPatternScale": 1,
"particleStyle": "none",
"particleDensity": 0.3,
"particleSpeed": 1,
"particleColor": "theme",
"optionCardVariant": "standard",
"optionCardOpacity": 0.33,
"optionStripeWidth": 4,
"titleLetterSpacing": "-0.02em",
"textStyle": "solid",
"titleTextStyle": "solid",
"textShadowStyle": "subtle",
"optionFontWeight": 400,
"frameStyle": "none",
"frameColor": "#FFFFFF",
"frameOpacity": 0.5,
"introRingCount": 3,
"introParticleCount": 8,
"outroConfettiCount": 12,
"outroBurstCount": 3,
"celebrationStyle": "pulse",
"celebrationIntensity": 0.7,
"correctAnswerGlowSize": 30,
"revealSuspenseFrames": 45,
"revealDimIntensity": 0.3,
"urgencyStyle": "vignette",
"urgencyThreshold": 3,
"urgencyColor": "#EF4444",
"transitionStyle": "fade",
"grainOverlay": "none",
"grainStyle": "film",
"audioReactive": False,
"audioReactiveIntensity": 0.5,
"audioReactiveBpm": 120
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Midnight Neon',
primaryColor: '#3B82F6',
secondaryColor: '#6366F1',
backgroundColor: '#0A0F1C',
textColor: '#F1F5F9',
accentColor: '#38BDF8',
fontFamily: 'Inter',
backgroundImageUrl: '<string>',
isPublic: false,
soundPack: 'default',
effects: {
backgroundImageOpacity: 0.4,
backgroundStyle: 'blobs',
backgroundBlobCount: 3,
backgroundBlobOpacity: 0.24,
backgroundAnimationSpeed: 1,
backgroundGradientIntensity: 0.13,
backgroundVignetteIntensity: 0.7,
gradientAngle: 135,
gradientAnimation: true,
backgroundPattern: 'none',
backgroundPatternOpacity: 0.12,
backgroundPatternScale: 1,
particleStyle: 'none',
particleDensity: 0.3,
particleSpeed: 1,
particleColor: 'theme',
optionCardVariant: 'standard',
optionCardOpacity: 0.33,
optionStripeWidth: 4,
titleLetterSpacing: '-0.02em',
textStyle: 'solid',
titleTextStyle: 'solid',
textShadowStyle: 'subtle',
optionFontWeight: 400,
frameStyle: 'none',
frameColor: '#FFFFFF',
frameOpacity: 0.5,
introRingCount: 3,
introParticleCount: 8,
outroConfettiCount: 12,
outroBurstCount: 3,
celebrationStyle: 'pulse',
celebrationIntensity: 0.7,
correctAnswerGlowSize: 30,
revealSuspenseFrames: 45,
revealDimIntensity: 0.3,
urgencyStyle: 'vignette',
urgencyThreshold: 3,
urgencyColor: '#EF4444',
transitionStyle: 'fade',
grainOverlay: 'none',
grainStyle: 'film',
audioReactive: false,
audioReactiveIntensity: 0.5,
audioReactiveBpm: 120
}
})
};

fetch('https://quizquail.com/api/v1/themes/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://quizquail.com/api/v1/themes/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Midnight Neon',
'primaryColor' => '#3B82F6',
'secondaryColor' => '#6366F1',
'backgroundColor' => '#0A0F1C',
'textColor' => '#F1F5F9',
'accentColor' => '#38BDF8',
'fontFamily' => 'Inter',
'backgroundImageUrl' => '<string>',
'isPublic' => false,
'soundPack' => 'default',
'effects' => [
'backgroundImageOpacity' => 0.4,
'backgroundStyle' => 'blobs',
'backgroundBlobCount' => 3,
'backgroundBlobOpacity' => 0.24,
'backgroundAnimationSpeed' => 1,
'backgroundGradientIntensity' => 0.13,
'backgroundVignetteIntensity' => 0.7,
'gradientAngle' => 135,
'gradientAnimation' => true,
'backgroundPattern' => 'none',
'backgroundPatternOpacity' => 0.12,
'backgroundPatternScale' => 1,
'particleStyle' => 'none',
'particleDensity' => 0.3,
'particleSpeed' => 1,
'particleColor' => 'theme',
'optionCardVariant' => 'standard',
'optionCardOpacity' => 0.33,
'optionStripeWidth' => 4,
'titleLetterSpacing' => '-0.02em',
'textStyle' => 'solid',
'titleTextStyle' => 'solid',
'textShadowStyle' => 'subtle',
'optionFontWeight' => 400,
'frameStyle' => 'none',
'frameColor' => '#FFFFFF',
'frameOpacity' => 0.5,
'introRingCount' => 3,
'introParticleCount' => 8,
'outroConfettiCount' => 12,
'outroBurstCount' => 3,
'celebrationStyle' => 'pulse',
'celebrationIntensity' => 0.7,
'correctAnswerGlowSize' => 30,
'revealSuspenseFrames' => 45,
'revealDimIntensity' => 0.3,
'urgencyStyle' => 'vignette',
'urgencyThreshold' => 3,
'urgencyColor' => '#EF4444',
'transitionStyle' => 'fade',
'grainOverlay' => 'none',
'grainStyle' => 'film',
'audioReactive' => false,
'audioReactiveIntensity' => 0.5,
'audioReactiveBpm' => 120
]
]),
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;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://quizquail.com/api/v1/themes/{id}"

payload := strings.NewReader("{\n \"name\": \"Midnight Neon\",\n \"primaryColor\": \"#3B82F6\",\n \"secondaryColor\": \"#6366F1\",\n \"backgroundColor\": \"#0A0F1C\",\n \"textColor\": \"#F1F5F9\",\n \"accentColor\": \"#38BDF8\",\n \"fontFamily\": \"Inter\",\n \"backgroundImageUrl\": \"<string>\",\n \"isPublic\": false,\n \"soundPack\": \"default\",\n \"effects\": {\n \"backgroundImageOpacity\": 0.4,\n \"backgroundStyle\": \"blobs\",\n \"backgroundBlobCount\": 3,\n \"backgroundBlobOpacity\": 0.24,\n \"backgroundAnimationSpeed\": 1,\n \"backgroundGradientIntensity\": 0.13,\n \"backgroundVignetteIntensity\": 0.7,\n \"gradientAngle\": 135,\n \"gradientAnimation\": true,\n \"backgroundPattern\": \"none\",\n \"backgroundPatternOpacity\": 0.12,\n \"backgroundPatternScale\": 1,\n \"particleStyle\": \"none\",\n \"particleDensity\": 0.3,\n \"particleSpeed\": 1,\n \"particleColor\": \"theme\",\n \"optionCardVariant\": \"standard\",\n \"optionCardOpacity\": 0.33,\n \"optionStripeWidth\": 4,\n \"titleLetterSpacing\": \"-0.02em\",\n \"textStyle\": \"solid\",\n \"titleTextStyle\": \"solid\",\n \"textShadowStyle\": \"subtle\",\n \"optionFontWeight\": 400,\n \"frameStyle\": \"none\",\n \"frameColor\": \"#FFFFFF\",\n \"frameOpacity\": 0.5,\n \"introRingCount\": 3,\n \"introParticleCount\": 8,\n \"outroConfettiCount\": 12,\n \"outroBurstCount\": 3,\n \"celebrationStyle\": \"pulse\",\n \"celebrationIntensity\": 0.7,\n \"correctAnswerGlowSize\": 30,\n \"revealSuspenseFrames\": 45,\n \"revealDimIntensity\": 0.3,\n \"urgencyStyle\": \"vignette\",\n \"urgencyThreshold\": 3,\n \"urgencyColor\": \"#EF4444\",\n \"transitionStyle\": \"fade\",\n \"grainOverlay\": \"none\",\n \"grainStyle\": \"film\",\n \"audioReactive\": false,\n \"audioReactiveIntensity\": 0.5,\n \"audioReactiveBpm\": 120\n }\n}")

req, _ := http.NewRequest("PATCH", 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(string(body))

}
HttpResponse<String> response = Unirest.patch("https://quizquail.com/api/v1/themes/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Midnight Neon\",\n \"primaryColor\": \"#3B82F6\",\n \"secondaryColor\": \"#6366F1\",\n \"backgroundColor\": \"#0A0F1C\",\n \"textColor\": \"#F1F5F9\",\n \"accentColor\": \"#38BDF8\",\n \"fontFamily\": \"Inter\",\n \"backgroundImageUrl\": \"<string>\",\n \"isPublic\": false,\n \"soundPack\": \"default\",\n \"effects\": {\n \"backgroundImageOpacity\": 0.4,\n \"backgroundStyle\": \"blobs\",\n \"backgroundBlobCount\": 3,\n \"backgroundBlobOpacity\": 0.24,\n \"backgroundAnimationSpeed\": 1,\n \"backgroundGradientIntensity\": 0.13,\n \"backgroundVignetteIntensity\": 0.7,\n \"gradientAngle\": 135,\n \"gradientAnimation\": true,\n \"backgroundPattern\": \"none\",\n \"backgroundPatternOpacity\": 0.12,\n \"backgroundPatternScale\": 1,\n \"particleStyle\": \"none\",\n \"particleDensity\": 0.3,\n \"particleSpeed\": 1,\n \"particleColor\": \"theme\",\n \"optionCardVariant\": \"standard\",\n \"optionCardOpacity\": 0.33,\n \"optionStripeWidth\": 4,\n \"titleLetterSpacing\": \"-0.02em\",\n \"textStyle\": \"solid\",\n \"titleTextStyle\": \"solid\",\n \"textShadowStyle\": \"subtle\",\n \"optionFontWeight\": 400,\n \"frameStyle\": \"none\",\n \"frameColor\": \"#FFFFFF\",\n \"frameOpacity\": 0.5,\n \"introRingCount\": 3,\n \"introParticleCount\": 8,\n \"outroConfettiCount\": 12,\n \"outroBurstCount\": 3,\n \"celebrationStyle\": \"pulse\",\n \"celebrationIntensity\": 0.7,\n \"correctAnswerGlowSize\": 30,\n \"revealSuspenseFrames\": 45,\n \"revealDimIntensity\": 0.3,\n \"urgencyStyle\": \"vignette\",\n \"urgencyThreshold\": 3,\n \"urgencyColor\": \"#EF4444\",\n \"transitionStyle\": \"fade\",\n \"grainOverlay\": \"none\",\n \"grainStyle\": \"film\",\n \"audioReactive\": false,\n \"audioReactiveIntensity\": 0.5,\n \"audioReactiveBpm\": 120\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://quizquail.com/api/v1/themes/{id}")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Midnight Neon\",\n \"primaryColor\": \"#3B82F6\",\n \"secondaryColor\": \"#6366F1\",\n \"backgroundColor\": \"#0A0F1C\",\n \"textColor\": \"#F1F5F9\",\n \"accentColor\": \"#38BDF8\",\n \"fontFamily\": \"Inter\",\n \"backgroundImageUrl\": \"<string>\",\n \"isPublic\": false,\n \"soundPack\": \"default\",\n \"effects\": {\n \"backgroundImageOpacity\": 0.4,\n \"backgroundStyle\": \"blobs\",\n \"backgroundBlobCount\": 3,\n \"backgroundBlobOpacity\": 0.24,\n \"backgroundAnimationSpeed\": 1,\n \"backgroundGradientIntensity\": 0.13,\n \"backgroundVignetteIntensity\": 0.7,\n \"gradientAngle\": 135,\n \"gradientAnimation\": true,\n \"backgroundPattern\": \"none\",\n \"backgroundPatternOpacity\": 0.12,\n \"backgroundPatternScale\": 1,\n \"particleStyle\": \"none\",\n \"particleDensity\": 0.3,\n \"particleSpeed\": 1,\n \"particleColor\": \"theme\",\n \"optionCardVariant\": \"standard\",\n \"optionCardOpacity\": 0.33,\n \"optionStripeWidth\": 4,\n \"titleLetterSpacing\": \"-0.02em\",\n \"textStyle\": \"solid\",\n \"titleTextStyle\": \"solid\",\n \"textShadowStyle\": \"subtle\",\n \"optionFontWeight\": 400,\n \"frameStyle\": \"none\",\n \"frameColor\": \"#FFFFFF\",\n \"frameOpacity\": 0.5,\n \"introRingCount\": 3,\n \"introParticleCount\": 8,\n \"outroConfettiCount\": 12,\n \"outroBurstCount\": 3,\n \"celebrationStyle\": \"pulse\",\n \"celebrationIntensity\": 0.7,\n \"correctAnswerGlowSize\": 30,\n \"revealSuspenseFrames\": 45,\n \"revealDimIntensity\": 0.3,\n \"urgencyStyle\": \"vignette\",\n \"urgencyThreshold\": 3,\n \"urgencyColor\": \"#EF4444\",\n \"transitionStyle\": \"fade\",\n \"grainOverlay\": \"none\",\n \"grainStyle\": \"film\",\n \"audioReactive\": false,\n \"audioReactiveIntensity\": 0.5,\n \"audioReactiveBpm\": 120\n }\n}"

response = http.request(request)
puts response.read_body
{
  "data": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "name": "<string>",
    "primaryColor": "<string>",
    "secondaryColor": "<string>",
    "backgroundColor": "<string>",
    "textColor": "<string>",
    "accentColor": "<string>",
    "fontFamily": "<string>",
    "backgroundImageUrl": "<string>",
    "isPublic": true,
    "effects": {
      "backgroundImageOpacity": 0.4,
      "backgroundStyle": "blobs",
      "backgroundBlobCount": 3,
      "backgroundBlobOpacity": 0.24,
      "backgroundAnimationSpeed": 1,
      "backgroundGradientIntensity": 0.13,
      "backgroundVignetteIntensity": 0.7,
      "gradientAngle": 135,
      "gradientAnimation": true,
      "backgroundPattern": "none",
      "backgroundPatternOpacity": 0.12,
      "backgroundPatternScale": 1,
      "particleStyle": "none",
      "particleDensity": 0.3,
      "particleSpeed": 1,
      "particleColor": "theme",
      "optionCardVariant": "standard",
      "optionCardOpacity": 0.33,
      "optionStripeWidth": 4,
      "titleLetterSpacing": "-0.02em",
      "textStyle": "solid",
      "titleTextStyle": "solid",
      "textShadowStyle": "subtle",
      "optionFontWeight": 400,
      "frameStyle": "none",
      "frameColor": "#FFFFFF",
      "frameOpacity": 0.5,
      "introRingCount": 3,
      "introParticleCount": 8,
      "outroConfettiCount": 12,
      "outroBurstCount": 3,
      "celebrationStyle": "pulse",
      "celebrationIntensity": 0.7,
      "correctAnswerGlowSize": 30,
      "revealSuspenseFrames": 45,
      "revealDimIntensity": 0.3,
      "urgencyStyle": "vignette",
      "urgencyThreshold": 3,
      "urgencyColor": "#EF4444",
      "transitionStyle": "fade",
      "grainOverlay": "none",
      "grainStyle": "film",
      "audioReactive": false,
      "audioReactiveIntensity": 0.5,
      "audioReactiveBpm": 120
    },
    "userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "createdAt": "2023-11-07T05:31:56Z",
    "updatedAt": "2023-11-07T05:31:56Z",
    "soundPack": "<unknown>"
  }
}
{
"type": "https://quizquail.com/problems/validation-error",
"title": "Validation Error",
"status": 400,
"detail": "Request validation failed",
"instance": "<string>",
"errors": [
{
"field": "title",
"message": "Title is required",
"code": "too_small"
}
]
}

Authorizations

Authorization
string
header
required

API key authentication. Prefix your key with Bearer in the Authorization header.

Keys follow the format qq_... and can be scoped to specific permissions.

Path Parameters

id
string<uuid>
required

Resource UUID

Example:

"550e8400-e29b-41d4-a716-446655440000"

Body

application/json
name
string
Required string length: 1 - 100
Example:

"Midnight Neon"

primaryColor
string
default:#3B82F6
Pattern: ^#[0-9a-fA-F]{6}$
secondaryColor
string
default:#6366F1
Pattern: ^#[0-9a-fA-F]{6}$
backgroundColor
string
default:#0A0F1C
Pattern: ^#[0-9a-fA-F]{6}$
textColor
string
default:#F1F5F9
Pattern: ^#[0-9a-fA-F]{6}$
accentColor
string
default:#38BDF8
Pattern: ^#[0-9a-fA-F]{6}$
fontFamily
string
default:Inter
backgroundImageUrl
string<uri> | null
isPublic
boolean
default:false
soundPack
enum<string>
default:default
Available options:
default,
none
effects
object

Visual effects configuration — all 42 fields are optional with sensible defaults

Response

Updated theme

data
object
required