Store

Browse approved apps, skills, agents, and flows from the public store.

These endpoints power Apps and the skill registry. They return store listings (metadata, category, rank, tags) — not full app manifests or skill instructions.

No API key is required. See REST overview — response format.

→ Search API — semantic discovery across apps, skills, and knowledge
→ Skills API — skill content, versions, and management
→ Apps API: your workspace's apps and deploy workflows


List store categories

GET /store/categories

Returns every marketplace category with display metadata and a live count of public store listings in that category. Categories are shared across app, skill, MCP, and other store surfaces. The web app Apps loads GET /store/categories?type=app for category chips; List approved apps category filters and MCP server tools such as app_list and mcp_list accept the same slugs.

No API key is required. Results are sorted by rank (ascending), then slug (ascending). Categories with no matching public listings still appear with count: 0 so browse UIs can show the full catalog.

Query parameters

ParameterDescription
typeOptional store resource type: app, agent, flow, skill, knowledge, or mcp. When set, count includes only public listings of that type. When omitted, count aggregates listings across all store resource types. Unknown values return 400.

Response (StoreCategoryDTO[])

FieldDescription
slugCategory slug (image, video, decision, developer, …) — same values as category on Apps API app objects and as category filters on List approved apps
nameDisplay name (for example Image, Decision)
descriptionShort category blurb for browse UIs
iconIcon key used by the web app (for example image, split)
rankSort order in category pickers (lower = earlier)
countNumber of public store listings in this category (scoped by type when provided)
bash
1curl "https://api.inference.sh/store/categories?type=app"
json
1{2  "data": [3    {4      "slug": "image",5      "name": "Image",6      "description": "Generate, edit and understand images.",7      "icon": "image",8      "rank": 10,9      "count": 12810    },11    {12      "slug": "decision",13      "name": "Decision",14      "description": "Classify, route and score with calibrated probabilities.",15      "icon": "split",16      "rank": 65,17      "count": 418    }19  ]20}

Use this endpoint for category sidebars and filters. Listing category / subcategory fields on GET /store/apps still describe each app row; this endpoint is the canonical category catalog. App objects use a subset of these slugs for category (Apps API — App category). Skill and connector listings may use additional slugs (for example developer, productivity) that appear here but not on every app. Store listings can carry one to three categories when published; app Grid cards show a primary category field derived from the listing. See Browsing the Grid — Categories.


List browseable tags

GET /store/tags

Returns app tag slugs that at least three public apps carry, with a display title and count. The web app Apps loads this list for the tasks tag filter in the explore sidebar (wide screens) and the horizontal tag row on small screens — labels are the slug with hyphens replaced by spaces; the title field is for API clients and other UIs. Tags on fewer public apps are still valid on apps and in tag filters on List approved apps; they are omitted here until usage crosses that bar.

No API key is required. Results are sorted by count (descending), then slug (ascending).

Response (StoreTagDTO[])

FieldDescription
slugTag slug (text-to-image, lora, …) — same format as tags on Apps API
titleHuman-readable label (for example Text to Image). Tags without a curated title use title-cased words from the slug (virtual-try-on → Virtual Try On).
countNumber of public apps that carry the tag
bash
1curl "https://api.inference.sh/store/tags"
json
1{2  "data": [3    { "slug": "text-to-image", "title": "Text to Image", "count": 42 },4    { "slug": "open-weights", "title": "Open Weights", "count": 18 }5  ]6}

Use this endpoint (not generated SDK enums) for tag pickers, browse surfaces, and display titles. Older SDK releases exported AppTag / AppTagTitle constants; those were removed in favor of this API.


List approved apps

GET /store/apps or POST /store/apps/list

Returns apps with an approved store version, sorted by rank (descending) when you omit sort. Apps with status retired are excluded. Other statuses (active, maintenance, deprecated) may appear when the underlying app is public — see Apps API — App lifecycle status.

Query parameters (GET)

ParameterDescription
cursorPagination cursor
limitPage size (default 10)
directionforward or backward (default forward)
filtersJSON array of { "field", "value", "operator" } filters
sortJSON array of { "field", "dir" } sort orders
searchJSON object { "term", "fields", "exact" } for text search (term is the query string)

POST accepts the same fields in the JSON body.

Filters

