Social Media Compliance

Capture social media compliance screenshots with certified timestamps and SHA-256 hashes. Archive posts from LinkedIn, X, Instagram via API. Start free.

Vitalii Holben Updated

The API captures a social media post exactly as it appears on screen. Not just the text — the whole thing: how the profile looks, where the images sit, what the engagement numbers show. Add certified=true and you get a file with a cryptographic hash and timestamp baked in. That file proves the post existed in that exact form on that exact date. It matters because posts disappear. People edit them, delete them, or they just get buried. Platform exports give you text. A social media compliance screenshot gives you pixels.

Who archives social media posts and why

Financial firms are the obvious ones. FINRA treats a LinkedIn post by a registered advisor the same way it treats a print ad — same supervision rules, same archiving requirements. A compliance officer at a broker-dealer with 200 advisors posting weekly isn't going to review each one by hand. They need automated capture. The full FINRA picture is on the financial audit trail page.

Agencies and brand teams have a different problem. The FTC requires that paid influencer partnerships are clearly disclosed. Not buried in a hashtag wall, not hidden behind a "more" link. If you manage multiple influencer campaigns, you want proof that the disclosure was actually visible when the post went live. Not that it was there in the text — that it was visible on screen, in a readable font, above the fold. That's a screenshot, not an export.

Pharma is its own world. The FDA requires that every social media post promoting a drug shows risk information alongside benefits. In the same visual space, not in a separate post or a linked PDF. They've sent warning letters over Instagram posts where the efficacy claim was a bright graphic but the side effects were in tiny text you had to tap "more" to read. A screenshot of that post at publication time is the simplest proof.

HR departments archive employee posts during litigation holds. Brand protection teams document impersonation accounts. PR teams save crisis communications before they get taken down. Different situations, same underlying need: a visual record of what a page showed at a specific moment.

Why platform exports and manual screenshots fall short

LinkedIn's data export gives you a CSV of your own posts. Twitter/X gives you a JSON file with text and metadata. Neither one includes what the post actually looked like on screen. You don't see the layout, the profile picture placement, the surrounding replies. For compliance, that visual presentation is often the whole point. A risk disclosure in 8px gray text on a dark background is technically present but practically invisible.

Manual screenshots have a different problem. Someone on the compliance team opens the post, takes a screenshot, saves it to a shared drive. Anyone can open that file in Photoshop, change a pixel, save it again. The file's creation date proves nothing about when the page was actually captured. Try submitting that to a FINRA examiner as proof of what your advisor posted six months ago. I've seen compliance teams scramble to reconstruct social media records from memory and cached browser tabs. Not a great position.

Enterprise archiving platforms like Smarsh, Global Relay, and ArchiveSocial solve this with platform API integrations that pull posts directly. They bundle capture, storage, retention policies, and eDiscovery into one system. They also cost five to six figures per year depending on the number of users and platforms. For firms with deep pockets and thousands of supervised accounts, that makes sense. For a 50-person RIA or a mid-size agency, the budget doesn't stretch that far.

Screenshot social media posts with the API

The API approach is simpler and cheaper: point it at a public social media URL, it renders the page in a real browser, and returns a screenshot. Add certified=true and the response includes a cryptographic hash and timestamp that tie the image to a specific URL at a specific moment. If anyone questions the file later, the hash either matches or it doesn't. For the full verification workflow, see the certified screenshot feature page.

curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://linkedin.com/posts/advisor-jane-smith-cfa_market-outlook-activity-123456789\
&certified=true\
&full_page=true\
&stealth=true\
&block_ads=true\
&block_cookies=true\
&format=png\
&response_type=json" \
  -H "Authorization: Bearer YOUR_API_KEY"

That captures the full LinkedIn post as a visitor would see it. Stealth mode makes the headless browser look like a regular desktop session, which helps on platforms that detect automated access. Ad blocking and cookie blocking clean up the rest — no sponsored sidebar content, no LinkedIn "sign in to continue" nag covering half the page.

For posts behind a login wall, pass authentication cookies via the cookies parameter. The API loads the page with your session, captures it, and discards the session afterward. Each capture runs in an isolated browser instance with no state carried over from previous requests.

Schedule social media archiving across campaigns

One capture is a spot check. The real value is scheduling captures across all posts that need compliance documentation. A script that runs nightly via cron or GitHub Actions, saving each screenshot and its certification to disk:

import requests
import json
from pathlib import Path
from hashlib import sha256

API = "https://api.screenshotrun.com/v1/screenshots/capture"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
ARCHIVE = Path("compliance-archive/social")

post_urls = [
    "https://linkedin.com/posts/advisor-jane-smith-cfa_market-outlook-activity-123456789",
    "https://twitter.com/firmhandle/status/1234567890123456789",
    "https://instagram.com/p/ABC123def456/",
    "https://facebook.com/firmpage/posts/987654321",
]

