Nextdoor ad images: 1080x1080 or 2:1, 30 MB, 120-char headline
Nextdoor image ads use 1:1 at 1080 x 1080 or 2:1 at 1080 x 540, JPG or PNG up to 30 MB. Make the 1:1 with Sume and crop a 2:1 locally.

Nextdoor image ads are 1:1 at 1080 x 1080 or 2:1 at 1080 x 540, in JPG or PNG up to 30 MB, with a headline of up to 120 characters. Sume's Image API lists 1:1 directly, so a square ad is one request; the 2:1 shape is not in its list, so crop a wider image to 1080 x 540 yourself.
The numbers are from Nextdoor's ads creative specs, read on 2026-10-02. That page has no video specs; for video see the related post.
What are the specs?
The page lists two image shapes.
| Item | Spec |
|---|---|
| Square | 1:1 at 1080 x 1080 |
| Wide | 2:1 at 1080 x 540 |
| Formats | JPG or PNG |
| Maximum file size | 30 MB |
| Headline | 120 characters |
Which shape should a local business use?
Square gives you more vertical room for a product or a team photo, while the 2:1 shape suits a storefront or a logo lockup. Make both from one source image so the ad set stays consistent.
Request the square, crop the wide
Use aspect_ratio 1:1 for the square. For the wide ad, ask for 16:9 with the subject centred, then crop to 2:1 with the script below, which keeps the centre.
import os, requests
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json={
"model": "sume/auto",
"prompt": "Neighbourhood bakery storefront with the subject centred and open space left and right, no text in the image",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/shop/storefront.jpg"}}
],
"aspect_ratio": "16:9",
},
timeout=60,
)
body = r.json()
if r.status_code == 200:
print(body["data"][0]["url"])
else: # 202: poll the job
print(body["data"]["status_url"])
Crop to 1080 x 540
After downloading the 16:9 result, this script centre-crops it to 2:1 and resizes to the exact size.
from PIL import Image
img = Image.open("ad-16x9.png").convert("RGB")
w, h = img.size
new_h = w // 2
top = (h - new_h) // 2
img = img.crop((0, top, w, top + new_h)).resize((1080, 540))
img.save("ad-1080x540.png")
print(img.size)
Sources
Related posts
More in Use cases
- Ofcom hash matching for AI deepfake intimate images: 30 September 2026
Ofcom said platforms should use hash matching to stop intimate-image abuse, including AI deepfakes, by 30 September 2026. What that means for AI video makers.
- OpenAI TTS requires AI-voice disclosure: burn it with Sume cues
OpenAI's TTS guide says to tell users the voice is AI-generated. A Sume caption job can burn that notice into video with authored cues, no ASR.
- Pin a product card on a live-selling clip with one overlay call
POST /v1/timeline-1.0/compose with operation overlay pins a product still at bottom, center or top of a live-selling clip for $0.02. Layout keys and limits.
- Pinterest Business Assistant is a closed US beta: what to do now
Pinterest's Business Assistant is an Ads Manager AI in closed US beta. Without access, here is how to turn a trend into Pin creative with Sume.
Written by Sume