Pass filters as a JSON array on GET (filters=...) or in the POST body. Each entry is { "field", "value", "operator" } with operator typically eq.

FieldDescription
categoryCategory slug from List store categories (image, video, audio, chat, 3d, decision, …) — app category values are a subset; see Apps API — App category
tagApps whose tags array contains the slug (for example text-to-image). Matches Apps API — App tags

The web app Apps explore page uses category and tag filters together with text search.

bash
1curl -X POST https://api.inference.sh/store/apps/list \2  -H "Content-Type: application/json" \3  -d '{4    "limit": 20,5    "filters": [6      { "field": "category", "value": "image", "operator": "eq" },7      { "field": "tag", "value": "text-to-image", "operator": "eq" }8    ]9  }'

Response (PublicAppStoreDTO)

FieldDescription
idApp / listing ID (same as app ID)
namespace, nameApp ref (namespace/name)
descriptionShort description
category, subcategoryGrid grouping
tagsTask and trait slugs from the app (text-to-image, lora, …). Same values as tags on Apps API app objects.
imagesApp card images
is_featuredFeatured in the Grid
rankSort rank (higher = more prominent)
has_approved_versionAlways true for this endpoint
page_idOptional docs page link
bash
1curl "https://api.inference.sh/store/apps?limit=20"
bash
1curl -X POST https://api.inference.sh/store/apps/list \2  -H "Content-Type: application/json" \3  -d '{"limit": 20, "search": {"term": "whisper", "fields": ["name", "description"]}}'

Pagination matches other cursor list endpoints (items, next_cursor, has_next, …).


Get app store listing

GET /store/apps/{appId}

Returns store metadata for one approved app (AppStoreListingDTO). Use this when you already have an app ID from a list response.

FieldDescription
allows_private_workersWhether the app can run on private engines
allows_cloud_workersWhether the app can run on cloud workers
max_concurrencyGlobal cap on concurrent runs for this app across the platform (0 = no cap)
max_concurrency_per_teamPer-workspace cap on concurrent runs (0 = no cap)
min_concurrencyDisplacement floor: while this many or fewer cloud workers hold the app, other apps cannot evict them (0 = no floor). It does not start workers. See Reserved cloud capacity below.
required_featureOptional entitlement resource (for example feature:seedance) your workspace must have explicitly granted (enabled: true) to run this app. A missing entitlement row is denied, not treated as unrestricted. When blocked, task dispatch returns feature_not_available (403) with addon plan metadata when an addon unlocks the feature. See Entitlements API.
category, subcategory, tags, rank, is_featuredStore presentation metadata
bash
1curl "https://api.inference.sh/store/apps/app_abc123"

Reserved cloud capacity (min_concurrency)

When min_concurrency is greater than zero, a worker holding the app is not evicted for another app's task while min_concurrency or fewer workers hold it. It is displacement protection only: the scheduler does not start or pre-load workers to reach the number. An app with no worker holding it gets no protected workers until a task loads it.

BehaviorDetail
Cloud workers onlyPrivate workers are not protected by min_concurrency
Same-app tasksWorkers already running the app can still accept new tasks for that app
DisplacementA worker can be reclaimed only when more than min_concurrency workers currently have the app loaded
Task failureIf every matching cloud worker holds another app's floor, a queued task waits 2 minutes from when the block is first seen, then fails with no online worker can run this app

It is part of the app's runtime policy, set by the platform per app. Workspaces cannot configure it. See Workers concept and Task failure messages.


Get app pricing

GET /store/apps/{appId}/pricing

Returns the published pricing config for the app's current store version (AppPricing — CEL expressions, price variables, rendered description). Used by public app pages.

bash
1curl "https://api.inference.sh/store/apps/app_abc123/pricing"

→ Usage-based pricing · Get task cost


Estimate app cost

POST /store/apps/{appId}/estimate

Preview run cost before dispatch. Evaluates pricing expressions that only depend on task inputs (task_inputs, prices, fees, task_function). When fee expressions need post-execution data (outputs, elapsed_ms, elapsed_seconds, resource_fee, and so on), the API falls back to the app's estimate CEL expression if one is configured in AppPricing.

No authentication required.

Request body

FieldTypeDescription
inputobjectTask input map (same shape as POST /run)
functionstringOptional function name for multi-function apps