for url in post_urls:
    resp = requests.get(API, headers=HEADERS, params={
        "url": url,
        "full_page": "true",
        "certified": "true",
        "block_ads": "true",
        "block_cookies": "true",
        "stealth": "true",
        "format": "png",
        "response_type": "json",
    })
    result = resp.json()
    folder = ARCHIVE / sha256(url.encode()).hexdigest()[:16]
    folder.mkdir(parents=True, exist_ok=True)
    (folder / "certification.json").write_text(json.dumps(result, indent=2))
    print(f"Archived {url[:40]}... -> {folder}")

Each post gets a folder named by its URL hash, with the certification JSON saved alongside the image. The Python integration guide covers downloading the actual image file and adding retry logic. Four posts per night, seven days a week, that's 28 API credits. Well within the free tier.

For larger campaigns with dozens of influencers, the batch endpoint handles up to 100 URLs per request. Fire multiple batches in parallel, use webhooks to collect results as they finish. The bulk screenshots use case covers that workflow.

Capture individual post elements with the selector parameter

Sometimes you don't need the full page. An FTC reviewer cares about the disclosure placement within the post, not the sidebar recommendations. The selector parameter captures a single DOM element by CSS selector.

curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://instagram.com/p/ABC123def456/\
&selector=article\
&certified=true\
&block_cookies=true\
&format=png\
&response_type=json" \
  -H "Authorization: Bearer YOUR_API_KEY"

That captures just the post container without navigation, suggested posts, or footer chrome. Cleaner for compliance records, smaller file size, and the certification still applies to the cropped image.

One thing to watch: social media platforms change their DOM structure all the time. A selector that works today might break next month when Instagram ships a redesign. Target semantic elements like article or role attributes rather than auto-generated class names. And log failures so you know when a selector stops matching.

Plan for breakage.

What the API does not do

Worth being direct about this. The API captures screenshots. It won't watch your employees' social media for new posts or flag ones that break FINRA or FTC rules. It won't manage retention policies or plug into eDiscovery platforms for legal holds. Capture is one piece of the puzzle, not the whole system.

If you need all of that in one system, enterprise tools like Smarsh or Global Relay are built for it. The API is the capture layer only. You bring the URL list, the scheduling, and the storage. For teams with developers and existing compliance infrastructure, that's often enough. If your firm doesn't have dev resources, the enterprise platforms are probably the better fit. That's a real tradeoff, not a sales pitch.

Platform login walls are the other limitation. Public posts on Twitter/X, LinkedIn (mostly), and Facebook business pages work without authentication. Private accounts, Instagram stories, and LinkedIn posts behind "sign in to see more" require session cookies. That adds complexity to your pipeline. And platforms actively fight automated access, so captures can fail on pages with aggressive bot detection. The stealth mode parameter helps, but it's not a guarantee.

One API call, one social media compliance screenshot

The certified parameter is a single boolean that adds hash verification and a timestamp to any social media capture. Financial firms under FINRA use it to document supervised communications. Agencies get proof that FTC disclosure language was visible when the post went live. Pharma teams can show the risk information appeared alongside benefits, not buried three taps deep.

Available on all plans, free tier included. No extra cost per certification. Start with 200 free captures per month and archive your highest-risk posts first. Check pricing when you need more volume. For broader website compliance beyond social media, see website compliance monitoring. For court-admissible evidence and litigation workflows, see legal evidence.

FAQ#

Yes. Pass authentication cookies via the cookies parameter. The API loads the page with your session, captures it, and discards the session afterward. Each capture runs in an isolated browser instance. This works for LinkedIn posts that require sign-in, private Facebook groups, and other gated content.

Three parameters handle it: block_cookies removes consent dialogs and sign-in nags, block_ads strips sponsored content and display ads, and stealth makes the headless browser look like a regular desktop session. For custom popups, use hide_selectors with a CSS selector targeting the specific element.

No. Certification works on every plan, including the free tier. Adding certified=true does not consume additional credits. You get the SHA-256 hash, timestamp, and parameter fingerprint at no extra cost.

Yes. The selector parameter captures a single DOM element by CSS selector. Pass selector=article to get just the post container without navigation, sidebar, or footer. Keep in mind that social media platforms change their DOM structure regularly, so build selectors around semantic elements and log failures.

Enterprise tools bundle capture, storage, retention policies, supervision workflows, and eDiscovery into one platform. The API gives you the capture layer only. You bring your own storage, scheduling, and retention management. Best for teams with developers and existing compliance infrastructure who need the capture piece without the enterprise price tag.

Written by

Vitalii Holben

Co-founder and CEO of ScreenshotRun. Full-stack developer building screenshot API tools that help developers capture, automate, and monitor web pages at scale. Based in Europe, shipping code since 201...

Screenshot API in a few clicks

Free plan includes 200 screenshots every month. No credit card required.

Sign up → copy your key → make your first call