The Webhook feature lets you receive real-time notifications as the extension fetches comments. Each time a batch of comments is collected — or when the export starts, finishes, stops, or fails — the extension sends an HTTP POST request to your configured endpoint.
TIP
The Webhook feature is available in version 2.8.0 and above. It is free to use.
The extension rejects URLs that point to private or internal addresses to prevent accidental data leaks to local services or cloud metadata endpoints. The following are blocked at save time and at send time:
Non-https:// URLs (plain http:// is refused).
Hostnames containing line breaks or other invalid characters.
localhost and any hostname ending in .local, .internal, .localdomain.
Cloud metadata aliases such as metadata.google.internal, metadata, instance-data.
IPv4 addresses in 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16 (link-local and AWS/GCP metadata 169.254.169.254), 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10 (CGNAT), 224.0.0.0/4 (multicast/reserved).
IPv6 addresses in ::1, fe80::/10 (link-local), fc00::/7 (unique-local), and IPv4-mapped equivalents.
If your service runs on a private network, expose it through a public HTTPS tunnel (e.g. Cloudflare Tunnel, ngrok, Tailscale Funnel) before pointing the extension at it.
Your token is sent in the request body under a fixed auth.token field (see envelope). Use this for token-in-body style APIs.
Header
A custom HTTP header is added to every request. Use this for Authorization: Bearer … style APIs.
TIP
The Field mode always uses the fixed key auth.token — you cannot rename it. This guarantees the token never collides with any reserved envelope field (event, data, requestId, etc.).
Same shape as export.completed, with "event": "export.failed". Fired when a GraphQL request throws an error or returns an empty response (e.g. rate-limited by Facebook). The extension always emits exactly one terminal event (export.completed, export.stopped, or export.failed) per export run, so downstream batch handlers can rely on it to close out a batch.
Payload size: a single request body is capped at 5 MB. If a batch would exceed this (very large reply trees, long comment text, etc.), the extension skips the network call and writes a Payload exceeds N bytes entry into Webhook Logs. Lower the Fetch Count or Nesting Depth to reduce the per-batch size.
Retries: none. A failed request is logged once and the export continues with the next batch. Implement retry/dedup on your endpoint side if you need at-least-once semantics — see Idempotency.
Concurrency: requests to the same endpoint are sent one at a time (in order). This avoids hammering your server when nested replies trigger many comments.batch events in quick succession.
Check that the Webhook checkbox is enabled inside the export modal.
Use Send Test to confirm the endpoint is reachable.
Check Webhook Logs for a statusCode: null entry — this usually means the URL was unreachable or the domain permission was not granted.
Blocked: … entries in Webhook Logs
The extension refused to send because the URL failed validation. Common causes:
The URL points to a private IP / localhost / *.internal host. See URL requirements for the full list.
The URL or a header contains line breaks (CR/LF). Re-paste your token without trailing newlines.
The URL is http:// instead of https://.
Payload exceeds N bytes
A batch was larger than the 5 MB limit. Reduce Fetch Count in the export modal, or turn off Includes Nesting Comments / lower the Nesting Depth.
CORS errors in the background console
The extension requests host permission for the exact domain you configure. If you change the URL to a different domain, open Webhook Settings and click Save again to trigger the new permission prompt. Send Test also requests permission before firing, so you don't have to save first just to test.
HTTP 4xx or 5xx responses
The extension does not retry failed requests. Your endpoint must return a 2xx status; anything else is logged as an error but the export continues.
export.failed received unexpectedly
Facebook rate-limits GraphQL requests when comments are fetched too quickly. Disable Full Speed mode to add a delay between requests and reduce the chance of hitting the limit.
Each request carries a unique requestId (UUID v4). If your endpoint may receive the same event twice (e.g. due to network retries on your infrastructure), use requestId to deduplicate:
How to use the Webhook feature
The Webhook feature lets you receive real-time notifications as the extension fetches comments. Each time a batch of comments is collected — or when the export starts, finishes, stops, or fails — the extension sends an HTTP POST request to your configured endpoint.
TIP
The Webhook feature is available in version 2.8.0 and above. It is free to use.
Configure
https://and resolve to a public host — see URL requirements).To enable sending during an export, check the Webhook checkbox inside the export modal on any Facebook post.
URL requirements
The extension rejects URLs that point to private or internal addresses to prevent accidental data leaks to local services or cloud metadata endpoints. The following are blocked at save time and at send time:
https://URLs (plainhttp://is refused).localhostand any hostname ending in.local,.internal,.localdomain.metadata.google.internal,metadata,instance-data.0.0.0.0/8,10.0.0.0/8,127.0.0.0/8,169.254.0.0/16(link-local and AWS/GCP metadata169.254.169.254),172.16.0.0/12,192.168.0.0/16,100.64.0.0/10(CGNAT),224.0.0.0/4(multicast/reserved).::1,fe80::/10(link-local),fc00::/7(unique-local), and IPv4-mapped equivalents.If your service runs on a private network, expose it through a public HTTPS tunnel (e.g. Cloudflare Tunnel, ngrok, Tailscale Funnel) before pointing the extension at it.
Auth modes
auth.token)auth.tokenfield (see envelope). Use this for token-in-body style APIs.Authorization: Bearer …style APIs.TIP
The Field mode always uses the fixed key
auth.token— you cannot rename it. This guarantees the token never collides with any reserved envelope field (event,data,requestId, etc.).Events
Every request uses
Content-Type: application/jsonandPOSTmethod. Theeventfield identifies what happened.export.startcomments.batchexport.completedexport.stoppedexport.failedtestPayload schema
Every request body shares the same top-level envelope:
Envelope fields
extensionstringextensionIdstring"export-comments-for-facebook".versionstringrequestIdstringtimestampnumbereventstringdataobjectauthobjectField. Shape:{ "token": "<your token>" }. The keyauth.tokenis fixed and cannot be renamed.datafields postUrlstringpostIdstringfeedbackIdstringcursorstring | nullcomments.batchwhen more pages follow.nullin all other events and on the final batch.commentsComment[]comments.batchCommentobject idstringcommentId).commentIdstringid.feedbackIdstringcontentstringurlstringauthor.namestringauthor.idstringauthor.urlstringauthor.avatarstringreactionsCountnumbersubCommentsCountnumbercreatedAtnumberparentFeedbackIdstringdepthnumber0= top-level comment,1= first reply, and so on.children[]comments.batchevents.Example payloads
export.startcomments.batchcursoris non-null when more pages remain;nullon the last batch.export.completedexport.stoppedSame shape as
export.completed, with"event": "export.stopped". Fired when the user clicks Stop before all pages are fetched.export.failedSame shape as
export.completed, with"event": "export.failed". Fired when a GraphQL request throws an error or returns an empty response (e.g. rate-limited by Facebook). The extension always emits exactly one terminal event (export.completed,export.stopped, orexport.failed) per export run, so downstream batch handlers can rely on it to close out a batch.Auth mode
Field— body withauth.tokenWhen Auth Mode is set to
Field, every request gains a top-levelauthobject alongside the usual envelope:Logs & retention
Every outgoing webhook request is logged automatically. You can review logs at Webhook Logs in the Options page.
Limits
Payload exceeds N bytesentry into Webhook Logs. Lower the Fetch Count or Nesting Depth to reduce the per-batch size.comments.batchevents in quick succession.Troubleshooting
No request received at my endpoint
statusCode: nullentry — this usually means the URL was unreachable or the domain permission was not granted.Blocked: …entries in Webhook LogsThe extension refused to send because the URL failed validation. Common causes:
localhost/*.internalhost. See URL requirements for the full list.http://instead ofhttps://.Payload exceeds N bytesA batch was larger than the 5 MB limit. Reduce Fetch Count in the export modal, or turn off Includes Nesting Comments / lower the Nesting Depth.
CORS errors in the background console
The extension requests host permission for the exact domain you configure. If you change the URL to a different domain, open Webhook Settings and click Save again to trigger the new permission prompt. Send Test also requests permission before firing, so you don't have to save first just to test.
HTTP 4xx or 5xx responses
The extension does not retry failed requests. Your endpoint must return a 2xx status; anything else is logged as an error but the export continues.
export.failedreceived unexpectedlyFacebook rate-limits GraphQL requests when comments are fetched too quickly. Disable Full Speed mode to add a delay between requests and reduce the chance of hitting the limit.
Idempotency
Each request carries a unique
requestId(UUID v4). If your endpoint may receive the same event twice (e.g. due to network retries on your infrastructure), userequestIdto deduplicate: