Skip to content
TheHVACMarketing Guys

Photos and video

Get photos from your phone into your library and onto the right page.

Overview

To add a photo, ask your assistant for an upload link and send the photo from your phone, or give it a link to a photo that's already online. It can't take a photo you attach in the chat, so it sends you an upload link instead.

Real photos of your team and work do more for trust than any stock image. The upload link works on your phone or computer, and photos go straight into your library, the same one our team uses.

Then tell it where the photo goes, like the main picture on your homepage or a service page. It shows you what was there before and what's there now. Take a photo down and the page goes back to its default picture, while the photo stays in your library.

A photo spot takes a photo and a video spot takes a video, so a page never ends up with the wrong kind of file. A video from your phone is prepared for smooth playback on any connection, so it may take a minute to be ready for a page. If you're not sure which photo is which, ask it to find the one you mean.

Changes here need an active account. If your account is on hold or cancelled, editing pauses until it's back.

You can also do this in your workspace. Look in Home or Site, with the Photos button (/workspace).

The tools on this page

Photos and video: what each tool reads, writes, and asks
ToolReadsWritesAsks you first
Add a photo from your phoneNoYesYes
Add a photo from a linkNoYesYes
See your photosYesNoNo
Put a photo on a pageNoYesYes
Show a photo on service pagesNoYesYes
Take a photo off a pageNoYesYes

Add a photo from your phone

create_media_upload_urlChanges your site or sends something

What you can ask

  • Add a photo of the new truck.
  • I want to add some shop photos.
  • Send me a link to upload pictures.

What it does

The way to add a photo from a phone or computer: a link that sends photos straight into your library.

Your assistant asks you to confirm this first.

What it won't do

The link works for 30 minutes and only puts photos in your own library.

What your assistant sends

FieldRequiredDescription
file_namestringYesIncluding the extension, e.g. van.jpg.
content_typestringNoMIME type, e.g. image/jpeg. Images and video only.
owner_requeststringNoWhat the owner asked for, in their words, one sentence. Optional. Stored with the audit record so their team can see what owners ask for.
Example: what your assistant sends
{
  "file_name": "new-sign.jpg",
  "content_type": "image/jpeg"
}
Example: what comes back
{
  "upload_page_url": "https://www.theservicemarketingguys.com/upload/abc",
  "expires_in_minutes": 30,
  "max_files": 20,
  "instructions": "Open it on your phone."
}

Add a photo from a link

add_mediaChanges your site or sends something

What you can ask

  • Add this photo: <link>
  • Grab the team photo from our Facebook page.

What it does

Add a photo from a public link. For a photo on your phone, use the upload link tool.

Your assistant asks you to confirm this first.

What it needs

  • A public link to the photo.

What it won't do

It takes JPEG, PNG, WebP, or GIF photos up to 10 MB from a public link. A link that needs a login won't work. Send those from your phone instead.

What your assistant sends

FieldRequiredDescription
urlstringYesPublic https URL of an image to copy into the library.
file_namestringNoDefaults to the name in the URL.
descriptionstringNo
alt_textstringNo
owner_requeststringNoWhat the owner asked for, in their words, one sentence. Optional. Stored with the audit record so their team can see what owners ask for.
Example: what your assistant sends
{
  "url": "https://images.example/new-sign.jpg",
  "alt_text": "Our new sign out front"
}
Example: what comes back
{
  "media": {
    "id": "0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
    "file_name": "new-sign.jpg",
    "url": "https://cdn.example/new-sign.jpg"
  }
}

See your photos

list_mediaReads only

What you can ask

  • Show me the photos in my library.
  • Find the picture of our new sign.

What it does

Your photos and videos. Search by type or by words.

What your assistant sends

FieldRequiredDescription
searchstringNoMatches file name, description, and alt text.
file_typeone of: image, videoNo
limitintegerNoDefault 20.
Example: what your assistant sends
{
  "file_type": "image"
}
Example: what comes back
{
  "media": [
    {
      "id": "0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
      "file_name": "team-photo.jpg",
      "url": "https://cdn.example/team-photo.jpg",
      "email_src": "media://0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
      "email_url": "https://esg.example/images/client/team-photo.jpg",
      "type": "image",
      "mime_type": "image/jpeg",
      "size_bytes": 412880,
      "dimensions": "1600x1200",
      "alt_text": "The whole crew out front",
      "description": null,
      "created_at": "2026-09-12T14:03:11.000Z",
      "tags": {
        "services": [],
        "cities": [],
        "type": "team"
      }
    }
  ],
  "awaiting_upload": []
}

Put a photo on a page

