agentCLAWHUBUnverified

sportsinc-sportslink

Sports Inc SportsLink API adapter — pull a dealer's invoices ("documents") from the Sports Inc SportsWeb Invoice Center and mark them consumed. Sports Inc is a buying group that does NOT send individual vendor invoices; its SportsLink REST API is where the invoices live. Use when you need to retrieve Sports Inc invoices for payables — "get the Sports Inc invoices", "pull SportsLink documents", "fetch this month's SI invoices to match against POs". This is the SOURCE adapter only: it authenticates, pages, normalises each SI document into a common invoice shape (po_number, invoice_number/date, lines[], charges, total, is_credit), and marks documents historical once imported. Some documents are scanned rather than EDI, so the API returns their header totals with NO line items (`has_lines: false`) — every retrieval names those in `needs_line_recovery`, and they are not billable as returned. For each, this skill logs in to the SportsWeb portal, downloads the invoice PDF, OCRs the scanned vendor invoice into text for the agent to read, and then checks the extracted lines against the API's own merchandise total before any of it is billable. It is customer-agnostic (every Sports Inc dealer uses this same API) and touches no ERP — pair it with a payables workflow (e.g. `drivethru-payable-matching`) to match against POs and create the bill.

OpenClaw

Rank

62

Safety

84

Downloads

1.1k

Updated

Oct 11, 2026

Version

0.7.1

Source

CLAWHUB

About

What it does, and when to use it.

Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.

Avoid when

  • Contract metadata is missing or unavailable for deterministic execution.

Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing

Public facts

Every fact links back to the source it came from.

Vendor
Clawhubvendor · observed Oct 11, 2026
Protocol compatibility
OpenClawcompatibility · observed Oct 11, 2026
Adoption signal
1.1K downloadsadoption · observed Oct 11, 2026
Latest release
0.7.1release · observed Aug 7, 2026
Handshake status
UNKNOWNsecurity

Install and run

Setup complexity: low.

clawhub skill install s17fq291581evd78xzn1930b0n87bfny:sportsinc-sportslink
  1. Install using `clawhub skill install s17fq291581evd78xzn1930b0n87bfny:sportsinc-sportslink` in an isolated environment before connecting it to live workloads.
  2. No published capability contract is available yet, so validate auth and request/response behavior manually.
  3. Review the upstream CLAWHUB listing at https://clawhub.ai/zmtucker/sportsinc-sportslink before using production credentials.

Contract: missing

curl -s "https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-sportsinc-sportslink/snapshot"

Documentation

CLAWHUB

147,130 characters of source documentation, loaded on request.

Extracted files

5 files captured from the source.

SKILL.md

---
name: sportsinc-sportslink
description: >
  Sports Inc SportsLink API adapter — pull a dealer's invoices ("documents")
  from the Sports Inc SportsWeb Invoice Center and mark them consumed. Sports
  Inc is a buying group that does NOT send individual vendor invoices; its
  SportsLink REST API is where the invoices live. Use when you need to retrieve
  Sports Inc invoices for payables — "get the Sports Inc invoices", "pull
  SportsLink documents", "fetch this month's SI invoices to match against POs".
  This is the SOURCE adapter only: it authenticates, pages, normalises each SI
  document into a common invoice shape (po_number, invoice_number/date,
  lines[], charges, total, is_credit), and marks documents historical once
  imported. Some documents are scanned rather than EDI, so the API returns their
  header totals with NO line items (`has_lines: false`) — every retrieval names
  those in `needs_line_recovery`, and they are not billable as returned. For
  each, this skill logs in to the SportsWeb portal, downloads the invoice PDF,
  OCRs the scanned vendor invoice into text for the agent to read, and then
  checks the extracted lines against the API's own merchandise total before any
  of it is billable. It is customer-agnostic (every Sports Inc
  dealer uses this same API) and touches no ERP — pair it with a payables
  workflow (e.g. `drivethru-payable-matching`) to match against POs and create
  the bill.
