Integrations

Send approved photos to your own display

Hold every photo for staff review and push only the approved ones to a display you built.

On this page

Use this when Snapbar runs capture, styling, and review, and your own screen shows the results. Turn on Hold for Approval on the experience, register a webhook endpoint that subscribes to submission.approved with the photos-only policy, and your display receives signed notifications for approved photos after a 10-second retraction window, with additional queue/retry latency when applicable. HTTP deliveries can repeat. Nothing arrives for photos that are still waiting or were rejected.

Set up review on the experience

  1. Open the experience, select the Submissions tab, open the more options menu on the toolbar, and turn on Hold for Approval. From then on every new photo waits under Awaiting Approval until staff decide.

  2. Staff review from the same tab: select photos and choose Approve or Reject, or open a photo and decide there. Approved photos reach Snapbar displays and your endpoint; rejected photos go nowhere.

Register the display endpoint

  1. Create a live API key with Manage notification endpoints and Read submissions in Integrations > Developer, as described in Create API keys.

  2. Find the activation id. List the activations in the account and copy the id of the experience (its short_id and name match what the dashboard shows).

    curl --fail-with-body \
      --header "Authorization: Bearer ${SNAPBAR_API_KEY}" \
      https://integrations.snapbar.com/v1/activations
    
    # { "data": [ { "id": "2f5c1a8e-…", "short_id": "exp_Abc123Def456", "name": "Summer Launch", … } ], … }
  3. Register your receiver for the approved event only, with the photos-only policy, scoped to that activation id. media_only delivers every approved photo whether or not the guest left contact details, and the envelope carries lead: null.

    curl --fail-with-body \
      --request POST \
      --header "Authorization: Bearer ${SNAPBAR_API_KEY}" \
      --header 'Content-Type: application/json' \
      --data '{
        "url": "https://your-display.example.com/snapbar",
        "event_types": ["submission.approved"],
        "consent_policy": "media_only",
        "experience_ids": ["2f5c1a8e-7d3b-4e1f-9a6c-0b8d4e2f1a37"]
      }' \
      https://integrations.snapbar.com/v1/webhook-endpoints
  4. Store the signing_secret from the response and verify every delivery with it, following Receive signed webhooks at your own endpoint. The endpoint is live as soon as it is registered.

Test it the way the event will run

  1. Take a real photo through the experience. Confirm it appears under Awaiting Approval and that nothing reaches your receiver.

  2. Approve it. After the 10-second retraction window, confirm your receiver gets a submission.approved delivery whose media array holds the finished photo. Reject a second test photo and confirm nothing arrives for it.

  3. Check Integrations > Activity for a Delivered row per approved photo. A Retrying or Action needed row means your receiver did not answer 2xx; fix it and replay from there.

Catch up and remove stale photos

  1. Pause your wall updater, keep durably accepting signed webhooks, and record the affected activation and old endpoint IDs. Fix and register a replacement endpoint, install its secret, and verify a synthetic send before resuming.

  2. Drain GET /activations/{id}/submissions?approved_only=true&limit=100 through every next_cursor, without completed_after. Build a temporary set of submission IDs and visible media IDs. Do not clear the current wall after a failed or partial scan.

  3. After a complete scan, upsert approved photos and remove cached submissions/media absent from that set. Full scans are not atomic snapshots: re-read any item changed by webhooks during the scan before applying it, process buffered IDs through GET /submissions/{id}, and repeat the scan to converge.

  4. For an urgent removal, staff identify the submission ID in Activity, hide/reject/delete it in Snapbar as appropriate, and remove every associated file, thumbnail, wall entry, and CDN copy in the receiving system. Verify both the wall and a direct file URL. Keep a local suppression record so an older buffered webhook cannot restore it.

  5. Use the runnable poller for incremental catch-up with overlap and periodic complete reconciliation. Approval after completion, regeneration, hiding, and deletion may not change completed_at, so incremental polling alone is not a removal feed. Agree a reconciliation interval and a named removal operator before opening the event.

Pre-event checklist

  • Hold for Approval is on for the live experience, not only the rehearsal one, and a named staff member owns the Awaiting Approval tab for the whole event.

  • The endpoint on the list under Integrations > Developer shows Active, points at the production receiver rather than a tunnel, and is scoped to the live activation id.

  • The receiver verifies the signature with the stored secret, dedupes on Idempotency-Key, ignores envelopes with test: true, and answers 2xx well inside 10 seconds.

  • The pending, approved, rejected rehearsal in the section above passed today with the production receiver, and Activity shows Delivered for the approved photo.

  • Photos are downloaded on receipt and served from your own storage, with the submission short_id logged beside each file so staff can trace a photo in Activity.

  • Someone can remove a photo from the wall by submission id, because hiding it in Snapbar does not recall a delivery.

  • The delivery retry ladder in Partner API errors and limits is understood: a receiver outage during the event means retries for hours, but five failures in a row put the endpoint into Failing and every later photo then gets a single attempt until it recovers.

What to know

  • What your display receives.A JSON envelope with a link to each finished photo, its thumbnail and pixel width and height when Snapbar has them (they are null for photos sent in through the API as finished uploads), plus the activation and submission identifiers. Not the file itself. Download the photo on receipt and serve it from your own storage; the link is public and unauthenticated but is not permanent hosting.
  • How to know it came from Snapbar.Every delivery carries an HMAC-SHA256 signature over the exact body, computed with the secret you stored at registration. Verify it before trusting the payload and deduplicate on the Idempotency-Key header, because a timed-out attempt can be retried.
  • Resolution.The output size is a property of the style Snapbar configured for the experience, not of the webhook, and the envelope reports each photo’s width and height when they are known, so treat both as nullable. Tell Snapbar the size your display needs before the event.
  • One event, possible duplicate deliveries, and no recall.Snapbar mints the approved event at most once per submission, but HTTP delivery is at least once and may be duplicated or delayed. An intentional 10-second approval retraction window precedes sending; queue pacing and retries add latency. Regeneration, later holds, hiding, and deletion do not emit update/retraction events. Keep a manual remove-by-submission-ID control, and periodically reconcile approved submissions and current media as described below. A cached file must also be removed from your storage and CDN.
  • An approval taken back in time is skipped, not sent.If staff approve a photo and then hold or reject it again before the delivery goes out, the row shows Skipped with reason in Activity with APPROVAL_RETRACTED. It revives on its own when the photo is approved again; replaying it while the photo is still held only skips it again. A delivery that had already succeeded is not recalled.
  • When review is off.If Hold for Approval is turned off, submission.approved fires at completion instead, alongside submission.completed. Your subscription keeps working either way. Photos sent into the API as finished uploads fire both events on the same terms as booth photos, so the display receives them too.

Tips

  • Register the endpoint before the event and run the pending, approved, rejected test with your real receiver, not a placeholder.
  • Keep one staff member on the Awaiting Approval tab during the event; the wall only fills as fast as they approve.
  • Log the submission short id with each photo you store so a later question can be traced in Activity.

Related articles

Receive signed webhooks at your own endpointCreate API keys for the partner APIHide, restore, or delete a guest resultFix failed deliveries