Skill: justoneapi/justoneapi-imdb-main-search-query (version 1.0.0)

--- name: IMDb Keyword Search API description: Call GET /api/imdb/main-search-query/v1 for IMDb Keyword Search through JustOneAPI with searchTerm. author: JustOneAPI homepage: https://api.justoneapi.com metadata: {"openclaw":{"homepage":"https://api.justoneapi.com","primaryEnv":"JUST_ONE_API_TOKEN","requires":{"bins":["node"],"env":["JUST_ONE_API_TOKEN"]},"skillKey":[REDACTED_SECRET]}} --- # IMDb Keyword Search Use this focused JustOneAPI skill for keyword Search in IMDb. It targets `GET /api/imdb/main-search-query/v1`. Required non-token inputs are `searchTerm`. OpenAPI describes it as: Get IMDb keyword Search data, including matched results, metadata, and ranking signals, for entity discovery and entertainment research. ## Endpoint Scope - Platform key: `imdb` - Endpoint key: `main-search-query` - Platform family: IMDb - Skill slug: [REDACTED_SECRET] | Operation | Version | Method | Path | OpenAPI summary | | --- | --- | --- | --- | --- | | `mainSearchQuery` | `v1` | `GET` | `/api/imdb/main-search-query/v1` | Keyword Search | ## Inputs | Parameter | In | Required by | Optional by | Type | Notes | | --- | --- | --- | --- | --- | --- | | `languageCountry` | `query` | n/a | all | `string` | Language and country preferences. Available Values: - `en_US`: English (US) - `fr_CA`: French (Canada) - `fr_FR`: French (France) - `de_DE`: German (Germany) - `hi_IN`: Hindi (India) - `it_IT`: Italian (Italy) - `pt_BR`: Portuguese (Brazil) - `es_ES`: Spanish (Spain) - `es_US`: Spanish (US) - `es_MX`: Spanish (Mexico) | | `languageCountry` enum | values | n/a | n/a | n/a | `de_DE`, `en_US`, `es_ES`, `es_MX`, `es_US`, `fr_CA`, `fr_FR`, `hi_IN`, `it_IT`, `pt_BR` | | `limit` | `query` | n/a | all | `integer` | Maximum number of results to return (1-300) | | `searchTerm` | `query` | all | n/a | `string` | The term to search for (e.g., 'fire') | | `type` | `query` | n/a | all | `string` | Category of results to include in search. Available Values: - `Top`: Top Results - `Movies`: Movies - `Shows`: TV Shows - `People`: People - `Interests`: Interests - `Episodes`: Episodes - `Podcast`: Podcasts - `Video_games`: Video Games | | `type` enum | values | n/a | n/a | n/a | `Episodes`, `Interests`, `Movies`, `People`, `Podcast`, `Shows`, `Top`, `Video_games` | Request body: none documented; send parameters through path or query arguments. ## Version Choice Use `mainSearchQuery` for the documented `v1` endpoint. There are no alternate versions grouped in this skill. ## Run This Endpoint Supported operation IDs in this skill: `mainSearchQuery`. ```bash node {baseDir}/bin/run.mjs --operation "mainSearchQuery" --token "$JUST_ONE_API_TOKEN" --params-json '{"searchTerm":"<searchTerm>"}' ``` Ask for any missing required parameter before calling the helper. Keep user-provided IDs, cursors, keywords, and filters unchanged. ## Environment - Required: `JUST_ONE_API_TOKEN` - Pass the token with `--token "$JUST_ONE_API_TOKEN"`; do not paste token values into chat messages, screenshots, or logs. - Get a token from [Just One API Dashboard](https://dashboard.justoneapi.com/en/login?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_imdb_main_search_query&utm_content=project_link). - Authentication details: [Just One API Usage Guide](https://docs.justoneapi.com/en/?utm_source=clawhub.ai&utm_medium=referral&utm_campaign=justoneapi_imdb_main_search_query&utm_content=project_link). ## Output Focus - State the operation ID and endpoint path used, for example `mainSearchQuery` on `/api/imdb/main-search-query/v1`. - Echo the required lookup scope (`searchTerm`) before summarizing results. - Prioritize fields that support this endpoint purpose: Get IMDb keyword Search data, including matched results, metadata, and ranking signals, for entity discovery and entertainment research. - Return raw JSON only after the short, endpoint-specific summary. - If the backend errors, include the backend payload and the exact operation ID.

