Bring a client to what its repo declares

Embed
Preview of the card
<a href="https://seolyticize.com/docs/ref-apply-manifest"><img src="https://seolyticize.com/docs/_api/public/orgs/71cb2b7a-a719-4003-b3ea-6321dc1db8ab/spaces/3bf2dbf7-3faa-473c-ba3b-30588f5f8de4/pages/08210e4f-98ec-49f3-8609-e872fa84cf37/social-card.svg?v=3e7ae33eec8b" alt="Bring a client to what its repo declares" width="600" height="315"></a>
POSThttps://seolyticize.com/api/v1/tools/apply_manifest

Answers 'provision our product from its manifest' in one call that is safe to run on every deploy. Takes what a repository declares about its site (domain, framework, verification, tracker cadence, budget and its alert share, domain sweep, deploy hook, analytics paths and partners, crawl settings, default alerts and where they go, brief and brand terms, facts, goals, funnels) and brings the client to it through the existing tools, each with its own permission and checks. Each part is compared with what is there first: a step is kept when it would write nothing, ran when it changed something, would_run on a dry run. Fields the manifest leaves out are left as they are. files (the IndexNow key and Google verification file, which are public) come back on every real run. A new deploy hook's URL is in its step's result only, once. Free.

Parameters

Idempotency-Keystringheader
Any unique string, up to 200 characters. A retry with the same key and body is answered from the first answer (Idempotent-Replayed: true) for a day, so it never buys or writes twice; the same key with another body is refused.

Request body

application/json
domainstringrequired
namestring
frameworkstring
nextjs | astro | remix | sveltekit | nuxt | html | wordpress | other
verificationstring
file | meta | dns = file
trackerFrequencystring
daily | weekly | monthly | manual
monthlyBudgetUsdnumber
budgetAlertAtnumber
The share of the budget that alerts (0.8 = 80%). Left as it is when omitted.
domainSweepboolean
deployHookboolean
= false
briefobject
Show child parameters
overviewstring
goalstring
positioningstring
audiencestring
voicestring
brandTermsstring[]
addobject[]
Show child parameters
kindstringrequired
competitor | key_page | section | research
titlestringrequired
bodystring
urlstring
analyticsobject
set_up_web_analytics arguments; each list replaces the one there.
Show child parameters
hostnamesstring[]
includePathsstring[]
excludePathsstring[]
pathTemplatesstring[]
partnersobject[]
Show child parameters
namestringrequired
pathsstring[]required
crawlobject
set_crawl_settings arguments without clientId, such as {render: "shells", stripParams: ["ref"]}; checked by that tool.
alertsobject
add_default_alerts arguments: the default alerts, sent here.
Show child parameters
channelstring
slack | webhook | discord | email | telegram
webhookUrlstring
emailRecipientsstring[]
telegramChatIdstring
includestring[]
factsobject[]
Show child parameters
keystringrequired
valuestringrequired
categorystring
price | limit | country | date | contact | other = other
termsstring[]
= []
sourceUrlstring
= null
goalsobject[]
Show child parameters
namestringrequired
kindstringrequired
pageview | event
matchstringrequired
valueMinorinteger
= null
funnelsobject[]
Show child parameters
namestringrequired
stepsobject[]required
Show child parameters
kindstringrequired
pageview | event
matchstringrequired
labelstring
dryRunboolean
True to do nothing and get back exactly what the call would do: the rows it would write, the addresses it would submit, the emails it would send.
= false
{
  "domain": "string",
  "name": "string",
  "framework": "nextjs",
  "verification": "file",
  "trackerFrequency": "daily",
  "monthlyBudgetUsd": 0,
  "budgetAlertAt": 0,
  "domainSweep": true,
  "deployHook": false,
  "brief": {
    "overview": "string",
    "goal": "string",
    "positioning": "string",
    "audience": "string",
    "voice": "string",
    "brandTerms": [
      "string"
    ],
    "add": [
      {
        "kind": "competitor",
        "title": "string",
        "body": "string",
        "url": "string"
      }
    ]
  },
  "analytics": {
    "hostnames": [
      "string"
    ],
    "includePaths": [
      "string"
    ],
    "excludePaths": [
      "string"
    ],
    "pathTemplates": [
      "string"
    ],
    "partners": [
      {
        "name": "string",
        "paths": [
          "string"
        ]
      }
    ]
  },
  "crawl": {},
  "alerts": {
    "channel": "slack",
    "webhookUrl": "string",
    "emailRecipients": [
      "string"
    ],
    "telegramChatId": "string",
    "include": [
      "page-changes"
    ]
  },
  "facts": [
    {
      "key": "string",
      "value": "string",
      "category": "other",
      "terms": [],
      "sourceUrl": null
    }
  ],
  "goals": [
    {
      "name": "string",
      "kind": "pageview",
      "match": "string",
      "valueMinor": null
    }
  ],
  "funnels": [
    {
      "name": "string",
      "steps": [
        {
          "kind": "pageview",
          "match": "string",
          "label": "string"
        }
      ]
    }
  ],
  "dryRun": false
}

