Skill: justoneapi/justoneapi-instagram-search-hashtag-posts (version 1.0.0)

--- name: Instagram Hashtag Posts Search API description: Call GET /api/instagram/search-hashtag-posts/v1 for Instagram Hashtag Posts Search through JustOneAPI with hashtag. 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]}} --- # Instagram Hashtag Posts Search Use this focused JustOneAPI skill for hashtag Posts Search in Instagram. It targets `GET /api/instagram/search-hashtag-posts/v1`. Required non-token inputs are `hashtag`. OpenAPI describes it as: Get Instagram hashtag Posts Search data, including caption, author profile, and publish time, for competitive analysis of trending topics and hashtags and monitoring community discussions and public opinion on specific tags. ## Endpoint Scope - Platform key: `instagram` - Endpoint key: `search-hashtag-posts` - Platform family: Instagram - Skill slug: [REDACTED_SECRET] | Operation | Version | Method | Path | OpenAPI summary | | --- | --- | --- | --- | --- | | `searchHashtagPostsV1` | `v1` | `GET` | [REDACTED_SECRET] | Hashtag Posts Search | ## Inputs | Parameter | In | Required by | Optional by | Type | Notes | | --- | --- | --- | --- | --- | --- | | `endCursor` | `query` | n/a | all | `string` | Cursor used for retrieving the next page of results | | `hashtag` | `query` | all | n/a | `string` | The hashtag or keyword to search for | Request body: none documented; send parameters through path or query arguments. ## Version Choice Use `searchHashtagPostsV1` for the documented `v1` endpoint. There are no alternate versions grouped in this skill. ## Run This Endpoint Supported operation IDs in this skill: `searchHashtagPostsV1`. ```bash node {baseDir}/bin/run.mjs --operation "searchHashtagPostsV1" --token "$JUST_ONE_API_TOKEN" --params-json '{"hashtag":"<hashtag>"}' ``` 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_instagram_search_hashtag_posts&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_instagram_search_hashtag_posts&utm_content=project_link). ## Output Focus - State the operation ID and endpoint path used, for example `searchHashtagPostsV1` on [REDACTED_SECRET]. - Echo the required lookup scope (`hashtag`) before summarizing results. - Prioritize fields that support this endpoint purpose: Get Instagram hashtag Posts Search data, including caption, author profile, and publish time, for competitive analysis of trending topics and hashtags and monitoring community discussions and public opinion on specific tags. - 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/instagram/search-hashtag-posts/v1 for Instagram Hashtag Posts Search through JustOneAPI with hashtag.",
  "displayName": "Instagram Hashtag Posts Search",
  "openapi": "3.1.0",
  "platformKey": "instagram",
  "primaryTag": "Instagram",
  "skillName": "justoneapi_instagram_search_hashtag_posts",
  "slug": "justoneapi-instagram-search-hashtag-posts",
  "sourceTitle": "OpenAPI definition",
  "operations": [
    {
      "description": "Get Instagram hashtag Posts Search data, including caption, author profile, and publish time, for competitive analysis of trending topics and hashtags and monitoring community discussions and public opinion on specific tags.",
      "method": "GET",
      "operationId": "searchHashtagPostsV1",
      "parameters": [
        {
          "defaultValue": null,
          "description": "Access token for the API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": null,
          "description": "The hashtag or keyword to search for.",
          "enumValues": [],
          "location": "query",
          "name": "hashtag",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": "",
          "description": "Cursor used for retrieving the next page of results.",
          "enumValues": [],
          "location": "query",
          "name": "endCursor",
          "required": false,
          "schemaType": "string"
        }
      ],
      "path": "/api/instagram/search-hashtag-posts/v1",
      "requestBody": null,
      "responses": [
        {
          "description": "OK",
          "statusCode": "200"
        }
      ],
      "summary": "Hashtag Posts Search",
      "tags": [
        "Instagram"
      ]
    }
  ],
  "endpointPath": "search-hashtag-posts",
  "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/instagram/search-hashtag-posts/v1 for Instagram Hashtag Posts Search through JustOneAPI with hashtag.",
  "displayName": "Instagram Hashtag Posts Search",
  "endpointPath": "search-hashtag-posts",
  "openapi": "3.1.0",
  "operations": [
    {
      "description": "Get Instagram hashtag Posts Search data, including caption, author profile, and publish time, for competitive analysis of trending topics and hashtags and monitoring community discussions and public opinion on specific tags.",
      "method": "GET",
      "operationId": "searchHashtagPostsV1",
      "parameters": [
        {
          "defaultValue": null,
          "description": "Access token for the API service.",
          "enumValues": [],
          "location": "query",
          "name": "token",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": null,
          "description": "The hashtag or keyword to search for.",
          "enumValues": [],
          "location": "query",
          "name": "hashtag",
          "required": true,
          "schemaType": "string"
        },
        {
          "defaultValue": "",
          "description": "Cursor used for retrieving the next page of results.",
          "enumValues": [],
          "location": "query",
          "name": "endCursor",
          "required": false,
          "schemaType": "string"
        }
      ],
      "path": "/api/instagram/search-hashtag-posts/v1",
      "requestBody": null,
      "responses": [
        {
          "description": "OK",
          "statusCode": "200"
        }
      ],
      "summary": "Hashtag Posts Search",
      "tags": [
        "Instagram"
      ]
    }
  ],
  "platformKey": "instagram",
  "primaryTag": "Instagram",
  "skillName": "justoneapi_instagram_search_hashtag_posts",
  "skillType": "interface",
  "slug": "justoneapi-instagram-search-hashtag-posts",
  "sourceTitle": "OpenAPI definition"
}


path: generated/operations.md
content: # Instagram Hashtag Posts Search operations

Generated from JustOneAPI OpenAPI for platform key `instagram`.

Endpoint group: `search-hashtag-posts`.

## `searchHashtagPostsV1`

- Method: `GET`
- Path: `/api/instagram/search-hashtag-posts/v1`
- Summary: Hashtag Posts Search
- Description: Get Instagram hashtag Posts Search data, including caption, author profile, and publish time, for competitive analysis of trending topics and hashtags and monitoring community discussions and public opinion on specific tags.
- Tags: `Instagram`

### Parameters

| Name | In | Required | Type | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `token` | `query` | yes | `string` | n/a | Access token for the API service. |
| `hashtag` | `query` | yes | `string` | n/a | The hashtag or keyword to search for. |
| `endCursor` | `query` | no | `string` | n/a | Cursor used for retrieving the next page of results. |

### Request body

No request body.

### Responses

- `200`: OK


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