Home Property Setup Property Photos

4 Property Photos

Upload interior and exterior photos of your property to create a visual gallery.

Why Add Photos?

Property photos are essential for documenting the condition of your rental property. They serve as visual records for both landlords and tenants.

Benefits

  • Document property condition before and after tenant moves
  • Visual gallery for potential tenants
  • Secure cloud storage for your photos
  • Separate categories for interior and exterior photos

How to Add Photos

You can upload photos via the web interface or through the API. The web interface supports drag-and-drop file upload.

In the web interface: open the property page, then click "Photo / Video" in the property menu to open the media gallery.

See the full documentation in the Library: Property Photos & Videos.

Media Types

Each photo or video belongs to one of five media types. Use the appropriate type for proper organization.

PHOTO_INTERIOR Rooms, kitchen, bathroom
PHOTO_EXTERIOR Building, yard, parking
VIDEO_INTERIOR Interior video tour (YouTube)
VIDEO_EXTERIOR Exterior video tour (YouTube)
PHOTO_OTHER Other (documents, receipts, etc.)

Upload Requirements

Formats JPG, PNG, WEBP
Max size 10 MB
Storage Secure cloud
Videos YouTube URLs only (embedded)

For Developers: REST API

You can manage property media via the REST API. Photos are uploaded as base64-encoded content.

POST Upload Photo

Upload a photo by sending the file content as base64-encoded string. Specify the document type to categorize the photo.

POST /api/v1/properties/{id}/documents

Headers:

Authorization: Bearer {token} Content-Type: application/json

Required Fields:

document_type_id Document type ID (6, 7, 10...)
file_content Base64-encoded file content
file_name Original file name with extension
mime_type MIME type (image/webp, image/jpeg...)

Optional Fields:

comment Description or comment for the photo

Request Body:

{ "document_type_id": 6, "file_content": "base64-encoded-file-content...", "file_name": "living-room.webp", "mime_type": "image/webp", "comment": "Living room photo" }
Document type IDs: 6 = PHOTO_INTERIOR, 7 = PHOTO_EXTERIOR, 10 = PHOTO_OTHER. Use GET /api/document-types for the full list.

Response (201 Created):

{ "message": "Document uploaded successfully", "data": { "id": 45, "property_id": 2, "document_type": { "id": 6, "code": "PHOTO_INTERIOR", "name_key": "document_type.photo_interior" }, "file_url": "https://landlordkeeper.com/file/cG1mOjQ1OjA6...", "original_name": "living-room.webp", "file_size": 125000, "file_size_formatted": "122.07 KB", "mime_type": "image/webp", "extension": "webp", "is_image": true, "is_video": false, "is_pdf": false, "comment": "Living room photo", "created_at": "2026-02-20T12:00:00+00:00" } }

GET List Property Media

Get all documents for a property. Use type_id filter to show only specific media types.

GET /api/v1/properties/{id}/documents

Query Parameters:

type_id Filter by document type ID (e.g. 6 for interior photos)

Response (200 OK):

{ "data": [ { "id": 45, "property_id": 2, "document_type": {"id": 6, "code": "PHOTO_INTERIOR"}, "file_url": "https://landlordkeeper.com/file/cG1mOjQ1OjA6...", "original_name": "living-room.webp", "file_size": 125000, "is_image": true, "comment": "Living room photo", "created_at": "2026-02-20T12:00:00+00:00" } ], "total": 3, "stats": { "total_count": 3, "total_size": 375000, "total_size_formatted": "366.21 KB" } }

GET Get Document Types

Get the list of all available document types with their IDs, allowed extensions, and size limits.

GET /api/v1/document-types

This endpoint does not require authentication.

Response (200 OK):

{ "data": [ {"id": 6, "code": "PHOTO_INTERIOR", "allowed_extensions": "jpg,jpeg,png,webp", "max_size_mb": 10}, {"id": 7, "code": "PHOTO_EXTERIOR", "allowed_extensions": "jpg,jpeg,png,webp", "max_size_mb": 10}, {"id": 8, "code": "VIDEO_INTERIOR", "allowed_extensions": "mp4,webm", "max_size_mb": 50}, {"id": 9, "code": "VIDEO_EXTERIOR", "allowed_extensions": "mp4,webm", "max_size_mb": 50}, {"id": 10, "code": "PHOTO_OTHER", "allowed_extensions": "jpg,jpeg,png,webp", "max_size_mb": 10} ] }

cURL Examples:

curl https://landlordkeeper.com/api/v1/document-types

DELETE Delete Photo

Delete a document by its ID. The file and the database record are permanently deleted.

DELETE /api/v1/documents/{documentId}

Use the document ID from the list (GET) or upload (POST) response.

Response (200 OK):

{"message": "Document deleted successfully"}

cURL Examples

1. Upload Photo

curl -X POST https://landlordkeeper.com/api/v1/properties/2/documents \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -d '{ "document_type_id": 6, "file_content": "'$(base64 -w 0 photo.webp)'", "file_name": "living-room.webp", "mime_type": "image/webp", "comment": "Living room" }'

2. List Property Media

curl https://landlordkeeper.com/api/v1/properties/2/documents?type_id=6 \ -H "Authorization: Bearer YOUR_TOKEN_HERE"

3. Delete Photo

curl -X DELETE https://landlordkeeper.com/api/v1/documents/45 \ -H "Authorization: Bearer YOUR_TOKEN_HERE"
Replace YOUR_TOKEN_HERE with the JWT token from the authentication step.