path: bin/run.mjs
content: #!/usr/bin/env node
const manifest = {
  "baseUrl": "https://api.justoneapi.com",
  "description": "Call GET /api/imdb/main-search-query/v1 for IMDb Keyword Search through JustOneAPI with searchTerm.",
  "displayName": "IMDb Keyword Search",
  "openapi": "3.1.0",
  "platformKey": "imdb",
  "primaryTag": "IMDb",
  "skillName": "justoneapi_imdb_main_search_query",
  "slug": "justoneapi-imdb-main-search-query",
  "sourceTitle": "OpenAPI definition",
  "operations": [
    {
      "description": "Get IMDb keyword Search data, including matched results, metadata, and ranking signals, for entity discovery and entertainment research.",
      "method": "GET",
      "operationId": "mainSearchQuery",
      "parameters": [
        {
          "defaultValue": null,
          "description": "User's authentication token.",
          "enumValues": [],
          "location": "query",
          "name": "token",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": null,
          "description": "The term to search for (e.g., 'fire').",
          "enumValues": [],
          "location": "query",
          "name": "searchTerm",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": "Top",
          "description": "Category of results to include in search.\n\nAvailable Values:\n- `Top`: Top Results\n- `Movies`: Movies\n- `Shows`: TV Shows\n- `People`: People\n- `Interests`: Interests\n- `Episodes`: Episodes\n- `Podcast`: Podcasts\n- `Video_games`: Video Games",
          "enumValues": [
            "Top",
            "Movies",
            "Shows",
            "People",
            "Interests",
            "Episodes",
            "Podcast",
            "Video_games"
          ],
          "location": "query",
          "name": "type",
          "required": false,
          "schemaType": "string"
        },
        {
          "defaultValue": 25,
          "description": "Maximum number of results to return (1-300).",
          "enumValues": [],
          "location": "query",
          "name": "limit",
          "required": false,
          "schemaType": "integer"
        },
        {
          "defaultValue": "en_US",
          "description": "Language and country preferences.\n\nAvailable Values:\n- `en_US`: English (US)\n- `fr_CA`: French (Canada)\n- `fr_FR`: French (France)\n- `de_DE`: German (Germany)\n- `hi_IN`: Hindi (India)\n- `it_IT`: Italian (Italy)\n- `pt_BR`: Portuguese (Brazil)\n- `es_ES`: Spanish (Spain)\n- `es_US`: Spanish (US)\n- `es_MX`: Spanish (Mexico)",
          "enumValues": [
            "en_US",
            "fr_CA",
            "fr_FR",
            "de_DE",
            "hi_IN",
            "it_IT",
            "pt_BR",
            "es_ES",
            "es_US",
            "es_MX"
          ],
          "location": "query",
          "name": "languageCountry",
          "required": false,
          "schemaType": "string"
        }
      ],
      "path": "/api/imdb/main-search-query/v1",
      "requestBody": null,
      "responses": [
        {
          "description": "OK",
          "statusCode": "200"
        }
      ],
      "summary": "Keyword Search",
      "tags": [
        "IMDb"
      ]
    }
  ],
  "endpointPath": "main-search-query",
  "skillType": "interface"
};
const args = parseArgs(process.argv.slice(2));

if (!args.operation) {
  fail("Missing required --operation argument.");
}

const operation = manifest.operations.find((item) => item.operationId === args.operation);
if (!operation) {
  fail(`Unknown operation "${args.operation}".`, { availableOperations: manifest.operations.map((item) => item.operationId) });
}

const params = parseParams(args.paramsJson);
applyDefaults(operation, params);
injectToken(operation, params, args.token);
validateRequired(operation, params);

const baseUrl = manifest.baseUrl;
const url = new URL(operation.path, ensureBaseUrl(baseUrl));
applyPathParams(operation, params, url);
applyQueryParams(operation, params, url);

const requestInit = {
  headers: {
    "accept": "application/json",
  },
  method: operation.method,
};

if (operation.requestBody && params.body !== undefined) {
  requestInit.body = JSON.stringify(params.body);
  requestInit.headers["content-type"] = operation.requestBody.contentType || "application/json";
}

let response;
try {
  response = await fetch(url, requestInit);
} catch (error) {
  fail("Network request failed.", {
    cause: error instanceof Error ? error.message : String(error),
    operationId: operation.operationId,
  });
}