attach_mediaChanges your site or sends something

What you can ask

  • Use the new team photo as the main picture on my homepage.
  • Put this job photo on the water heater repair page.

What it does

Put a photo or video from your library on your site, in place of what's there.

Your assistant asks you to confirm this first.

What it needs

  • Where on your site it goes.
  • The photo or video, from your library.

What it won't do

A photo slot takes a photo and a video slot takes a video. It won't put one in the other's place.

What your assistant sends

FieldRequiredDescription
roleenumYesThe slot. Every slot takes a photo except location.video and location.hero, which take an MP4.
mediaIdstringYesAn id from list_media.
targetobjectNoservice.card: { type: "service", serviceSlug }. location.*: { type: "location", areaSlug }. Omit for site-wide slots.
confirmobjectYesRequired. One line stating the change, in the owner's words.
owner_requeststringNoWhat the owner asked for, in their words, one sentence. Optional. Stored with the audit record so their team can see what owners ask for.
Example: what your assistant sends
{
  "role": "hero.main",
  "mediaId": "0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
  "confirm": {
    "intent": "Use the new team photo on the home page"
  }
}
Example: what comes back
{
  "recorded": true,
  "applied": true,
  "placementId": "7d1e9f20-3b4c-4d5e-8f6a-1b2c3d4e5f60",
  "slot": "Homepage hero",
  "url": "https://cdn.example/team-photo.jpg",
  "previous": null,
  "reversible": "Assigning a different file to the same slot deactivates this row rather than deleting it, so the previous one can be put back."
}

Show a photo on service pages

tag_mediaChanges your site or sends something

What you can ask

  • Show this job photo on my water heater repair page.
  • Put these photos on the pages for the town the job was in.
  • That one is a team photo, so put it on the about page.

What it does

Tag a photo with the services and cities it shows so it appears in those service page galleries.

Your assistant asks you to confirm this first.

What it needs

  • The photo, from your library.

What it won't do

It only takes services you offer and towns you serve, so a typo is turned down instead of saved. A team or training photo goes on your about or careers page, not on service pages.

What your assistant sends

FieldRequiredDescription
media_idstringYesAn id from list_media.
servicesarray of stringNoService slugs from get_content_map. Replaces the list; [] clears it.
citiesarray of stringNoCities you serve or have a shop in. Replaces the list; [] clears it.
typeone of: service, team, trainingNoservice (default), team (about page) or training (careers page).
confirmobjectYesRequired. One line stating the change, in the owner's words.
owner_requeststringNoWhat the owner asked for, in their words, one sentence. Optional. Stored with the audit record so their team can see what owners ask for.
Example: what your assistant sends
{
  "media_id": "0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
  "services": [
    "water-heater-repair"
  ],
  "cities": [
    "Winter Haven"
  ],
  "confirm": {
    "intent": "Show the new job photo on the water heater repair pages"
  }
}
Example: what comes back
{
  "media": {
    "id": "0b8e2c1a-5f7d-4e3b-9a61-3c2d4e5f6a7b",
    "file_name": "job-photo.jpg",
    "url": "https://cdn.example/job-photo.jpg",
    "alt_text": "The finished job"
  },
  "tags": {
    "services": [
      "water-heater-repair"
    ],
    "cities": [
      "Winter Haven"
    ],
    "type": null
  },
  "shows_on": [
    "/services/water-heater-repair",
    "/service-areas/winter-haven-fl/water-heater-repair"
  ]
}

Take a photo off a page

detach_mediaChanges your site or sends something

What you can ask

  • Take that photo off the about page.
  • Go back to the default picture on the homepage.

What it does

Take a photo or video off your site. The page shows its default again, and the file stays in your library.

Your assistant asks you to confirm this first.

What it needs

  • Which spot on your site to clear.

What it won't do

The photo stays in your library, so you can put it back any time.

What your assistant sends

FieldRequiredDescription
roleenumYesThe slot to empty.
targetobjectNoservice.card: { type: "service", serviceSlug }. location.*: { type: "location", areaSlug }. Omit for site-wide slots.
confirmobjectYesRequired. One line stating the change, in the owner's words.
owner_requeststringNoWhat the owner asked for, in their words, one sentence. Optional. Stored with the audit record so their team can see what owners ask for.
Example: what your assistant sends
{
  "role": "hero.main",
  "confirm": {
    "intent": "Take the old photo off the home page"
  }
}
Example: what comes back
{
  "removed": true,
  "applied": true,
  "slot": "Homepage hero",
  "previous": null,
  "reversible": "The file stays in the library; attach_media with its id puts it back."
}