How to Shipp?
Real-time data is pivotal in every app¶
Every industry has its own vocabulary (Entertainment, Financial, Logistics, Scheduling, Security, Insurance) but the underlying product requirements are the same:
- Users make decisions in the present
- The app must reflect what’s true right now (availability, status, risk, progress, market movement)
- The app must update that truth as the world changes
That “truth right now” is real-time data.
If you’re building with AI (agents, copilots, workflows, vibecoding), real-time data matters even more: an agent can generate UI and logic quickly, but without fresh data the app becomes untrustworthy. A great demo but fragile product.
Shipp enables a faster way to create connections to real-time data. It's cost-effective, fast to run, and easy to start.
Does this apply to me?¶
Real-time data is the foundation for:
- Commerce: inventory changes, price updates, order status, delivery ETAs
- Travel & hospitality: availability, delays, cancellations, rebooking options
- Finance: quotes, filings, transactions, fraud/risk signals, portfolio changes
- Operations & logistics: scans, routing changes, exceptions, SLA breaches
- Healthcare: appointment openings, lab result statuses, care coordination events
- Security: alerts, detections, posture changes, incident timelines
- Media & communities: trending, engagement spikes, moderation events
In all of these, users want answers that stay correct as the world changes. Not last year's trending topics or yesterday's market shock.
What does Shipp do for me?¶
Shipp is the real-time data connector for AI builders: you describe the live information your app needs, and Shipp delivers the right event stream into your product without building pipelines or managing integrations.
Who this document is for¶
This guide is designed to scratch the surface, going only deep enough to start your journey.
If you're an Agent or Technically Savvy¶
Expect to find clear, testable integration patterns and data-handling rules
If you're a Vibe Coder / Business Leader¶
Expect to find why the feature matters and how it improves trust, conversion, and retention
If you’re integrating Shipp via an AI builder, start with a platform guide (e.g. Lovable) and come back here for implementation strategy.
Too deep?
Let your agent go deep from here, if you're not an engineer or agent no worries! Shipp has you in mind and we're here to help. Reach out to support if you need guidance: Support can be emailed at support@shipp.ai
The mental model: Shipp “Connections” = reusable live-data queries¶
The primary way to interact with Shipp is collecting events with a Connection:
- You create a connection by providing
filter_instructionsas plain English - You run a connection to retrieve raw event data in a schema-flexible
data[]array
This is intentionally simple: the “hard part” is describing what you want, and the agent can build the rest of the app around a stable connection_id.
For details on usage, see the API Reference.
How to build¶
Step 1 — Write a “Real-Time Contract” for one screen¶
Pick one screen that users will watch/refresh frequently (a “watch screen”), then define:
- User promise: what must stay accurate while they’re looking at it?
- Triggering events: what changes should cause UI updates?
- Data shape you need: what fields do you need to render and decide?
- Freshness window: how old can the last update be before you warn the user?
- Failure mode: what do you show if you can’t fetch updates?
Example contract (cross-industry):
- Screen: “Order Status”
- Promise: “Status changes and exceptions show up quickly.”
- Needs:
status,updated_at,location(if present),desc/type/categoryas human-readable explanation - Freshness window: 10 seconds to 5 minutes depending on your domain.
- Failure mode: “Last updated X minutes ago” + manual refresh + retry
This contract becomes the grounding spec for the agent.
Step 2 — Translate the contract into filter_instructions¶
Your filter_instructions should be:
- Short
- Explicit
- Testable
- Scoped
Think of it like a product requirement statement your data layer can execute.
Patterns that work well:
- include the domain (“NBA”, “shipment tracking”, “price changes”, etc.)
- scope to an entity, time window, or set (“for game_id X”, “for today”, “for Team A”, “for this order/user”)
- name what you want surfaced (“high impact moments”, “status changes”, “exceptions”, “score updates”)
Example (sports, today):
filter_instructions:NBA games today: scoring runs, lead changes, 4th quarter clutch moments
Example (generic product signal language):
filter_instructions:Status changes and exceptions for <entity>; include human-readable descriptions of what changed
Not Everything Fits in a Perfect Box¶
Shipp is ready to make data accessible for every industry, and that means access patterns will never fit in a perfect box with one way to do it all.
Shipp provides helper APIs to maximize the value of real-time data specific to the industry. Sports has a future games schedule to help determine timing of future games. Other industries will include helper functions to maximize your value of Shipp.
Support is Expanding
Today, the API docs show sports-specific examples and a sports schedule helper. The same “connection + run” pattern is applicable to all industries: you describe what you need; Shipp delivers the relevant event stream.
Step 3 — Create a Connection once, store the connection_id¶
Use the API to create a connection, then persist:
connection_id- your
filter_instructions(for debugging and iteration) - any app-level metadata (screen/user/team/game_id, etc.)
Expanding Support for Meta Fields
We plan to introduce improved support for editing connections and adding arbitrary user metadata to connections so you can programmaticaly organize connections directly in Shipp. Additionally, expanded support to view and edit fields directly should eliminate most use cases for storing anything about your connections outside of Shipp.
Why this matters:
- Faster app (creating connections can take a few seconds and cost credits)
- Lower costs & higher stability (eliminate chances for connections doing something different, fewer credits for creating connections)
- Less work (it's easier to offload management to another service, like Shipp)
Step 4 — Run the Connection to fetch updates¶
To power real-time UX with today’s API surface, use pull-based updates:
- On page load, run the connection with a reasonable
since(or omit for default behavior). - On an interval, re-run with
since_event_idset to the most recent event processed. - Merge/dedupe events into your UI state.
Pull vs Push
Push is a superior method for most of these connections, however it comes with a tradeoff for supporting environments and quick iteration. We are currently investigating how we can implement and support push based connections for the best experience.
Practical UX defaults:
- polling interval: 5–30 seconds depending on your domain and cost sensitivity
- initial
limit: start small (e.g. 25–100) until you learn the feed shape - always surface “last updated” in the UI for trust
Step 5 — Handle schema-flexible data[] defensively¶
Shipp returns data: [{...}, {...}] where each element is a JSON object and the shape can vary by feed and availability.
Rules of thumb for agents/engineers:
- Treat every field as optional.
- Prefer safe access (existence checks) and graceful fallbacks.
- Log unknown shapes in development so you can refine
filter_instructions.
What you can generally rely on:
connection_idin the responsedatais an array- elements may include common fields like
type,category,desc, time fields, and IDs (especially in sports)
Build your UI around:
- a “headline” text (
descwhen present, otherwise a synthesized summary) - a timestamp (if present; otherwise use “received_at” from your app)
- a category/type badge (if present)
- domain-specific highlights (points/period in sports, etc. when present)
Available Data Fields are Extensive
We'll soon have many hundreds of data fields available with specific definitions depending on the industry and even sub-industry (period in Hockey and Basketball are very different). Documenting these fields, though important, is not implemented. We highly encourage testing your connections to understand these fields while our field documentation catch up.
Step 6 — Deduplicate, order, and reconcile¶
Polling-based real-time has normal failure modes: duplicates, late events, missing events.
Recommended reconciliation strategy:
- Keep a rolling set of seen events using the id, e.g.
01KGD5EVM8P0MCFTZ0AJBQZRDD - Prefer ordering by an explicit timestamp if present; otherwise order by id (Lexicographically stable).
- Send the lexicographically largest event id received as
since_event_idto let Shipp send only the freshest data. - If not using ID, Periodically re-run with a wider
sincewindow to self-heal (e.g., last 5–10 minutes) and dedupe.
If you’re storing events server-side:
- Store raw events as JSON for debug.
- Store a derived “latest state” view for fast UI rendering.
Sports-specific helper¶
If you’re building sports experiences use the schedule
to discover current sport games available. Use that context to
craft filter_instructions and create a connection. This also useful for ad-hoc connections on specific games.
This is a good example of how Shipp can provide “discovery endpoints” alongside the core connection pattern as additional industries come online.
What “good” looks like (business value checklist)¶
A real-time feature is doing its job when you can say:
- “Users trust it while they’re watching it.”
- “It reduces manual refresh and uncertainty.”
- “It prevents bad decisions with stale state.”
- “It creates urgency or confidence at the right moments.”
Measurable outcomes often include:
- higher conversion (fewer stale availability/pricing surprises)
- lower support (fewer “what’s happening?” tickets)
- better retention (users return to live status)
- better automation (agents can act on fresh signals)
- faster iteration (change the product without rebuilding pipelines)
Agent-friendly implementation prompt¶
When instructing an agent, include a fully testable spec. For example:
- “Build a watch screen that displays live events from Shipp.
- Create a Shipp connection using
POST https://api.shipp.ai/api/v1/connections/create?api_key=...withfilter_instructions=<paste>. - Persist the returned
connection_id. - On initial load, run
POST https://api.shipp.ai/api/v1/connections/{connection_id}?api_key=...with{ "limit": 50 }. - Every 10 seconds, re-run the connection with
{ "since_event_id": "<most recent id>", "limit": 5 }. - Render each event defensively (schema-flexible). Prefer
descwhen present. - Show a “Last updated” indicator and a manual refresh button.
- If no updates succeed for 2 minutes, show a stale warning and keep retrying with backoff.
- Never expose the API key in client code; store it as a server-side secret.”
Next steps¶
- Go through a practical example with Instructions
- Follow a platform guide to connect Shipp to your AI builder: Lovable
- Review the implemented endpoints and examples: API Reference