GET Catalog Details
Fetch a single catalog entry along with all of its actions
https://api.anakin.io/v1/wire/catalog/{slug}Returns the catalog entry for a single website plus every visible action it exposes. This is the canonical way to discover an action's action_id, parameter schema, mode (async / sync), and credit cost before calling POST /v1/wire/task.
Requires an X-API-Key. Returns public actions plus any private actions you own.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
slug required | string | Catalog slug (e.g. airbnb, linkedin). Get slugs from GET /v1/wire/catalog |
Response
200 OK{
"catalog": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"slug": "airbnb",
"name": "Airbnb",
"url": "https://www.airbnb.com",
"domain": "airbnb.com",
"category": "travel",
"description": "Search listings, fetch reviews, and pull host details.",
"logo_url": "https://cdn.anakin.io/logos/airbnb.png",
"auth_required": true,
"auth_type": "cookie",
"auth_types": ["browser_state", "credentials"],
"auth_login_url": "https://www.airbnb.com/login",
"supported_sources": ["1password", "azure_key_vault"],
"status": "active",
"created_at": "2026-02-01T00:00:00Z",
"updated_at": "2026-04-20T12:00:00Z",
"action_count": 4
},
"actions": [
{
"id": "f1e2d3c4-b5a6-7890-1234-56789abcdef0",
"action_id": "ab_search_listings",
"catalog_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Search Listings",
"description": "Search Airbnb listings by query, dates, and guest count.",
"tags": ["search", "listings"],
"type": "read",
"mode": "async",
"auth_mode": "none",
"auth_required": false,
"parameters": [
{ "name": "query", "type": "string", "required": true, "description": "Location query, e.g. 'pacific heights'" },
{ "name": "checkin", "type": "string", "required": false, "description": "ISO date" },
{ "name": "checkout", "type": "string", "required": false, "description": "ISO date" },
{ "name": "adults", "type": "integer", "required": false, "default": 1 },
{ "name": "children", "type": "integer", "required": false },
{ "name": "infants", "type": "integer", "required": false },
{ "name": "pets", "type": "integer", "required": false },
{ "name": "cursor", "type": "string", "required": false, "description": "Pagination cursor from previous response" },
{ "name": "currency", "type": "string", "required": false },
{ "name": "locale", "type": "string", "required": false }
],
"credits_per_call": 1,
"wheel_version": "0.4.2",
"wheel_filename": "ab_search_listings-0.4.2-py3-none-any.whl",
"build_request_id": "6964eeb6-b426-4095-a1ab-b443f8311c9d",
"status": "active",
"created_at": "2026-02-01T00:00:00Z",
"updated_at": "2026-04-20T12:00:00Z"
}
],
"login_input_schema": [
{ "name": "email", "type": "string", "required": true, "default": "", "description": "Account email for the catalog login." },
{ "name": "password", "type": "string", "required": true, "default": "", "description": "Account password. Sensitive — never logged or persisted." },
{ "name": "country", "type": "string", "required": false, "default": "us", "description": "ISO country code for the storefront region." }
]
}Catalog fields
See GET /v1/wire/catalog — the catalog object on this endpoint matches the same CatalogEntry shape. In addition to the fields documented there, the object always includes:
| Field | Type | Description |
|---|---|---|
catalog.auth_type | string | null | Primary credential type for this catalog (e.g. browser_state, credentials), or null if the catalog has no auth |
catalog.auth_login_url | string | null | Where users should log in to seed a browser_state credential |
catalog.supported_sources | string[] | Identity-source providers this catalog accepts credentials from (1password, azure_key_vault); empty when none. Binding a source-backed login is rejected with PROVIDER_NOT_SUPPORTED_BY_CATALOG when the provider isn't listed here |
Optional fields (
logo_url,auth_type,auth_login_url) are omitted when not set, not returned asnull.
Login input schema
| Field | Type | Description |
|---|---|---|
login_input_schema | array | Top-level array of { name, type, required, default, description } — the login fields for credentials-mode catalogs. Empty for catalogs without a credentials login |
Action fields
| Field | Type | Description |
|---|---|---|
actions[].action_id | string | Pass this as action_id when calling POST /v1/wire/task |
actions[].name | string | Display name |
actions[].description | string | null | Short summary |
actions[].tags | string[] | Free-form tags for filtering / discovery |
actions[].type | string | Action category — read or write |
actions[].mode | string | async (returns job_id, poll for results) or sync (returns data inline) |
actions[].auth_mode | string | "none" | "optional" | "required". required ⇒ credential_id mandatory; optional ⇒ credential_id honored if supplied; none ⇒ credentials are ignored |
actions[].auth_required | boolean | Deprecated legacy mirror — true iff auth_mode === "required". Prefer reading auth_mode |
actions[].parameters | array | Array of param descriptors — { name, type, required, default?, description? } — one per input the action accepts via POST /v1/wire/task |
actions[].credits_per_call | integer | Base credit cost. Some actions use a CEL expression in action_config.credit_expression to compute final cost from the response — final cost is reflected on the job record |
actions[].wheel_version | string | null | Build version of the underlying scraper |
actions[].wheel_filename | string | Filename of the built wheel (e.g. mb_search-1.1.0-py3-none-any.whl) |
actions[].build_request_id | string (UUID) | The build request that produced this action |
actions[].status | string | active or pending_review |
actions[].owner_user_id | string | null | Set when this is a private action you built via build-request |
Only actions visible to the requesting user are returned. Private actions belonging to other users are filtered out server-side.
Error Responses
Catalog not found — 404 Not Found
{
"status": "error",
"error": { "code": "NOT_FOUND", "message": "Catalog entry not found" }
}Code Examples
curl https://api.anakin.io/v1/wire/catalog/airbnb \
-H "X-API-Key: your_api_key"import requests
response = requests.get(
'https://api.anakin.io/v1/wire/catalog/airbnb',
headers={'X-API-Key': 'your_api_key'}
)
data = response.json()
print(f"Catalog: {data['catalog']['name']}")
for action in data['actions']:
print(f" {action['action_id']:30} {action['credits_per_call']} cr {action['name']}")const response = await fetch('https://api.anakin.io/v1/wire/catalog/airbnb', {
headers: { 'X-API-Key': 'your_api_key' }
});
const { catalog, actions } = await response.json();
console.log(`Catalog: ${catalog.name}`);
for (const action of actions) {
console.log(` ${action.action_id.padEnd(30)} ${action.credits_per_call} cr ${action.name}`);
}Rate Limit
120 requests per minute per IP.