const rawBody = await response.text();
let parsedBody;
try {
  parsedBody = rawBody ? JSON.parse(rawBody) : null;
} catch (error) {
  if (!response.ok) {
    fail("Backend returned a non-JSON error response.", {
      body: rawBody,
      operationId: operation.operationId,
      status: response.status,
      statusText: response.statusText,
    });
  }
  fail("Backend returned invalid JSON.", {
    body: rawBody,
    operationId: operation.operationId,
    status: response.status,
    statusText: response.statusText,
  });
}

if (!response.ok) {
  fail("Backend request failed.", {
    body: parsedBody,
    operationId: operation.operationId,
    status: response.status,
    statusText: response.statusText,
  });
}

process.stdout.write(`${JSON.stringify(parsedBody, null, 2)}\n`);

function parseArgs(argv) {
  const parsed = { operation: null, paramsJson: "{}", token: null };
  for (let index = 0; index < argv.length; index += 1) {
    const flag = argv[index];
    const value = argv[index + 1];
    if (flag === "--operation") {
      parsed.operation = value;
      index += 1;
      continue;
    }
    if (flag === "--params-json") {
      parsed.paramsJson = value;
      index += 1;
      continue;
    }
    if (flag === "--token") {
      parsed.token = value;
      index += 1;
      continue;
    }
    fail(`Unknown argument "${flag}".`);
  }
  return parsed;
}

function parseParams(input) {
  try {
    const parsed = JSON.parse(input || "{}");
    if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
      fail("--params-json must decode to a JSON object.");
    }
    return parsed;
  } catch (error) {
    fail("Failed to parse --params-json.", {
      cause: error instanceof Error ? error.message : String(error),
    });
  }
}

function applyDefaults(operation, params) {
  for (const parameter of operation.parameters) {
    if (params[parameter.name] === undefined && parameter.defaultValue !== null) {
      params[parameter.name] = parameter.defaultValue;
    }
  }
}

function injectToken(operation, params, cliToken) {
  const tokenParam = operation.parameters.find((parameter) => parameter.name === "token");
  if (!tokenParam || params.token !== undefined) {
    return;
  }
  if (!cliToken) {
    fail("--token is required for this operation.", {
      operationId: operation.operationId,
    });
  }
  params.[REDACTED_SECRET];
}

function validateRequired(operation, params) {
  const missing = [];
  for (const parameter of operation.parameters) {
    if (parameter.required && params[parameter.name] === undefined) {
      missing.push(parameter.name);
    }
  }
  if (operation.requestBody?.required && params.body === undefined) {
    missing.push("body");
  }
  if (missing.length) {
    fail("Missing required parameters.", {
      missing,
      operationId: operation.operationId,
    });
  }
}

function applyPathParams(operation, params, url) {
  let pathname = url.pathname;
  for (const parameter of operation.parameters.filter((item) => item.location === "path")) {
    const value = params[parameter.name];
    if (value === undefined) {
      continue;
    }
    pathname = pathname.replace(`{${parameter.name}}`, encodeURIComponent(String(value)));
  }
  url.pathname = pathname;
}

function applyQueryParams(operation, params, url) {
  for (const parameter of operation.parameters.filter((item) => item.location === "query")) {
    const value = params[parameter.name];
    if (value === undefined) {
      continue;
    }
    appendValue(url.searchParams, parameter.name, value);
  }
}

function appendValue(searchParams, name, value) {
  if (Array.isArray(value)) {
    for (const item of value) {
      appendValue(searchParams, name, item);
    }
    return;
  }
  if (value && typeof value === "object") {
    searchParams.append(name, JSON.stringify(value));
    return;
  }
  searchParams.append(name, String(value));
}

function ensureBaseUrl(value) {
  return value.endsWith("/") ? value : `${value}/`;
}

function fail(message, details = null) {
  const payload = { message };
  if (details) {
    payload.details = details;
  }
  process.stderr.write(`${JSON.stringify(payload, null, 2)}\n`);
  process.exit(1);
}