Response (EstimateCostResponse)

FieldTypeDescription
confidencestringexact (all fees input-based), range (estimate returned min/max), or unknown (post-execution data required)
microcentsint64Set when confidence is exact
min, maxint64Set when confidence is range
depends_onstring[]Post-execution variables needed when confidence is unknown
estimate_errorstringPresent when an estimate expression exists but failed to evaluate; confidence is unknown and depends_on is still populated
pricing_descriptionstringRendered human-readable pricing string

Example (exact estimate):

bash
1curl -X POST "https://api.inference.sh/store/apps/app_abc123/estimate" \2  -H "Content-Type: application/json" \3  -d '{"input": {"n": 4}}'
json
1{2  "confidence": "exact",3  "microcents": 2000000,4  "pricing_description": "$0.02 per image"5}

Example (range estimate via estimate expression):

json
1{2  "confidence": "range",3  "min": 150000,4  "max": 1500000,5  "pricing_description": "About $0.0015–$0.015 per run"6}

Example (unknown — output-dependent pricing, no estimate expression):

json
1{2  "confidence": "unknown",3  "depends_on": ["outputs"]4}

Example (estimate_error — estimate expression failed):

json
1{2  "confidence": "unknown",3  "estimate_error": "no such key: max_tokens",4  "depends_on": ["outputs"]5}

→ Usage-based pricing — authoring estimate expressions
→ Evaluate CEL pricing — preview draft formulas with sample output_meta


List approved skills

GET /store/skills or POST /store/skills/list

Returns skills with an approved store listing. Same cursor, filter, sort, and search parameters as List approved apps.

Response (PublicSkillStoreDTO)

FieldDescription
idSkill / listing ID
namespace, nameSkill ref (namespace/name)
descriptionShort description
categoryRegistry grouping
tagsListing tags (when set on the skill store listing)
is_featuredFeatured in the registry
rankSort rank
has_approved_versionAlways true for this endpoint
bash
1curl "https://api.inference.sh/store/skills?limit=20&filters=%5B%7B%22field%22%3A%22namespace%22%2C%22value%22%3A%22inferencesh%22%2C%22operator%22%3A%22eq%22%7D%5D"

Example filters value (URL-encoded above):

json
1[{"field": "namespace", "value": "inferencesh", "operator": "eq"}]

Get skill store listing

GET /store/skills/{skillId}

Returns store metadata for one skill (SkillStoreListingDTO), including installs and uses counts.

bash
1curl "https://api.inference.sh/store/skills/skill_abc123"

To fetch skill content (instructions and files), use Skills API (GET /skills/{namespace}/{name}/content).


List approved agents

GET /store/agents or POST /store/agents/list

Returns public agents with a live store listing, in listing order, as AgentDTO objects. Same cursor, filter, sort, and search parameters as List approved apps; search reads the agent's name and title. POST /agents/list lists your workspace's agents instead.

bash
1curl "https://api.inference.sh/store/agents?limit=20"

List approved flows

GET /store/flows or POST /store/flows/list

Returns public flows with a live store listing, in listing order, as FlowDTO objects. Same parameters as List approved apps; search reads the flow's name, title, and description. POST /flows/list lists your workspace's flows instead.

bash
1curl "https://api.inference.sh/store/flows?limit=20"

Count listings per type

GET /store/counts

Returns how many public listings each resource type has (app, agent, flow, skill, knowledge, mcp). A type with none is absent. Explore hides the tabs that would list nothing.

bash
1curl "https://api.inference.sh/store/counts"
json
1{ "app": 446, "skill": 128, "mcp": 37, "agent": 12 }

Listings when a resource is deleted

When you delete an app, skill (knowledge entry), agent, flow, or MCP server, the platform removes its store listing in the same operation. The listing is marked delisted, disappears from publisher admin views and public store browse APIs, and the listing history records that the resource was deleted. Search indexing removes the resource via the normal delete path.


Marketplace listing pages (public)

GET /marketplace/{type}/{namespace}/{name} returns the public detail (MarketplaceDetailDTO) for one live listing. No API key is required. type is app, skill, mcp, agent, flow, or knowledge. Listing slugs are namespace/name for most types; MCP listings use namespace/server_slug.

