Old Photo Restoration — Restore Old Photos in Bulk
Pricing
from $80.00 / 1,000 restored photos
Old Photo Restoration — Restore Old Photos in Bulk
Restore old photos in bulk from image URLs: dust and scratch repair, denoising, contrast recovery, before/after previews. USD 100 per 1,000 photos.
Pricing
from $80.00 / 1,000 restored photos
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
16 days ago
Last modified
Categories
Features
Share
Old Photo Restoration takes up to 20 public JPG, PNG, or WebP image URLs per run, repairs dust and thin scratches, reduces noise, recovers contrast, and returns downloadable restored files with a before/after preview, for family historians, archives, museums, and digitization teams. It costs USD 100 per 1,000 restored photos on the FREE pricing tier (USD 0.10 per photo), and failed photos are not charged.
The restoration is classical image processing that runs inside the Actor. It does not invent detail, reconstruct faces, colorize, or upscale.
What does the old photo restoration Actor return?
Each successfully restored photo produces one dataset item and one or two image files in the run's key-value store.
| Field | What it contains |
|---|---|
sourceUrl | The image URL you supplied |
restoredImageUrl | Download link for the restored file |
comparisonImageUrl | Download link for the side-by-side before/after JPEG, or null when previews are off |
restoredImageKey, comparisonImageKey | Key-value store keys, such as restored-001.jpg and comparison-001.jpg |
originalWidth, originalHeight | Pixel size of the source image |
outputWidth, outputHeight | Pixel size after the optional size cap |
inputBytes, outputBytes | Source and restored file sizes |
outputFormat, restorationLevel | The format and strength used |
operations | Steps applied, for example downscale, scratchRepair, denoise, contrastRecovery, sharpen |
scratchPixelsRepaired | Number of pixels filled by dust and scratch repair |
processingTimeMs | Download and processing time for this photo |
sha256 | Checksum of the restored file |
The OUTPUT record summarises the run: status (DATA, BLOCKED, REJECTED, or FAILED), requested, delivered, and failed counts, warnings, and links to the results.
What does the restoration actually fix?
It fixes small, common damage on scanned prints. For each photo it:
- downloads the file (20 MB maximum) and rejects images above 36 megapixels;
- optionally shrinks the longest side to your
maxDimension(it never enlarges); - finds thin, high-contrast dust specks and scratches and fills them from the surrounding pixels;
- optionally neutralizes a yellow or brown sepia cast;
- reduces noise, recovers local contrast, and sharpens, with the strength you choose;
- saves the restored file and an optional side-by-side preview.
It does not repair torn-away corners, fill large missing areas, sharpen faces with generated detail, colorize black-and-white photos, or increase resolution.
When should you use it, and when not?
Use it for:
- batch clean-up of scanned family photos before printing or sharing;
- archive and museum digitization queues that need consistent, repeatable processing and checksums;
- genealogy or estate collections where faces must not be altered.
Do not use it for:
- Generative restoration, colorization, or upscaling. This Actor deliberately avoids generated detail.
- Removing logos, watermarks, or text overlays. Use AI Image Watermark Remover.
- Reading text from scanned documents. Use Extract Text from Image URLs — Image OCR Scraper.
- Private files. Images must be reachable by a public HTTP(S) URL.
How do I restore old photos in bulk?
Paste up to 20 public image URLs and choose a strength. Every other field has a safe default.
| Input | Default | Accepted values |
|---|---|---|
imageUrls | One sample portrait | 1–20 public HTTP(S) JPG, PNG, or WebP URLs |
restorationLevel | balanced | gentle, balanced, strong |
repairScratches | true | Turn off for handwriting, drawings, and line art |
neutralizeSepia | false | Reduces a color cast; does not colorize |
outputFormat | jpeg | jpeg, png, webp |
quality | 92 | 60–100 (JPEG and WebP only) |
maxDimension | 3000 | 512–6000 pixels on the longest side |
createComparison | true | Saves a before/after JPEG |
maxConcurrency | 2 | 1–4 photos processed at once |
{"imageUrls": ["https://upload.wikimedia.org/wikipedia/commons/d/d3/Albert_Einstein_Head.jpg"],"restorationLevel": "balanced","repairScratches": true,"neutralizeSepia": false,"outputFormat": "jpeg","maxDimension": 3000,"createComparison": true}
Use it from an AI assistant
Old Photo Restoration works from Claude, ChatGPT, Cursor, or any other MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/vintage-photo-restorer to your client and ask, for example: "Restore these three scanned family photos gently, keep them as PNG, and give me the download links."
Run it with the API
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/vintage-photo-restorer').call({imageUrls: ['https://example.com/archive/family-1948.jpg'],restorationLevel: 'gentle',outputFormat: 'png',});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((photo) => console.log(photo.restoredImageUrl));
Python (apify-client 3.x):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/vintage-photo-restorer").call(run_input={"imageUrls": ["https://example.com/archive/family-1948.jpg"], "restorationLevel": "gentle"})for photo in client.dataset(run.default_dataset_id).iterate_items():print(photo["restoredImageUrl"], photo["operations"])
Output example
From the default input, run on 2026-10-26 (the 3250 × 4333 source was capped to 3000 pixels):
{"sourceUrl": "https://upload.wikimedia.org/wikipedia/commons/d/d3/Albert_Einstein_Head.jpg","restoredImageUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/restored-001.jpg","comparisonImageUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/comparison-001.jpg","restoredImageKey": "restored-001.jpg","comparisonImageKey": "comparison-001.jpg","originalWidth": 3250,"originalHeight": 4333,"outputWidth": 2250,"outputHeight": 3000,"inputBytes": 2309396,"outputBytes": 1185997,"outputFormat": "jpeg","restorationLevel": "balanced","operations": ["downscale", "scratchRepair", "denoise", "contrastRecovery", "sharpen"],"scratchPixelsRepaired": 14526,"processingTimeMs": 3249,"sha256": "27450f7a80cc42a1af271bd22532048a343edda55c668179ba49bc98732bafe9"}
That run took about 8 seconds end to end at 1 GB of memory.
Pricing: how much does it cost to restore an old photo?
You pay per restored photo delivered, plus a start fee. Apify platform usage is included in these prices.
| Event | FREE | BRONZE | SILVER | GOLD, PLATINUM, DIAMOND |
|---|---|---|---|---|
| Restored photo (primary event) | USD 0.100001 | USD 0.0975 | USD 0.095 | USD 0.08 |
| Per 1,000 photos | USD 100.00 | USD 97.50 | USD 95.00 | USD 80.00 |
| Actor start, per started GB of allocated memory | USD 0.006251 | USD 0.006094 | USD 0.005938 | USD 0.005 |
The default memory is 1 GB (one start event). A 2 GB run counts two start events.
- Default run, 1 photo, FREE tier: USD 0.006251 + USD 0.100001 = about USD 0.11.
- Full run, 20 photos at 1 GB, FREE tier: USD 0.006251 + 20 × USD 0.100001 = about USD 2.01 (about USD 1.61 on GOLD).
Photos that fail to download or decode create no dataset item and are not charged. When your maximum charge for the run is reached, the Actor stops starting new photos.
Reliability, privacy, and limits
- Only public HTTP(S) URLs are accepted. Private, local, and link-local addresses are blocked, and redirects are re-checked (four at most).
- Downloads time out after 30 seconds; files above 20 MB or 36 megapixels are rejected with a warning in
OUTPUT. - EXIF and IPTC metadata and transparency are not kept. Keep your originals if you need them.
- Scratch repair can soften genuine fine lines. Use
gentle, or turnrepairScratchesoff, for documents, handwriting, and drawings. - Photo pixels are processed inside the Actor and are not sent to any outside service.
- Files stay in your run storage under your Apify data-retention settings.
FAQ
How much does it cost to restore an old photo with this Actor?
USD 0.10 per photo on the FREE tier, or USD 0.08 on GOLD, plus a start fee of under one cent per run.
Does it use AI, and will it change faces?
No. It uses classical filters (inpainting, denoising, contrast, and sharpening) and never generates new facial detail.
Can it colorize black-and-white photos?
No. The sepia option only removes a color cast; it does not add color.
Can it fix torn photos or missing corners?
No. It repairs thin scratches and dust specks only. Large damaged areas need manual retouching.
What is the best way to restore an old photo with it?
Scan the print at 300 dpi or more, start with balanced, and compare the before/after preview. Switch to gentle for fragile detail or strong for heavy noise.
Where do I download the restored photos?
Use restoredImageUrl from each dataset item, or open the run's key-value store and download the restored- and comparison- files.
Related Actors
- AI Image Watermark Remover: remove logos, timestamps, and text overlays.
- Manga Colorizer: colorize black-and-white comic and manga pages.
- Extract Text from Image URLs — Image OCR Scraper: read printed text from scans and screenshots.
- Coloring Page Generator — Printable SVG Coloring Book: printable black-and-white pages from a theme.
Legal and responsible use
Only process images you own or are authorized to modify. Review photos that show private individuals or sensitive information before you share run storage or exports.
Last verified: 2026-10-27