version: 0.7.1
emoji: 🏟️
homepage: https://www.sportsinc.com
metadata:
  openclaw:
    requires:
      # SPORTSINC_API_KEY is deliberately NOT listed here. openclaw gates a
      # skill OUT of the model's view when a `requires.env` key is absent from
      # the *boot* environment — but in A2A mode (see "Agent-to-Agent (A2A)
      # Mode" below) this key is brokered per-turn by the platform and is
      # absent at boot by design, so gating on it would hide this skill from
      # the very delegated flow it exists to serve. The key stays fully
      # documented via `primaryEnv`/`envVars`, and the helper self-guards at
      # runtime (`config_error`/`auth_error`) when it is genuinely missing.
      # `python3` stays gated because it must be present at boot.
      bins: [python3]
    primaryEnv: SPORTSINC_API_KEY
    envVars:
      SPORTSINC_API_KEY:
        required: true
        description: >
          SportsLink API key, sent as the `X-API-KEY` header. Request one from
          [email protected]. Treat as a secret; never paste into chat.
      SPORTSINC_API_URL:
        required: false
        description: Base URL, default `https://api.sportsinc.com/`.
      SPORTSINC_DRY_RUN:
        required: false
        description: If truthy, `mark-historical` is simulated (no state change).
      SPORTSINC_WEB_USERNAME:
        required: false
        description: >
          SportsWeb portal login, used only by `fetch-invoice-doc` to pull a
          scanned document's PDF. This is the dealer's own portal user and is
          SEP

_meta.json

{
  "ownerId": "kn715tnf30wegyr6mdbfa17avd87bjr6",
  "slug": "sportsinc-sportslink",
  "version": "0.7.1",
  "publishedAt": 1786111175182
}

references/pdf_extraction.md

# Reading a Sports Inc invoice PDF — extraction guide

You are here because a SportsLink document came back `has_lines: false`. Sports
Inc scanned it rather than receiving it as EDI, so the API has the header money
but no line items.

The *interpretation* is *your* job. The Python around you does everything
deterministic first: it fetches the PDF, classifies its pages, extracts the
scanned ones, **OCRs them into text**, and then audits the lines you hand back.

So you are normally reading text, not looking at a picture. That ordering is
deliberate — text is a fraction of the context cost, and it can be diffed,
grepped and logged. The images stay on disk for when the text is not good
enough, and there is no extraction *model* anywhere in the pipeline: OCR
transcribes, you interpret, arithmetic checks.

## The loop

```bash
# 1. Get the document and make it readable.
python3 scripts/sportslink.py fetch-invoice-doc '{"si_doc_number": 24682750}'

# 2. You read it. (This document.)

# 3. Hand the lines back to be checked against the API's header money.
python3 scripts/sportslink.py reconcile-lines '{"si_doc_number": 24682750, "lines": [...]}'
```

Step 3 returns `status: "verified"` — a normalised invoice the payables workflow
consumes exactly like an EDI one — or `status: "needs_review"`. **Only a
`verified` invoice may be billed.**

## What a Sports Inc download actually contains

Not one invoice. A stack of documents, each of which is two parts:

| | Page | Content |
|---|---|---|
| **SI cover** | landscape, native text | Sports Inc's own invoice. **No line detail** — it says, in as many words, `SEE VENDOR INVOICE FOR DETAIL.` Carries the SI document number, the PO number, and the totals. |
| **Vendor invoice** | portrait, usually a **300dpi scan** | The actual supplier invoice. **This is where the line items are.** |

One PDF routinely holds several of these pairs — one per SI document on the PO.

**Ignore the SI cover pages.** They are useless for extraction; if they held line
detail, the API would have had it too. Their only jobs are to divide the stack
into documents and to tell you which SI document number each vendor invoice
belongs to.

`fetch-invoice-doc` does that division for you:

```json
"documents": [
  {"si_cover_page": 1, "detail_pages": [2], "detail_is_scanned": true,
   "si_doc_number_candidates": [24682750], "supplier_doc_candidates": ["SI3503366"],
   "matches_requested": true},
  {"si_cover_page": 3, "detail_pages": [4], "detail_is_scanned": true,
   "si_doc_number_candidates": [24684277], "supplier_doc_candidates": ["SI3503509"],
   "matches_requested": false}
]
```

**Extract the document with `matches_requested: true`, and reconcile one document
at a time.** Its lines tie to *its* SI document's totals, not to the stack's.
The others in the same PDF are separate SI documents with their own
`si_doc_number`; handle each with its own `fetch-invoice-doc` /
`reconcile-lines` pair. If nothing matches, `notes` will say so — stop and 

references/sportslink_api.md

# SportsLink API — reference (distilled from the 2024 Dealers spec)

The `scripts/sportslink.py` helper wraps all of this; read here when you need a
parameter, a field, or the semantics behind one.

## Basics

