From estuary-schema
Creates an HTTP Ingest (webhook) capture in Estuary for receiving data via POST requests from services like GitHub, Shopify, Stripe.
How this skill is triggered — by the user, by Claude, or both
Slash command
/estuary-schema:capture-http-ingest-createThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create an Estuary capture that accepts incoming HTTP requests (webhooks) from external services.
Create an Estuary capture that accepts incoming HTTP requests (webhooks) from external services.
Before proceeding, fetch the official connector docs for config reference and webhook URL details:
Primary: https://docs.estuary.dev/reference/Connectors/capture-connectors/http-ingest/
Use WebFetch to load this page. The docs cover:
idFromHeaderThis skill provides the flowctl workflow, service-specific guidance, and troubleshooting that docs don't cover.
Before writing any YAML, ask the user:
/orders, /customers)HTTP Ingest works in reverse — external services push TO Estuary, rather than Estuary pulling FROM a source:
captures:
<tenant>/<path>/source-http-ingest:
endpoint:
connector:
image: ghcr.io/estuary/source-http-ingest:v1
config:
require_auth_token: "<secure-random-token>"
paths:
- /<path-name>
bindings: []
Generate a secure token:
openssl rand -base64 32
After discovery, add idFromHeader to bindings for webhook services that provide unique delivery IDs:
| Service | idFromHeader Value | Notes |
|---|---|---|
| GitHub | X-Github-Delivery | Unique ID per delivery |
| Shopify | X-Shopify-Webhook-Id | Unique ID per webhook |
| Zendesk | x-zendesk-webhook-id | Case-sensitive |
| Stripe | Stripe-Signature | Contains timestamp + signature |
| Segment | X-Request-Id | Standard request ID |
Example with deduplication:
bindings:
- resource:
path: /github-events
stream: github-events
idFromHeader: X-Github-Delivery
target: <tenant>/<path>/github-events
# Discover (creates collection bindings for each path)
flowctl discover --source flow.yaml
# Review bindings, add idFromHeader if needed
cat flow.yaml
# Publish
flowctl catalog publish --source flow.yaml --auto-approve
The webhook URL is only available in the Estuary web UI after publishing.
Generate the dashboard link for the user from the catalog name:
https://dashboard.estuary.dev/captures/details/overview?catalogName=<tenant>/<path>/source-http-ingest
For example, if the capture is acmeCo/webhooks/source-http-ingest:
https://dashboard.estuary.dev/captures/details/overview?catalogName=acmeCo/webhooks/source-http-ingest
Provide this link to the user and tell them to:
https://<unique-hostname>/)/github-events)Full URL format: https://<unique-hostname>/<your-path>
If the user named a specific source system (e.g., Shopify, GitHub, Stripe), use WebSearch to find that service's webhook configuration docs. Help the user with both sides of the setup — the Estuary capture AND the source-side webhook registration.
In the external service:
application/jsonAuthorization: Bearer <your-token># Test with curl
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-token>" \
-d '{"event": "test", "data": {"key": "value"}}' \
"https://<your-endpoint-url>/<path>"
# Check status
flowctl catalog status <tenant>/<path>/source-http-ingest
# Read ingested data
flowctl collections read --collection <tenant>/<path>/<stream-name> --uncommitted | head -10
Cause: Token doesn't match require_auth_token config
Fix: Verify token matches exactly. Check for trailing spaces/newlines. Format must be Bearer <token> (with space).
Cause: URL path doesn't match configured paths
Fix: Check path spelling (case-sensitive), ensure path starts with / in config, don't include query parameters.
Cause: Using wrong HTTP method (e.g., GET)
Fix: Use POST or PUT.
Cause: HTTP client doesn't properly support HTTP/2
Fix: Force HTTP/1.1 if possible: curl --http1.1 -X POST ...
Cause: Schema inference updates can cause brief connector restarts
Fix: Implement retry logic. Most webhook services (GitHub, Stripe, etc.) automatically retry failed deliveries. Once schema stabilizes, this stops happening.
Cause: Some services (like SendGrid) only support OAuth or signature-based auth
Workaround: Use middleware (AWS API Gateway, Cloudflare Workers) to translate auth, or check if Estuary has a dedicated connector for that service.
Diagnostic steps:
flowctl catalog status <task>flowctl logs --task <task> --since 10mWait 30-60 seconds — this is normal during shard assignment. If still stuck:
flowctl logs --task <tenant>/<path>/source-http-ingest --since 5m | jq 'select(.level == "error")'
connector-disable-enable — Pause/restart existing capturesestuary-logs — Deep log analysisestuary-catalog-status — Status checkingnpx claudepluginhub estuary/agent-skills --plugin estuary-schemaGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.