{"openapi":"3.1.0","info":{"title":"LinkIntel API","version":"1.0.0","summary":"Evidence for your AI assistant's next social post.","description":"LinkIntel is an MCP server that gives an AI assistant evidence for its next social post: public X posts the customer chooses, stored with their public performance and source links, returned as a cited content brief.\n\nMost integrations should connect an MCP client to `/api/mcp` and let it discover the tools with `tools/list`. The ingest endpoint is for automation tools that register newly published posts.\n\nPricing: $39 USD/month (https://www.getlinkintel.com/pricing.md). Agent playbook: https://www.getlinkintel.com/SKILL.md.","contact":{"name":"LinkIntel support","email":"support@getlinkintel.com","url":"https://www.getlinkintel.com/contact"},"termsOfService":"https://www.getlinkintel.com/terms","license":{"name":"Proprietary","url":"https://www.getlinkintel.com/terms"}},"externalDocs":{"description":"MCP documentation","url":"https://www.getlinkintel.com/docs/mcp"},"servers":[{"url":"https://www.getlinkintel.com"}],"tags":[{"name":"MCP","description":"The Model Context Protocol endpoint an AI assistant connects to."},{"name":"Ingest","description":"Register published posts from an automation tool."}],"paths":{"/api/mcp":{"post":{"tags":["MCP"],"operationId":"callMcp","summary":"Send an MCP JSON-RPC message","description":"The MCP Streamable HTTP endpoint. Send JSON-RPC 2.0 messages (`initialize`, `tools/list`, `tools/call`, ...) as described by the Model Context Protocol. Responses are returned as a single JSON body. An unauthenticated request receives 401 with a `WWW-Authenticate` header whose `resource_metadata` points at the OAuth protected resource metadata, which is how an MCP client discovers the sign-in flow.","security":[{"oauth2":["mcp"]},{"mcpToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"},"example":{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}}}},"responses":{"200":{"description":"JSON-RPC response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"401":{"description":"Missing, invalid or unentitled credentials. Follow the WWW-Authenticate challenge to sign in.","headers":{"WWW-Authenticate":{"description":"Bearer challenge carrying `resource_metadata` (RFC 9728).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcError"}}}},"500":{"description":"Server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcError"}}}}}}},"/api/ingest/posts":{"get":{"tags":["Ingest"],"operationId":"describeIngest","summary":"Describe the ingest endpoint","description":"Returns a short description of how to call the ingest endpoint. Useful to check a pasted URL.","security":[],"responses":{"200":{"description":"Usage description.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"post":{"tags":["Ingest"],"operationId":"registerPosts","summary":"Register published posts for measurement","description":"Registers one or more published post URLs against the account that owns the webhook secret. At most 50 posts per request, 512 KB per body. Currently accepts LinkedIn share and ugcPost URLs for existing LinkedIn analytics customers. The secret is issued on the account page.","security":[{"webhookSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"},"examples":{"single":{"value":{"url":"https://www.linkedin.com/feed/update/urn:li:share:1234567890"}},"batch":{"value":{"posts":[{"url":"https://www.linkedin.com/feed/update/urn:li:share:1234567890","posted_at":"2026-09-24T09:00:00Z"}]}}}}}},"responses":{"200":{"description":"Posts registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"400":{"description":"No usable post URL in the body, or the body could not be read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised webhook secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body over 512 KB or too many posts in one request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Every candidate was rejected; retrying will not help.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"500":{"description":"Registration failed. Retrying is safe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth 2.1 with PKCE (S256) and dynamic client registration. Discovery: /.well-known/oauth-protected-resource/api/mcp and /.well-known/oauth-authorization-server/api/auth.","flows":{"authorizationCode":{"authorizationUrl":"https://www.getlinkintel.com/api/auth/oauth2/authorize","tokenUrl":"https://www.getlinkintel.com/api/auth/oauth2/token","refreshUrl":"https://www.getlinkintel.com/api/auth/oauth2/token","scopes":{"mcp":"Use the LinkIntel MCP server","offline_access":"Keep access with a refresh token"}}}},"mcpToken":{"type":"http","scheme":"bearer","description":"Fallback for MCP clients without OAuth: a token starting `lnki_`, issued on /setup."},"webhookSecret":{"type":"http","scheme":"bearer","description":"Webhook secret starting `lnkw_`, issued on the account page. Also accepted without the `Bearer` prefix."}},"schemas":{"Error":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string","description":"What went wrong and what to do about it."}}},"JsonRpcError":{"type":"object","required":["jsonrpc","error","id"],"properties":{"jsonrpc":{"const":"2.0"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer","description":"JSON-RPC error code. -32001 means authentication is required."},"message":{"type":"string"}}},"id":{"type":["string","integer","null"]}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer"],"description":"Omitted for notifications."},"method":{"type":"string","examples":["initialize","tools/list","tools/call"]},"params":{"type":"object","additionalProperties":true}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc","id"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer","null"]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer","description":"JSON-RPC error code. -32001 means authentication is required."},"message":{"type":"string"}}}}},"IngestPost":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Post URL. Also read from post_url, postUrl, link, permalink, post_link, share_url, releaseURL or externalLink."},"posted_at":{"type":"string","format":"date-time","description":"Also read from postedAt, published_at, publishedAt, publishDate or date."},"text":{"type":"string","description":"Post text. Also read from content, message, body or commentary."}}},"IngestRequest":{"oneOf":[{"$ref":"#/components/schemas/IngestPost"},{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","maxItems":50,"items":{"oneOf":[{"$ref":"#/components/schemas/IngestPost"},{"type":"string","format":"uri"}]}}}}]},"IngestResult":{"type":"object","required":["registered","new","already_known","rejected"],"properties":{"registered":{"type":"integer","description":"Distinct posts registered by this request."},"new":{"type":"integer","description":"Posts not previously known."},"already_known":{"type":"integer","description":"Posts that were already registered."},"rejected":{"type":"array","items":{"type":"object","required":["value","reason"],"properties":{"value":{"type":"string"},"reason":{"type":"string"}}}},"next_step":{"type":"string","description":"What happens next, in plain language."}}}}}}