- **Base URL:** `https://api.sportsinc.com/`
- **Auth:** API key in the `X-API-KEY` request header. Request one from
  `[email protected]`.
- **Limits:** max **1000 documents per call** — page. Don't retrieve before
  **~10:30am ET** (SI internal processing completes first).

## GET `/dealers/documents/` — the invoices

Returns JSON documents from the SportsWeb Invoice Center.

### Query parameters (all optional)

| Param | Type | Notes |
|---|---|---|
| `poNumber` | string | **Dealer PO number** — the match key to your ERP PO |
| `supplierDocNumber` | string | The underlying supplier's document number |
| `siDocNumber` | int | Sports Inc's document id (used to mark historical) |
| `siDocDate` / `siDocStartDate` / `siDocEndDate` | date `yyyy-MM-dd` | SI processing date. A single date or `start,end`. Start-only = on/after; end-only = on/before |
| `supplierDocDate` / `supplierDocStartDate` / `supplierDocEndDate` | date | Supplier document date, same range semantics |
| `lines` | bool (default false) | Include line-item data — **EDI documents only** |
| `active` | bool (default false) | Only documents **not** marked historical (the un-imported inbox) |
| `moveToHistorical` | bool (default false) | Mark the returned docs historical **on read** — ⚠️ do NOT use for billing (marks before you've billed); use the PATCH endpoint after billing instead |
| `excludeScannedDocuments` | bool (default false) | Only documents with line-item data (EDI); scanned/OCR docs have none |
| `fields` | string[] | Sparse fieldset — return only these properties |
| `page` / `pageSize` | int | Paging (`pageSize` default = total doc count) |
| `orderBy` (default `SIDocDate`) / `orderByDescending` | string / bool | Sorting |

Example: `GET /dealers/documents/?siDocDate=2024-01-31&lines=true&active=true`

### Response envelope

`{ items: [ …document… ], pageNumber, pageSize, totalPages, totalCount,
hasPreviousPage, hasNextPage, orderBy, orderByDescending }`

### Document (header) fields

`poNumber`, `siDocNumber`, `siDocDate`, `dueDate`, `discountDate`,
`requestedShipDate`, `shipDate`, `supplierDocNumber`, `supplierDocDate`,
`supplier`, `isCredit`, plus money: `merchandiseTotal`, `freightAmount`,
`freightAllowance`, `discountAmount`, `siUpcharge`, `svcHandleCharge`,
`salesTax`, `exciseTax`, `docTotal`. Also `termsOfPayment`, `termsOfDelivery`,
`carrier`, `weight`, `trackingNumber`, `methodOfPayment`, `supplierAddress{}`,
`shippingAddress{}`. Missing/OCR-unavailable properties are simply omitted.

### Line fields (EDI only)

`supplierItemNumber`, `upc`, `quantityShipped`, `quantityOrdered`,
`quantityBackOrdered`, `unit`, `listPrice`, `discountPercent`, `netPrice`,
`extension`, `size`, `color`, `description`.

`docTotal` = `merchandiseTotal` + `siUpcharge` + `svcHa

references/sportsweb_flow_notes.md

# SportsWeb portal — invoice PDF flow

The reverse-engineered flow behind `scripts/sportsweb_browser.py`, captured from
a live walkthrough of the portal.

**Status: confirmed end to end on the live portal.** A `capture-portal` run with
`probe_download` logged in, searched, parsed both P13554 rows, ticked one, and
pulled back a 121,619-byte PDF in 17.9 seconds — see "What the live run proved"
below.

## Hosts

| | |
|---|---|
| Public site | `https://www.sportsinc.us/` — Wix marketing site. **The entry point**: its DEALER LOGIN button must be *clicked*. |
| Login entry | `https://swv3.sportsinc.com/login-redirect` — the button's href. **Returns 403 on a direct hit**; only works as a click-through. |
| Identity provider | `https://sportsweb.us.auth0.com/u/login?state=…` (Auth0 Universal Login) |
| **Home screen** | `https://swv3.sportsinc.com/home` — where login lands, and the **only** page with a search box |
| Invoice Center | `https://swv2h.sportsinc.com/Member/InvoiceCenter/Default.aspx` — where the search navigates to |

**Home and the Invoice Center are different hosts.** That is not cosmetic: a
session check pointed at `swv2h` can never find the search box, so it always
reports "not logged in" and sends every run through a full login it did not
need. `SPORTSINC_WEB_HOME_URL` overrides the home; `SPORTSINC_WEB_BASE_URL` the
Invoice Center host.

The Invoice Center is **ASP.NET WebForms**; the home screen around it is a Vue
app. Both appear in the flow.

## Waiting — never on `networkidle`

The home screen is a Vue app that holds connections open, so `networkidle` may
simply never arrive. Waiting on it is indistinguishable from a hang, and it is
what made the first live run appear to freeze. Every wait is for a concrete
element, timeouts default to 25s (`SPORTSINC_WEB_TIMEOUT_MS`), and every step is
recorded with elapsed milliseconds in the `trace` that `capture-portal` returns —
so a slow run reports where it is instead of going quiet. A selftest guards
against `networkidle` being reintroduced.

## Selector strategy

Generated ids are avoided where they are truly generated, but WebForms ids have
a useful property: `ctl00_ContentPlaceHolder1_grdInvoices` is
`<framework prefix>_<developer's control name>`. The **suffix** is authored and
stable; the prefix is the framework's. So controls are matched on the suffix —
`table[id$='grdInvoices']`, `input[id$='_chkItem']`,
`a[id$='lbDisplayDownload']` — which survives a page restructure that moves the
prefix. Auth0's classes are per-build hashes (`c72825458`) and are never used;
its ids (`#username`, `#password`) are.

A row is matched on its **SI Doc No.** cell, never by position. Downloading the
wrong invoice is the one failure reconciliation cannot catch: another document's
lines are internally consistent and simply tie to a different header.

---

## Step 1 — Login ✅ confirmed live

Load `https://www.sportsinc.us/` and **click** the DEALER LOGIN button
(`a[href*='login-redirect']` — its Wix classe
Github ReposUpdated 2d agoRank 70

AionUi

Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

activepieces

AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW

Machine-readable data

The same record, as JSON, for agents and crawlers.

{
  "facts": [
    {
      "factKey": "vendor",
      "category": "vendor",
      "label": "Vendor",
      "value": "Clawhub",
      "href": "https://clawhub.ai/zmtucker/skills/sportsinc-sportslink",
      "sourceUrl": "https://clawhub.ai/zmtucker/skills/sportsinc-sportslink",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-11T06:25:36.608Z",
      "isPublic": true
    },
    {
      "factKey": "protocols",
      "category": "compatibility",
      "label": "Protocol compatibility",
      "value": "OpenClaw",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-sportsinc-sportslink/contract",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-sportsinc-sportslink/contract",
      "sourceType": "contract",
      "confidence": "medium",
      "observedAt": "2026-10-11T06:25:36.608Z",
      "isPublic": true
    },
    {
      "factKey": "traction",
      "category": "adoption",
      "label": "Adoption signal",
      "value": "1.1K downloads",
      "href": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceUrl": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-11T06:25:36.608Z",
      "isPublic": true
    },
    {
      "factKey": "latest_release",
      "category": "release",
      "label": "Latest release",
      "value": "0.7.1",
      "href": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceUrl": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-08-07T13:59:35.182Z",
      "isPublic": true
    },
    {
      "factKey": "handshake_status",
      "category": "security",
      "label": "Handshake status",
      "value": "UNKNOWN",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-sportsinc-sportslink/trust",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-zmtucker-sportsinc-sportslink/trust",
      "sourceType": "trust",
      "confidence": "medium",
      "observedAt": null,
      "isPublic": true
    }
  ],
  "events": [
    {
      "eventType": "release",
      "title": "Release 0.7.1",
      "description": "Version 0.7.1 introduces scanned invoice PDF retrieval, OCR extraction, and new dependencies for full header-only document recovery: - Added support for header-only (scanned) invoices: identifies these in every retrieval via a new needs_line_recovery field. - New commands to fetch scanned invoice PDFs from the SportsWeb portal and reconcile their lines after manual/OCR review. - Introduced OCR extraction for scanned PDFs, extracting readable text via rapidocr/tesseract or providing images if OCR is off. - Significant increase in environment variables for portal credentials, OCR, and PDF handling. - Added several dependencies: pypdf, pillow, playwright, rapidocr-onnxruntime. - Updated documentation to detail scanned-document recovery workflow, configuration, and command usage.",
      "href": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceUrl": "https://clawhub.ai/zmtucker/sportsinc-sportslink",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-08-07T13:59:35.182Z",
      "isPublic": true
    }
  ]
}

Record generated Oct 11, 2026.

Sponsored

Ads related to sportsinc-sportslink and adjacent AI workflows.