!

Legal Disclaimer

PipeAgent is a data distribution gateway. We do not own, verify, or endorse the data provided by third-party creators. Use at your own discretion.

Docs/provider / api for agents

Provider Push API — for AI Agents

Use this page when you ingest or update feed data for a feed the user owns. Providers push with POST using a write key. Consumer read APIs (GET /v1/feed/...) are documented separately: Consumer API — for AI Agents.

Base URL: https://api.pipeagent.dev

---

Authentication

1. Create a Provider / write API key in the Dashboard (keys with push permission for that feed’s owner account).

2. Only Bearer auth is shown for push (hashed server-side; always HTTPS):

http
POST /api/v1/provider/feed/{feed_id}/push
Authorization: Bearer <PROVIDER_WRITE_API_KEY>
Content-Type: application/json
  • feed_id: UUID of the feed you control. Wrong owner or unknown id → 403. Non-write key → 403.
  • Pushes are rate-limited per feed: 20 requests / minute (sliding window); excessive traffic → 429 with retry_after_ms and X-RateLimit-* headers.
  • ---

    Request body (all feed types)

    Send a JSON object. Prefer an explicit wrapper:

    FieldRequiredNotes
    payloadYes*Main data: object or array of objects (see type below).
    idPer-rowCollection & stream: each row must have a unique id (string or number).
    batch_idNoCollection only — same id across chunked HTTP requests.
    batch_completeNoCollection onlytrue on the last chunk to finalize the batch and retire older batches.

    \*Legacy: top-level body may be the payload alone; prefer { "payload": ... }.

    If schema lock is enabled, invalid payloads → 422 with field paths.

    ---

    Push semantics by feed_type

    Typepayload shapeBehavior
    singletonSingle objectEach successful push replaces all stored data for that feed with one document.
    collectionArray of objects (or one object → one row)Inserts into the current batch; use batch_id + batch_complete for multi-request uploads.
    streamArray or single objectAppends events; no batch_id / batch_complete. Idempotent retries rely on unique row id.

    Choosing a type: Feed types (Provider). Publishing standards: Publishing Guidelines.

    ---

    Payload size & row limits (push)

    Enforced on POST .../push (defaults; deployments may override via env):

    GuardrailSingletonCollection & stream
    Max HTTP body4 MB2 MB
    Max JSON per row50 KB (UTF-8 of serialized row)
    Max rows per request500

    413 Payload Too Large — response may include a limit hint (singleton_body, request_body, row_count, row_payload, etc.). Split large backfills into multiple requests; use collection with chunked batch_id for big snapshots.

    Same limits are summarized for operators in Usage Limits (section Provider push).

    ---

    Errors (push-related)

    CodeMeaning
    401Missing/invalid auth.
    403Not a write key, or not the feed owner.
    413Body or row over limits.
    422Schema validation failed (schema lock).
    429Push rate limit — backoff.

    ---

    Earnings & compliance

    Revenue and payouts: Earnings & Payouts. License you grant to consumers: Data License. Operational expectations (uptime, PII, sourcing): Publishing Guidelines.

    ---

    Programmatic Feed Management (Create / Edit)

    Use these endpoints when an agent/automation wants to create or edit feeds on behalf of a provider.

    Auth: same write key as push

    Marketplace visibility: New feeds default to is_public = false (unlisted). They are fully usable via direct link and GET /v1/feed/{id}, but GET /v1/catalog and GET /v1/search only return feeds with is_public = true. Operators enable public discovery after review (for example via a marketplace featuring request in the dashboard).

    Create feed

    http
    POST /api/v1/provider/feed/create
    Authorization: Bearer <PROVIDER_WRITE_API_KEY>
    Content-Type: application/json

    Core fields (mirror dashboard wizard):

  • name (string, required) — Feed display name
  • description (string) — Short marketing description
  • readme_md (string) — Long-form docs in Markdown
  • endpoint_path (string, required) — URL slug; must be unique
  • feed_type (string) — singleton \| collection \| stream (aliases: snapshot, version_collection, time_stream)
  • schema_definition (object, required unless status = "draft") — JSON Schema for payload
  • schema_version (number, default 1)
  • schema_locked (boolean) — true to enforce strict validation on push
  • sample_response (any JSON) — Example payload used by docs/Workbench
  • sync_interval_mins (number, default 60) — How often the feed is expected to refresh
  • status (string) — "draft" or "inactive" on create (publish flow still goes through push + dashboard)
  • draft_step (number) — Optional wizard step tracking
  • Pricing model (mutually consistent):

  • price_type:
  • - "free"price_per_1k = 0, one_time_price_cents = null

    - "metered" → requires price_per_1k > 0

    - "one_time" → requires one_time_price_cents >= 100 (USD cents, i.e. $1.00+)

  • If price_type is omitted, it is derived:
  • - one_time_price_cents != null"one_time"

    - else price_per_1k > 0"metered"; otherwise "free"

    Feed creation quota: Each provider account has a per-user cap max_feeds_allowed in the database (default 3 for early access). Every feed row counts toward the cap, including drafts. Updating an existing feed (same id) does not consume an extra slot. The dashboard and this API enforce the limit; the database also blocks excess inserts so quotas cannot be bypassed via PostgREST. For creates with an existing owned id, the server issues an UPDATE (new rows use INSERT) so quota checks align with net-new feeds only.

    If you exceed the cap when creating a new feed, the API returns 403 with JSON code: "FEED_QUOTA_EXCEEDED" and an error message. To raise the limit, contact operations or email support@pipeagent.dev.

    On success you get the full feeds row back (including id).

    Edit feed

    http
    PATCH /api/v1/provider/feed/{feed_id}/edit
    Authorization: Bearer <PROVIDER_WRITE_API_KEY>
    Content-Type: application/json
  • feed_id — UUID of a feed owned by this provider (same account as the write key)
  • Body fields are the same shape as create; all are optional (patch semantics)
  • Ownership is enforced server-side (feed must belong to the write key’s account). Listing in the keyed catalog/search APIs requires is_public = true; providers cannot toggle that flag via create/edit APIs.
  • Additional rules:

  • You cannot move to status = "active" until the feed has at least one successful push
  • (same as dashboard: first push will set status to active and stamp last_sync_at)

  • On any non-draft target state, a non-empty schema_definition is required
  • Pricing consistency rules are identical to create
  • #### Example (agent creates a one-time feed)

    bash
    curl -X POST "https://api.pipeagent.dev/api/v1/provider/feed/create" \
      -H "Authorization: Bearer $PROVIDER_WRITE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Top GitHub AI Repositories",
        "description": "Curated list of trending AI repos with stars and topics.",
        "readme_md": "# GitHub AI Repos\nCurated daily by your agent.",
        "endpoint_path": "github-ai-repos",
        "feed_type": "collection",
        "price_type": "one_time",
        "one_time_price_cents": 1990,
        "schema_definition": {
          "type": "object",
          "properties": {
            "id": { "type": "string" },
            "name": { "type": "string" },
            "stars": { "type": "integer" }
          },
          "required": ["id", "name"]
        },
        "schema_locked": true,
        "schema_version": 1,
        "sample_response": { "id": "cool-project", "name": "cool-project", "stars": 4200 },
        "sync_interval_mins": 60,
        "status": "inactive"
      }'

    ---

    Related

  • Feed types (Provider — push) — full examples and batching patterns
  • Consumer reads — how agents read what you pushed
  • Version 1.0.4 - Premium Infrastructure