AI holiday card from your dog's photo: keep the pet, change the scene

Turn one photo of your dog or cat into a holiday card scene with a Sume image edit: keep the pet unchanged, change the setting, and add the greeting yourself.

4 min readSume
All posts

One pet photo, one scene change

A holiday card with your own pet in a snowy cabin is a reference edit: the pet photo goes in, the setting changes, and the animal should still look like your animal. Send one clear, well-lit photo of the pet as the reference.

Use POST /v1/images with a single entry in input_references. For a fixed greeting, add the words afterwards in a design tool. OpenAI's guide says its model can still struggle with precise text placement and clarity, so lettering is safer as a separate step.

Sume Image API docs list ChatGPT Image 2.5 as openai/gpt-image-2.5 (Flare) and openai/gpt-image-2.5-sunburst. OpenAI's guide says to choose Sunburst where editing precision matters most and Flare for fast everyday generation, so these edits use Sunburst.

Tell the model what must stay

Name the pet's features that matter: fur color and markings, ear shape, collar. Say the pose and the face must not change, and describe the new setting in one sentence. Pick a portrait ratio for a card and request it explicitly if you do not want the photo's shape.

import os
import requests

REFS = [
    "https://example.com/dog.jpg",
]
resp = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json={
        "model": "openai/gpt-image-2.5-sunburst",
        "prompt": "Keep the dog exactly as photographed, including fur "
                  "markings, ears and red collar. Place it on a wooden cabin "
                  "porch in soft snowfall at dusk with warm string lights.",
        "aspect_ratio": "auto",
        "input_references": [
            {"type": "image_url", "image_url": {"url": u}} for u in REFS
        ],
    },
    timeout=60,
)
print(resp.status_code)
print(resp.json())

Settings to try

Three settings, three calls, the same source photo each time.

Card scene options (example prompts; request rules per Sume docs, read 2026-10-03)
OptionSetting
ACabin porch, snowfall, string lights
BFireplace, knitted stockings
CPine forest clearing, low sun

Compare the face to the photo

Put the result next to the original and check the eyes, the markings and the ears. If something changed, rerun with a more specific sentence about the feature that drifted. Then add the greeting in a design tool and export the card.

Inputs Sume checks before it spends anything

Reference and mask URLs must be public HTTPS; localhost, private-network and non-HTTPS URLs are rejected. Sume also checks every field against the model's catalog entry, so a field the model does not list returns 400 unsupported_parameter instead of being dropped without a word.

If you are unsure which fields a model accepts, GET /v1/images/models lists them, and GET /v1/images/models/{id}/endpoints returns the per-endpoint capabilities and pricing.

Timing and what a call costs

POST /v1/images on Sume waits up to 30 seconds and returns 200 with the image. If the generation is still running at that point you get 202 and a job envelope with a status URL and a result URL instead. The docs name 4K, high quality and large n as the settings most likely to degrade to 202, so branch on the status code, not on the body shape.

Billing is all-or-nothing. A completed generation is billed in full, a failed or cancelled one is not, and usage.cost in the response is the USD amount charged: the provider list price times 1.25.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume