{"name":"Marketplace SEO/GEO","description":"The agent of the link.ai marketplace of editorial placements (SEO netlinking and GEO visibility): delegate the search and the purchase (approved by a human) of placements, or the catalog of a publisher (its sites and offers), as durable tasks. Every task belongs to the organization and API key of its bearer token; the content of a message never grants an identity nor a permission.","supportedInterfaces":[{"url":"https://linkai.fsb.dev/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"link.ai","url":"https://linkai.fsb.dev"},"version":"0.5.0","capabilities":{"streaming":false,"pushNotifications":false,"extendedAgentCard":false},"securitySchemes":{"bearer":{"httpAuthSecurityScheme":{"scheme":"Bearer","bearerFormat":"JWT","description":"An access token of the platform for an API key of the agent: POST https://linkai.fsb.dev/api/AuthCommand/IssueToken {\"request\":{\"grant_type\":\"client_credentials\",\"client_id\":\"lk_...\",\"client_secret\":\"...\",\"resource\":\"https://linkai.fsb.dev/a2a\"}} - the \"resource\" must be this agent (another audience is refused 401); the key needs the buyer role (or the publisher role for manage_publisher_catalog) and the scopes of the skills"}}},"securityRequirements":[{"schemes":{"bearer":{"list":[]}}}],"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"skills":[{"id":"find_placements","name":"Find placements","description":"Searches the published editorial placements (sponsored articles, links) of the marketplace with strict filters - language, country, topic, kind, currency, maximum price, minimum domain rating and organic traffic - and an optional full-text query. The task completes with one artifact \"placements\": the JSON array of the matching offers, exactly as the REST API InventoryQuery.SearchOffers answers it. Send a data part {\"criteria\":{\"language\":\"fr\",\"country\":\"FR\",\"max_price_cents\":50000,\"currency\":\"EUR\"}}, or a text part used as the full-text query.","tags":["seo","geo","netlinking","search","placements"],"examples":["Find French technology blogs selling a sponsored article under 500 EUR","{\"criteria\":{\"language\":\"fr\",\"country\":\"FR\",\"topic\":\"technology\",\"max_price_cents\":50000,\"currency\":\"EUR\"}}"],"inputModes":["application/json","text/plain"],"outputModes":["application/json"],"securityRequirements":[{"schemes":{"bearer":{"list":["agent_task:submit"]}}}]},{"id":"procure_placements","name":"Procure placements","description":"Buys up to \"quantity\" (1 to 10) placements matching the criteria for the organization of the API key, under human control: the task searches the offers and requests their quotes, then waits in TASK_STATE_INPUT_REQUIRED with a \"proposal\" artifact (quotes, total, validity = the expiration of its first quote). A human buyer or admin of the organization approves (or rejects) it through the REST API - no message can approve it. Once approved, the quotes are confirmed into orders by the task itself, under that approval and within the budget policy of the key (which never holds order:confirm: it cannot buy by itself); the task cannot be canceled while confirming, and its orders are always listed in an \"orders\" artifact. While waiting, a message on the task with a data part {\"criteria\":{..}} replaces the criteria and makes a new proposal of the placements not bought yet (at most 5 times). Send {\"skill\":\"procure_placements\",\"quantity\":2,\"criteria\":{..}}.","tags":["seo","geo","netlinking","purchase","approval"],"examples":["{\"skill\":\"procure_placements\",\"quantity\":2,\"criteria\":{\"language\":\"fr\",\"currency\":\"EUR\",\"max_price_cents\":40000}}"],"inputModes":["application/json"],"outputModes":["application/json"],"securityRequirements":[{"schemes":{"bearer":{"list":["agent_task:submit","agent_task:procure","quote:request"]}}}]},{"id":"manage_publisher_catalog","name":"Manage publisher catalog","description":"For an API key with the publisher role: brings a site of the organization of the key to sale. The task registers the domain (or reuses the site of the organization), checks its ownership with the DNS/HTTPS verification of the platform and, while it is not proven, waits in TASK_STATE_INPUT_REQUIRED with an \"ownership_proof\" artifact: the DNS TXT record or the HTTPS file the domain OWNER must configure - the task never changes the DNS. Once configured, send a message {\"action\":\"verify\"} on the task. The verified site is activated, then the \"offers\" (terms; the title identifies an offer on its site, case and spaces ignored: an existing one - any of the offers of the site - is updated, never duplicated, even by concurrent tasks; one title given twice in a task is refused) are created and, with \"publish\":true, published. The task completes with a \"catalog\" artifact (the site and the offers, as the REST API answers them). While waiting, a message may also replace \"offers\" or \"publish\" (at most 5 rounds). The terms of an offer may hold \"editorial_guidelines\" (what the publisher requires from a publication: min_words, max_external_links, min_images, max_images - an integer, or null when not specified - and instructions): the object replaces all the guidelines of the offer, its absence keeps them; a quote freezes the guidelines in force when it is issued. The SEO metrics of the domain (DR, DA, TF, CF, RD, organic traffic) are not declared: they come only from official providers and are null until measured - a \"metrics\" member of \"site\" or of the terms of an offer is accepted and ignored. Scopes: agent_task:submit and site:write, plus offer:write with offers and offer:publish to publish. Send {\"skill\":\"manage_publisher_catalog\",\"site\":{\"domain\":\"example.com\"},\"offers\":[{..terms..}],\"publish\":true}.","tags":["publisher","catalog","site","offers","ownership"],"examples":["{\"skill\":\"manage_publisher_catalog\",\"site\":{\"domain\":\"potager-bio.fr\"},\"offers\":[{\"title\":\"Article sponsorisé jardinage\",\"description\":\"Un article sur le jardinage bio\",\"kind\":\"sponsored_article\",\"topic\":\"gardening\",\"language\":\"fr\",\"country\":\"FR\",\"currency\":\"EUR\",\"price_cents\":15000,\"monthly_capacity\":4,\"indexed\":true}],\"publish\":true}"],"inputModes":["application/json"],"outputModes":["application/json"],"securityRequirements":[{"schemes":{"bearer":{"list":["agent_task:submit","site:write"]}}}]}]}