bash
1curl "https://api.inference.sh/marketplace/app/inferencesh/whisper"

Signed-in callers can report a listing with POST /marketplace/{type}/{namespace}/{name}/report (apps:read).


Publisher marketplace (authenticated)

Most routes need apps:read or apps:write. Publisher profile routes need teams:read / teams:write and the workspace edit profile capability. Every route that changes a listing (draft, edit, submit, review messages, delist, relist, publish, withdraw) also needs edit profile on the listing's workspace, since a listing is the team's public profile; write access on the resource alone returns 403 team_role_required. POST /store/submit requires a person (a signed-in user or their personal key), not a workspace API key.

Publishing invitation

New marketplace publish actions are invitation-only. Before POST /store/listings/draft, POST /store/check, or POST /store/submit, the API checks the workspace entitlement feature:marketplace_publish. A missing or disabled grant returns 403 feature_not_available:

the marketplace takes submissions by invitation for now; join the waitlist to be let in

Reading listings your team already owns (for example GET /store/listings/{id}) is not blocked. Ask for access with Entitlement requests; the web app's publisher waitlist submits the infsh/marketplace_waitlist form for you.

Publish flow

  1. GET /store/terms: policy version, acknowledgement checklist, and rule IDs cited by automated findings.
  2. GET /store/publisher / PUT /store/publisher: publisher profile (support, privacy, contact email verification via /store/publisher/verify-email/*).
  3. POST /store/listings/draft: create or fetch the draft listing for a resource (resource_type, resource_id).
  4. PUT /store/listings/{id} (or PATCH): edit listing-owned fields (tagline, categories, tags, URLs, data-handling answers, use cases).
  5. POST /store/check: run validation, scan, and policy checks on a resource version without submitting.
  6. POST /store/submit: submit a version with changelog, license, and attestation (terms_version, policy_version, data-handling answers, ticked acks from /store/terms).

POST /store/check and GET /store/versions/{id} return a StoreCheckResultDTO: one row per check (validation, scan, policy, …) with status, summary, and findings[]. Each finding has code, severity (block, hold, warning, info), title / message / fix, an optional policy rule, and an optional key naming the resource field to change. A version migrated from the old store tables (origin: migrated) reports each check it never ran with status skipped ("not run: migrated version").

CodeSeverityWhenFix
NAME_IS_HOSTNAMEholdThe resource would be listed under a hostname-shaped label (for example mcp.datadoghq.com after registering an MCP server from a URL with no display name)Set a human-readable title on the resource (MCP: title on PUT /mcp-servers/{id}), then re-run POST /store/check
NeedEndpoint
List your team's listingsGET /store/listings or POST /store/listings/list
Listing detail / editGET /store/listings/{id}, PUT /store/listings/{id}
Version historyGET /store/listings/{id}/versions, GET /store/versions/{id}
Activity / review threadGET /store/listings/{id}/events, POST /store/listings/{id}/messages
Delist / relistPOST /store/listings/{id}/delist, POST /store/listings/{id}/relist
Publish or withdraw a reviewed versionPOST /store/versions/{id}/publish, POST /store/versions/{id}/withdraw

Store vs search vs resource APIs

NeedEndpoint
Category catalog with listing counts (optionally per resource type)GET /store/categories
Browse approved Grid apps with category/rankGET /store/apps
Marketplace listing detailGET /marketplace/{type}/{namespace}/{name}
Draft or submit a store listingPOST /store/listings/draft, POST /store/submit
Tag slugs with titles and public app countsGET /store/tags
Browse approved registry skillsGET /store/skills
Browse approved agents or flowsGET /store/agents, GET /store/flows
Listing count per resource typeGET /store/counts
Autocomplete / unified discoveryGET /suggest
Full-text search with scoresGET /search
Run an appPOST /run (Tasks)
Read skill instructionsGET /skills/{namespace}/{name}/content
Manage your workspace's apps or skillsApps / Skills (authenticated)

GuideTopic
Browsing the GridApp discovery in the web app
Skill registryWorkspace skill discovery
Search conceptSuggest vs search

we use cookies

we use cookies to ensure you get the best experience on our website. for more information on how we use cookies, please see our cookie policy.

by clicking "accept", you agree to our use of cookies.
learn more.