Code samples

cURL
curl -X POST "https://seolyticize.com/api/v1/tools/apply_manifest" \
  -H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
  -H "Idempotency-Key: <value>" \
  -H "Content-Type: application/json" \
  -d '{"domain":"string","name":"string","framework":"nextjs","verification":"file","trackerFrequency":"daily","monthlyBudgetUsd":0,"budgetAlertAt":0,"domainSweep":true,"deployHook":false,"brief":{"overview":"string","goal":"string","positioning":"string","audience":"string","voice":"string","brandTerms":["string"],"add":[{"kind":"competitor","title":"string","body":"string","url":"string"}]},"analytics":{"hostnames":["string"],"includePaths":["string"],"excludePaths":["string"],"pathTemplates":["string"],"partners":[{"name":"string","paths":["string"]}]},"crawl":{},"alerts":{"channel":"slack","webhookUrl":"string","emailRecipients":["string"],"telegramChatId":"string","include":["page-changes"]},"facts":[{"key":"string","value":"string","category":"other","terms":[],"sourceUrl":null}],"goals":[{"name":"string","kind":"pageview","match":"string","valueMinor":null}],"funnels":[{"name":"string","steps":[{"kind":"pageview","match":"string","label":"string"}]}],"dryRun":false}'
TypeScript
Python
Go
PHP
Ruby
Java

Responses

200 The tool's result under data, and its meta.
Example
{
  "data": {},
  "meta": {
    "requestId": "string",
    "costMicros": 0,
    "cached": true,
    "cachedFrom": "string",
    "dataAsOf": "string",
    "sources": [
      "string"
    ],
    "partial": true,
    "next": [
      {
        "tool": "string",
        "args": {},
        "why": "string"
      }
    ],
    "nextCursor": "string",
    "dryRun": true
  }
}
Schema
datarequired
metaobjectrequired
Beside every answer: what it cost, whether it came from cache, how fresh it is, whether it is complete, and what to call next.
Show child parameters
requestIdstringrequired
costMicrosintegerrequired
Charged by this call, micro-USD (1,000,000 = $1).
cachedbooleanrequired
True when nothing was bought.
cachedFromstring
When the oldest cached answer used was bought.
dataAsOfstring
sourcesstring[]
partialbooleanrequired
True when the data is incomplete: a running crawl, unfinished days, unread pages.
nextobject[]required
Show child parameters
toolstring
argsobject
whystring
nextCursorstring
Pass as cursor for the next page.
dryRunboolean
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
X-Request-Idstring
The id to quote about this request.
400 The body was not JSON or did not match the tool's input schema.
Example
{
  "error": "string",
  "code": "string",
  "next": "string",
  "requestId": "string"
}
Schema
errorstringrequired
A sentence written for the caller. Internal failures are reduced to 'The request could not be completed.' and never carry detail.
codestring
A stable snake_case reason to branch on; GET /api/v1/errors lists them all.
nextstring
The call or step that fixes it, when there is one.
requestIdstring
Quote it when asking about a failure.
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
401 No key, or a key that is unknown or revoked.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
WWW-Authenticatestring
403 The key's role does not permit the tool, or the key may not reach the named client.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
404 No tool by that name.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
409 A request with this Idempotency-Key is still running.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
422 A well-formed request the product declined, with the reason — a duplicate name, a plan limit, nothing configured to run.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
429 This key has used its window.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Retry-Afterinteger
Seconds to wait before retrying.
500 The request could not be completed.

Same as 400 · POST /api/v1/tools/apply_manifest

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Updated