path: generated/operations.json
content: {
  "baseUrl": "https://api.justoneapi.com",
  "description": "Call GET /api/imdb/main-search-query/v1 for IMDb Keyword Search through JustOneAPI with searchTerm.",
  "displayName": "IMDb Keyword Search",
  "endpointPath": "main-search-query",
  "openapi": "3.1.0",
  "operations": [
    {
      "description": "Get IMDb keyword Search data, including matched results, metadata, and ranking signals, for entity discovery and entertainment research.",
      "method": "GET",
      "operationId": "mainSearchQuery",
      "parameters": [
        {
          "defaultValue": null,
          "description": "User's authentication token.",
          "enumValues": [],
          "location": "query",
          "name": "token",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": null,
          "description": "The term to search for (e.g., 'fire').",
          "enumValues": [],
          "location": "query",
          "name": "searchTerm",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": "Top",
          "description": "Category of results to include in search.\n\nAvailable Values:\n- `Top`: Top Results\n- `Movies`: Movies\n- `Shows`: TV Shows\n- `People`: People\n- `Interests`: Interests\n- `Episodes`: Episodes\n- `Podcast`: Podcasts\n- `Video_games`: Video Games",
          "enumValues": [
            "Top",
            "Movies",
            "Shows",
            "People",
            "Interests",
            "Episodes",
            "Podcast",
            "Video_games"
          ],
          "location": "query",
          "name": "type",
          "required": false,
          "schemaType": "string"
        },
        {
          "defaultValue": 25,
          "description": "Maximum number of results to return (1-300).",
          "enumValues": [],
          "location": "query",
          "name": "limit",
          "required": false,
          "schemaType": "integer"
        },
        {
          "defaultValue": "en_US",
          "description": "Language and country preferences.\n\nAvailable Values:\n- `en_US`: English (US)\n- `fr_CA`: French (Canada)\n- `fr_FR`: French (France)\n- `de_DE`: German (Germany)\n- `hi_IN`: Hindi (India)\n- `it_IT`: Italian (Italy)\n- `pt_BR`: Portuguese (Brazil)\n- `es_ES`: Spanish (Spain)\n- `es_US`: Spanish (US)\n- `es_MX`: Spanish (Mexico)",
          "enumValues": [
            "en_US",
            "fr_CA",
            "fr_FR",
            "de_DE",
            "hi_IN",
            "it_IT",
            "pt_BR",
            "es_ES",
            "es_US",
            "es_MX"
          ],
          "location": "query",
          "name": "languageCountry",
          "required": false,
          "schemaType": "string"
        }
      ],
      "path": "/api/imdb/main-search-query/v1",
      "requestBody": null,
      "responses": [
        {
          "description": "OK",
          "statusCode": "200"
        }
      ],
      "summary": "Keyword Search",
      "tags": [
        "IMDb"
      ]
    }
  ],
  "platformKey": "imdb",
  "primaryTag": "IMDb",
  "skillName": "justoneapi_imdb_main_search_query",
  "skillType": "interface",
  "slug": "justoneapi-imdb-main-search-query",
  "sourceTitle": "OpenAPI definition"
}


path: generated/operations.md
content: # IMDb Keyword Search operations

Generated from JustOneAPI OpenAPI for platform key `imdb`.

Endpoint group: `main-search-query`.

## `mainSearchQuery`

- Method: `GET`
- Path: `/api/imdb/main-search-query/v1`
- Summary: Keyword Search
- Description: Get IMDb keyword Search data, including matched results, metadata, and ranking signals, for entity discovery and entertainment research.
- Tags: `IMDb`

### Parameters

| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | User's authentication token. |
| `searchTerm` | `query` | yes | `string` | n/a | The term to search for (e.g., 'fire'). |
| `type` | `query` | no | `string` | `Top` | Category of results to include in search.

Available Values:
- `Top`: Top Results
- `Movies`: Movies
- `Shows`: TV Shows
- `People`: People
- `Interests`: Interests
- `Episodes`: Episodes
- `Podcast`: Podcasts
- `Video_games`: Video Games |
| enum | values | no | n/a | n/a | `Top`, `Movies`, `Shows`, `People`, `Interests`, `Episodes`, `Podcast`, `Video_games` |
| `limit` | `query` | no | `integer` | `25` | Maximum number of results to return (1-300). |
| `languageCountry` | `query` | no | `string` | `en_US` | Language and country preferences.

Available Values:
- `en_US`: English (US)
- `fr_CA`: French (Canada)
- `fr_FR`: French (France)
- `de_DE`: German (Germany)
- `hi_IN`: Hindi (India)
- `it_IT`: Italian (Italy)
- `pt_BR`: Portuguese (Brazil)
- `es_ES`: Spanish (Spain)
- `es_US`: Spanish (US)
- `es_MX`: Spanish (Mexico) |
| enum | values | no | n/a | n/a | `en_US`, `fr_CA`, `fr_FR`, `de_DE`, `hi_IN`, `it_IT`, `pt_BR`, `es_ES`, `es_US`, `es_MX` |

### Request body

No request body.

### Responses

- `200`: OK


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)