API

Alles wat de app kan, ook via de API.

JSON over HTTPS, API-sleutels met lees- of schrijfrecht en dezelfde rechten als in de app. Gemaakt uit dezelfde bron waartegen de server zijn routes controleert, dus het beschrijft wat live staat.

Basis

Alles staat onder https://instnt.studio/api/. Verzoeken en antwoorden zijn JSON in UTF-8, tenzij hieronder anders staat (CSV, PDF, JavaScript). De app zelf gebruikt dezelfde API; wat in de app kan, kan via de API, binnen de rechten van de gebruiker.

Elke route werkt ook met .php erachter (/api/events.php). Dat houdt adressen uit de oude PHP-API geldig; gebruik zelf de korte vorm.

Inloggen met een API-sleutel

Maak een sleutel onder Instellingen → API-sleutels en stuur hem mee als Authorization: Bearer studio_…. Studio toont de sleutel één keer en bewaart alleen een hash. Een sleutel heeft de rechten van wie hem maakte, plus een bereik: lezen (alleen GET), lezen en schrijven (ook POST) of MCP (alleen /api/mcp). Het aantal sleutels hangt af van het plan.

Een paar routes zijn voor mensen en werken nooit met een sleutel: tokens, tweestap, wachtwoord wijzigen, de workspace verwijderen, meekijken als klant, uitloggen en het beheer van instnt. Die geven 403 token_not_allowed. Schrijven met een leessleutel geeft 403 token_read_only. GET /api/me kijkt alleen naar de sessie en geeft met een sleutel user: null.

Workspace en rechten

Een gebruiker hoort bij precies één workspace, dus een sleutel werkt altijd in die workspace; er is geen header om te kiezen. Het team heeft drie rollen: eigenaar en lid mogen beheren, kijker alleen lezen. Een klant ziet alleen de projecten waar hij toegang toe heeft, per onderdeel (Overzicht, Website, Zoeken, Product, Advies, Ads) met een niveau. Vraagt een klant naar een project of onderdeel dat niet van hem is, dan geeft Studio 404 in plaats van 403: een klant hoeft niet te weten dat het bestaat.

Een eigenaar die meekijkt als klant kan niets wijzigen (403 viewing_as_readonly).

Lezen en schrijven

Per onderwerp is er meestal één adres: GET om te lezen, met parameters in de querystring (vaak project_id), en POST met een JSON-body om te schrijven. De body heeft een veld action dat zegt wat er moet gebeuren, bijvoorbeeld {"action": "status", "id": 12, "status": "done"}. Onbekende acties geven 422 unknown_action.

Werk dat lang duurt (crawl, rapport, adviezen verversen, cookiescan) gaat op de achtergrond: het antwoord is 202 met een task_id, en GET /api/task?id=… geeft queued, running, done of failed.

Lijsten hebben meestal een vaste bovengrens (bijvoorbeeld 500 adviezen of 300 pagina's). Pagina's bestaan alleen waar het hieronder staat, met page: contacten (50 per pagina), het logboek van automatiseringen (25) en de contacten in een funnel.

Antwoorden en fouten

Een geslaagd antwoord heeft "ok": true met de gegevens ernaast. Een fout heeft "ok": false, een vaste code in error, soms een leesbare uitleg in detail (Nederlands) en bij formulieren per veld een melding in fields.

Veelvoorkomende codes: 401 unauthorized (geen of ongeldige sleutel), 402 plan_limit of plan_feature (het plan staat het niet toe), 403 forbidden, 404 not_found, 410 (verlopen link of uitnodiging), 422 validation of unknown_action, 429 too_many_requests en 502 als een externe dienst (Google, GitHub) faalt.

Limieten

Per API-sleutel 120 verzoeken per minuut. Openbare adressen hebben hun eigen grenzen: inloggen 5 per minuut per e-mailadres en 20 per IP, deellinks en statuspagina's 30 per minuut per IP, server-naar-server-events 600 per minuut per IP, metingen van het sitescript 60 per minuut per bezoeker, inkomende webhooks van automatiseringen 30 per minuut per adres, sitegebeurtenissen 120 per minuut per adres.

Andere sleutels

Naast de persoonlijke API-sleutel zijn er sleutels voor één doel: een deploysleutel (POST /api/deploys en /api/components), een conversiesleutel per bron (POST /api/events), een terugschrijfsleutel voor de WordPress- of Drupal-module (/api/titles) en adressen met het geheim erin (inkomende webhooks, back-uppings, datafeeds). Die staan bij de routes zelf.

Deze referentie bestaat ook als OpenAPI 3.1: GET /api/openapi.json (Nederlands) of ?lang=en.

Voorbeeld: Home Assistant

GET /api/tech-overview geeft in één antwoord de stand van alle sites. Maak een sleutel met bereik lezen en zet in configuration.yaml:

rest:
  - resource: https://instnt.studio/api/tech-overview
    headers:
      Authorization: !secret studio_token
    scan_interval: 300
    sensor:
      - name: Studio sites offline
        value_template: "{{ value_json.kpis.down }}"
      - name: Studio certificaten binnen 14 dagen
        value_template: "{{ value_json.kpis.certs_14d }}"
      - name: Studio projecten met kritiek of hoog lek
        value_template: "{{ value_json.kpis.vulns_critical_high }}"
      - name: Studio bronnen met aandacht
        value_template: "{{ value_json.kpis.sources_error }}"
      - name: Studio app-downloads 7 dagen
        value_template: "{{ value_json.kpis.app_downloads_7d }}"

In secrets.yaml: studio_token: "Bearer studio_…". Let op: certs_14d, vulns_critical_high en php_outdated tellen projecten, niet certificaten of lekken; vulns_open telt wel lekken.

Account en inloggen

Inloggen, uitnodigingen, wachtwoorden, tweestap en de eigen sleutels. Op een paar na zijn dit routes voor mensen.

GET/api/me

Wie is er ingelogd

Met een sessie: de gebruiker, workspace, rol, functies, plan en wat op goedkeuring wacht. Zonder sessie: user: null en wat het inlogscherm nodig heeft. Kijkt niet naar API-sleutels.

Toegang
Geen inlog

Antwoord

user?objectid, email, name, is_admin, role, can_manage, is_client, two_factor
workspacesobject[]id, slug, name, role
featuresobject
modulesobjectPer module of hij aan staat voor de werkruimte (plan en instelling).
plan?objectkey, label, limits, usage, trial_ends_at, active, cancel_from, data_delete_on
approvals_openint
terms?objectalleen voor de eigenaar / owner only: version, required, deadline, blocking
start_page?string
viewed_by?object
google_connectbool
setup_requiredbool
google_loginbool
signup_openbool
brand?object
POST/api/login

Inloggen met e-mail en wachtwoord

Zet het sessiecookie. Staat tweestap aan, dan komt er eerst een challenge terug voor /api/login/two-factor. De app voor iOS en macOS stuurt client: app mee en krijgt dan een token in het antwoord in plaats van een cookie; dat gaat mee als Authorization: Bearer studioapp_… en staat onder Account → Apparaten.

Toegang
Geen inlog

Body

email*email
password*string
clientappAlleen de app.
device_namestringNaam onder Account → Apparaten; zonder naam "iPhone van <voornaam>".
device_modelstringiPhone, iPad of Mac.

Antwoord

two_factorbool
challengestring
tokenstringAlleen met client: app, één keer te zien.
device_namestring
POST/api/login/two-factor

Tweede stap: code uit de app of herstelcode

Na vijf foute codes vervalt de tussenstap. Begon de login in de app, dan komt er een token terug in plaats van een cookie.

Toegang
Geen inlog

Body

challengestringUit het antwoord van /api/login; na Google staat hij in een cookie.
code*string

Antwoord

token?string
device_name?string
GET/api/login/google

Inloggen met Google starten

Stuurt de browser door naar Google (OpenID Connect met PKCE). Alleen voor bestaande gebruikers. 404 als Google-inloggen niet is ingesteld. De app start met ?client=app&code_challenge=… (S256, minstens 43 tekens) en komt terug op instntstudio://login?code=…, ?challenge=… (tweestap) of ?error=….

Toegang
Geen inlog
Status
302
POST/api/login/app

App: code van na Google inwisselen

Eenmalig en twee minuten geldig; een verkeerde verifier verbruikt de code ook.

Toegang
Geen inlog

Body

code*string
code_verifier*stringWaarvan de app bij de start de S256-hash meegaf.

Antwoord

tokenstring
device_namestring
GET/api/login/google/callback

Terugkeer van Google

Google stuurt de browser hierheen. Een kleine pagina zet de sessie en gaat terug naar de app.

Toegang
Geen inlog
POST/api/logout

Uitloggen

Beëindigt de sessie en wist het cookie.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
POST/api/setup

Eerste gebruiker aanmaken

Werkt alleen zolang er nog geen gebruikers zijn (installatie); daarna 403 already_installed.

Toegang
Geen inlog

Body

email*email
namestring
password*stringMinstens 10 tekens.
POST/api/signup

Aanmelden als bureau (proefperiode)

Stuurt een bevestigingsmail. Geeft altijd sent: true, ook als het adres al bestaat. 404 zolang aanmelden dicht staat.

Toegang
Geen inlog

Body

email*email
name*string
agency*string
password*stringMinstens 10 tekens.
partnerstringPartnercode.
terms*boolAkkoord met voorwaarden en verwerkersovereenkomst; versie en tijd worden vastgelegd.

Antwoord

sentbool
POST/api/signup/confirm

Aanmelding bevestigen

Maakt gebruiker en workspace en start een sessie. 410 signup_expired na 24 uur, 409 exists als het adres al een account heeft.

Toegang
Geen inlog

Body

token*string
GET/api/invitation

Uitnodiging bekijken

Toegang
Geen inlog

Queryparameters

token*string

Antwoord

emailemail
workspacestring
project?string
existing_userbool
POST/api/invitation

Uitnodiging aannemen

Nieuwe gebruiker: naam en wachtwoord kiezen. Bestaande gebruiker: met het eigen wachtwoord bevestigen, of zonder als je al ingelogd bent als die gebruiker. Je kunt bij meerdere workspaces horen. Start een sessie in de workspace van de uitnodiging.

Toegang
Geen inlog

Body

token*string
password*string
namestring
POST/api/password/forgot

Herstellink aanvragen

Antwoordt altijd hetzelfde, zodat niet te zien is welke adressen een account hebben. De link werkt 60 minuten.

Toegang
Geen inlog

Body

email*email
POST/api/password/reset

Nieuw wachtwoord instellen

Beëindigt alle andere sessies en start een nieuwe.

Toegang
Geen inlog

Body

token*string
password*stringMinstens 10 tekens, hooguit 72 bytes, niet uit een bekend datalek.
POST/api/password/change

Wachtwoord wijzigen

Andere sessies vervallen; deze blijft geldig.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Body

current*string
password*stringMinstens 10 tekens, hooguit 72 bytes, niet uit een bekend datalek.
POST/api/two-factor

Tweestapsverificatie beheren

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Acties (action)

  • status

    Antwoord: enabled, required, enforced, has_password, recovery_codes_left.

  • setup

    Nieuw geheim; nog niet actief tot confirm. Antwoord: secret, uri.

  • confirmcode*

    Zet tweestap aan en beëindigt andere sessies. Antwoord: recovery_codes.

  • disablepassword, code*

    Kan niet als tweestap verplicht is.

    • password string · Verplicht als je een wachtwoord hebt.
  • recovery_codespassword, code

    Antwoord: recovery_codes.

    • password string · Verplicht als je een wachtwoord hebt.
    • code string · Verplicht zonder wachtwoord.
GET/api/tokens

Eigen API-sleutels

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Antwoord

tokensobject[]id, name, scope, last_used_at, created_at, archived_at, workspace_id, workspace
POST/api/tokens

API-sleutel maken of intrekken

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Acties (action)

  • createname, scope

    De sleutel werkt alleen in de workspace waarin hij is gemaakt. Een oudere sleutel zonder workspace kiest er een met de header X-Workspace: <id>. Valt onder de limieten van het plan. Antwoord: token.

    • scope mcp | read | write · Standaard mcp.
  • deleteid*
GET/api/devices

Toestellen voor pushmeldingen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
De ingelogde gebruiker zelf.

Antwoord

devicesobject[]id, environment, created_at, last_sent_at
POST/api/devices

Toestel aan- of afmelden voor push

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
De ingelogde gebruiker zelf.

Acties (action)

  • registertoken*, environment
    • token string · APNs-toesteltoken, hex.
    • environment sandbox | production
  • removetoken*
POST/api/view-as

Meekijken als klant

Zolang het meekijken loopt, kan er niets gewijzigd worden.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Acties (action)

  • startuser_id*
    • user_id int · Een klant van de eigen workspace.
  • stop
GET/api/profile

Je eigen account

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Antwoord

profileobjectname, email, timezone, avatar, has_password, google, created_at
pending_email?objectemail, expires_at
reauthpassword | code | google | noneHoe je je identiteit bevestigt bij een gevoelige actie.
notifyobject[]key, label, on
quiet_hours?objectStille uren voor push: from en to, HH:MM in je eigen tijdzone.
sessionsobject[]key, kind (browser|app), device, network, via, created_at, last_used_at, last_used_label, current
workspacesobject[]id, name, role, suspended_at
delete_blockersstring[]Workspaces waar je eigenaar van bent; zolang die er zijn, kan je account niet weg.
timezonesstring[]
POST/api/profile

Je account wijzigen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Acties (action)

  • profilename*, timezone
    • timezone ?string · IANA-naam, bijv. Europe/Amsterdam. Geldt voor tijden in mails en lijsten.
  • avataravatar*

    Multipart-formulier. Antwoord: avatar.

    • avatar file · JPG, PNG, WebP of GIF tot 3 MB; wordt 160 × 160 WebP zonder metadata.
  • avatar_delete
  • emailemail*, password, code

    Stuurt een link naar het nieuwe adres; tot die is geopend blijft het oude gelden. Antwoord: mailed, pending_email.

    • password string · Je wachtwoord; zonder wachtwoord (alleen Google) een code uit de app, of eerst opnieuw inloggen met Google.
  • email_cancel
  • notifyprefs*

    Antwoord: prefs.

    • prefs object · Per soort aan of uit: alerts, anomalies, digest, automations. Facturen en beveiliging kun je niet uitzetten.
  • quiet_hoursfrom, to

    Pushmeldingen komen dan zonder geluid binnen. Antwoord: quiet_hours.

    • from string · HH:MM; zonder from en to staan de stille uren uit.
  • session_revokekey*

    Bij een app ook de pushmeldingen naar dat toestel. Antwoord: sessions.

  • sessions_revoke_others

    Antwoord: revoked, sessions.

  • reauthpassword, code

    Bevestigt je identiteit voor tien minuten.

    • password string · Je wachtwoord; zonder wachtwoord (alleen Google) een code uit de app, of eerst opnieuw inloggen met Google.
  • leaveworkspace_id*

    Niet als eigenaar: draag eerst het eigendom over.

  • delete_accountpassword, code

    Anonimiseert je account en logt uit. Niet zolang je eigenaar bent van een workspace.

    • password string · Je wachtwoord; zonder wachtwoord (alleen Google) een code uit de app, of eerst opnieuw inloggen met Google.
POST/api/email/confirm

Nieuw e-mailadres bevestigen

De link uit de mail naar het nieuwe adres (24 uur). Het oude adres krijgt een mail met een link om terug te draaien.

Toegang
Geen inlog; het geheim zit in het adres

Body

token*string

Antwoord

emailemail
POST/api/email/undo

E-mailwijziging terugdraaien

De link uit de mail naar het oude adres (24 uur). Zet het oude adres terug, beëindigt alle sessies en trekt API-sleutels in.

Toegang
Geen inlog; het geheim zit in het adres

Body

token*string

Antwoord

emailemail

Workspace, team en abonnement

Wie toegang heeft, uitnodigingen, huisstijl, facturen en het beheer van instnt.

GET/api/access

Team, klanten en uitnodigingen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Queryparameters

project_idintMet project: de klanten van dat project. Zonder: het team.

Antwoord

teamobject[]id, email, name, role, last_login_at, two_factor, avatar, archived
clientsobject[]id, email, name, last_login_at, projects
require_two_factorbool
is_ownerbool
meint
peopleobject[]id, email, name, preset, permissions, last_login_at, since
invitationsobject[]id, email, role, preset, expires_at, created_at
presetsobject[]id, label, permissions
POST/api/access

Uitnodigen en toegang regelen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • inviteemail*, role, project_id, preset

    Iemand die al bij een ander bureau hoort, kan ook worden uitgenodigd; hij wisselt dan tussen workspaces. Valt onder de limieten van het plan. Antwoord: invitation_id, link, mailed, granted.

    • role client | member | viewer · Standaard client. Lid of kijker uitnodigen kan alleen de eigenaar.
    • project_id int · Verplicht voor een klant.
    • preset client_readonly | client_approver | client_limited
  • updateproject_id*, user_id*, preset*
    • preset client_readonly | client_approver | client_limited
  • removeproject_id*, user_id*

    De klant verliest de toegang tot dit project.

  • revokeinvitation_id*
  • resendinvitation_id*

    Nieuwe link (de oude vervalt), weer 14 dagen geldig. Antwoord: link, mailed.

  • remove_memberuser_id*

    Haalt iemand uit de workspace, met een mail. De eigenaar voor teamleden; eigenaar of lid voor klanten.

  • change_roleuser_id*, role*

    Alleen de eigenaar van de workspace.

    • role member | viewer
  • transferuser_id*, password, code

    Eén eigenaar per workspace: de nieuwe wordt eigenaar, jij wordt teamlid. Beiden krijgen een mail. Alleen de eigenaar van de workspace.

    • user_id int · Iemand uit het team.
    • password string · Je wachtwoord; zonder wachtwoord (alleen Google) een code uit de app, of eerst opnieuw inloggen met Google.
  • require_two_factoron*

    Teamleden zonder tweestap kunnen daarna alleen nog tweestap instellen. Eerst zelf aanzetten. Alleen de eigenaar van de workspace.

GET/api/workspace/export

Alle gegevens van de workspace exporteren

Een JSON-bestand als download. Werkt ook met een leessleutel van de eigenaar.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Antwoord

…objectAlle tabellen van de workspace.
POST/api/workspace/delete

Workspace verwijderen

Vraagt de naam van de workspace en je identiteit. 409 has_invoices zolang er facturen zijn (bewaarplicht).

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Body

name*string
passwordstringJe wachtwoord; zonder wachtwoord (alleen Google) een code uit de app, of eerst opnieuw inloggen met Google.
codestring
POST/api/workspace/switch

Andere workspace kiezen

Geldt voor deze sessie en wordt onthouden voor de volgende login. Alleen een workspace waar je lid van bent.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Body

workspace_id*int

Antwoord

workspace_idint
POST/api/workspace/create

Nieuwe workspace

Je wordt eigenaar. Met een proefperiode, tenzij je die al eens had als eigenaar; dan kies je meteen een plan.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Body

name*string

Antwoord

workspace_idint
trialbool
POST/api/workspace/rename

Naam van de workspace wijzigen

Alleen de eigenaar, niet met een API-sleutel.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Body

name*string

Antwoord

namestring
GET/api/logboek

Logboek van de workspace

Wie deed wat, twee jaar terug. Met format=csv als bestand (hooguit 10.000 regels).

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Queryparameters

user_idint
grouptoegang | account | abonnement | werk | koppelingen | mail
fromdate
todate
pageint
formatcsv

Antwoord

entriesobject[]id, at, action, label, subject, user, details
totalint
pageint
per_pageint
retention_daysint
groupsobject[]key, label
peopleobject[]id, name, email
GET/api/branding

Huisstijl van het bureau en een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_idint

Antwoord

workspaceobjectlogo, color, custom_domain, domain_status
project?objectlogo, color
POST/api/branding

Huisstijl en eigen domein instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • saveproject_id, logo, color, remove_logo
    • project_id int · Zonder project: het bureau (alleen de eigenaar).
    • logo string · PNG, JPEG of WebP als base64 of data-URL, hooguit 300 kB.
  • domaindomain

    Alleen de eigenaar van de workspace. Valt onder de limieten van het plan. Antwoord: domain, status, target.

    • domain string · Subdomein van je eigen domein; leeg haalt het weg.
  • domain_check

    Alleen de eigenaar van de workspace. Antwoord: domain, status, target.

GET/api/billing

Abonnement, factuurgegevens en facturen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Antwoord

details?objectname, address, postcode, city, country, vat_number, email, cc_email, reference
intervalstring
yearly_from?date
price?objectmonth, year, label
exemptbool
vat?objectverified, checked_at
paymentsobjectonline, mode (off, test, live, wrong)
mandateobjectactive, method (directdebit, creditcard), details (gemaskeerd / masked), status, methods
suspended?string
invoicesobject[]id, number, period, period_label, issued_on, due_on, gross_cents, refunded_cents, credited_cents, due_cents, status (open, paid, refunded, chargeback, credited, credit), last_payment_status, credit_of, credit_of_number, paid_at, pay_url
subscriptionobjectstate (proef, actief, opzegging, opgezegd, verlopen, geschorst, gepauzeerd), plan, label, interval, trial_ends_at, paid_until, term, cancel_from, pending, data_delete_on, data_purged_at, pause (?object: since, until, cancelled), pause_blocked (?string), pause_max_months
plansobject[]key, label, price, price_year, price_next (?object: from, price, price_year), pitch, limits, ads_modes, white_label, over (wat niet past / what does not fit)
usageobject
addonsobject[]key, label, price (euro per maand per stuk / euro per month each), limit, amount, quantity, available
archivedobjectprojects, team, keywords, dashboards, api_tokens, automations
upcomingobject[]date, period_label, lines, net_cents, vat_cents, gross_cents
historyobject[]id, text, kind, pending, note, created_at
termsobjectversion, accepted_version, accepted_at, required, deadline, blocking, terms_url, dpa_url
has_passwordbool
POST/api/billing

Abonnement wijzigen, opzeggen, factuurgegevens

Groter plan: direct, per dag of het verschil voor de rest van het jaar. Kleiner plan of terug naar per maand: na de betaalde periode. Een kleiner plan, opzeggen en pauzeren vragen herbevestigen: password, of zonder wachtwoord code uit de authenticator of een verse login met Google (hooguit tien minuten oud).

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Acties (action)

  • detailsname*, address*, postcode*, city*, country, vat_number, email*, cc_email, reference

    Antwoord: vat, message.

    • country string · Landcode, standaard NL.
    • vat_number string · Buiten NL in de EU gecontroleerd bij VIES; alleen dan wordt de btw verlegd.
    • cc_email email · Krijgt een kopie van elke factuur en herinnering.
    • reference string · Eigen kenmerk (inkoopordernummer) op de factuur.
  • yearly

    Per jaar betalen vanaf de eerste van de volgende maand. Antwoord: yearly_from, message.

  • previewplan*, interval*

    Wat er zou gebeuren, zonder iets te wijzigen. Antwoord: preview.

    • plan solo | inzicht | copiloot | begeleid
    • interval maand | jaar
  • changeplan*, interval*, archive, password, code

    Antwoord: message, effective_from.

    • plan solo | inzicht | copiloot | begeleid
    • interval maand | jaar
    • archive object · Per onderdeel de id's die apart gaan (projects, team, clients, api_tokens, automations, keywords:<project>, dashboards:<project>).
    • password string · Bij een kleiner plan: je wachtwoord, of zonder wachtwoord een code uit de app (of eerst opnieuw inloggen met Google).
  • cancelpassword, code

    Opzeggen per einde van de betaalde periode. Antwoord: ends_on, message.

    • password string · Je wachtwoord, of zonder wachtwoord een code uit de app (of eerst opnieuw inloggen met Google).
  • resume

    Een opzegging intrekken die nog niet is ingegaan. Antwoord: message.

  • withdraw

    Een geplande wijziging (kleiner plan, andere betaalwijze) intrekken; alles blijft zoals het nu is. Niet voor een opzegging, een pauze of wat beheer plande. Antwoord: message.

  • restorekind*, id*

    Iets dat apart staat terugzetten, als het plan er ruimte voor heeft. Antwoord: message.

    • kind projects | team | keywords | dashboards | api_tokens | automations
  • terms

    Akkoord met de huidige voorwaarden en verwerkersovereenkomst. Antwoord: terms.

  • mandate_setupmethod*

    Automatisch betalen: een eerste betaling bij Mollie geeft een machtiging. Staat er een factuur open, dan is dat de eerste betaling; anders € 0,00 (creditcard) of € 0,01 die meteen terug gaat. Antwoord: checkout_url.

    • method ideal | bancontact | creditcard
  • mandate_revoke

    Automatisch betalen uitzetten; facturen komen weer met een betaallink. Antwoord: message.

  • pausemonths*, password

    Pauzeren vanaf vandaag: niets betalen, alleen kijken, geen achtergrondwerk. Alleen bij betalen per maand, één keer per twaalf maanden. Antwoord: until, message.

    • months int · 1 tot 3.
    • password string · Of code / een verse Google-login, zie herbevestigen.
  • end_pause

    De pauze nu beëindigen; het abonnement gaat vandaag weer in. Antwoord: message.

  • addonaddon*, quantity*

    Extra ruimte bovenop het plan, vanaf vandaag per dag op de maandfactuur. Minder mag alleen als alles nog past. Antwoord: message, addons.

    • addon string · Sleutel uit addons.
    • quantity int · 0 tot 20; 0 = weg.
GET/api/billing/pdf

Factuur als PDF

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Queryparameters

id*int
GET/api/partner

Partnerprogramma: code, aangebrachte bureaus en commissie

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen de eigenaar van de workspace.

Antwoord

partner?objectcode, commission_pct, discount_pct, active, link, referred, commission
GET/api/werkwijzen

Werkwijzen van het eigen team

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

slugstringEén werkwijze als HTML.

Antwoord

standardsobject[]
standardobject
GET/api/admin

Beheer: workspaces, gebruikers, wachtrij, plannen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Antwoord

workspacesobject[]
usersobject[]
queueobjectpending, oldest, failed
tablesobject[]
flagsobject
plansobject
backup?object
pleskobject
partnersobject[]
GET/api/admin/invoices

Beheer: alle facturen en creditfacturen

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Queryparameters

statusstringopen, paid, credit, … of te_laat.
periodstringjjjj of jjjj-mm (factuurdatum).
workspace_idint
qstring

Antwoord

invoicesobject[]
totalsobjectcount, net_cents, vat_cents, gross_cents, open_cents, late_cents
workspacesobject[]
GET/api/admin/invoice/pdf

Beheer: factuur of creditfactuur als PDF

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Queryparameters

id*int
GET/api/admin/export

Beheer: CSV voor de boekhouding, ICP-opgave, partneruitbetaling

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Queryparameters

kind*invoices | icp | payout
fromdate
todate
quarterstringAls 2026-Q3.
idintUitbetaling.
POST/api/admin

Beheeracties

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Acties (action)

  • featureworkspace_id*, feature*, state*
    • state aan | uit | standaard
  • retryid*
    • id int · Mislukte taak.
  • forgetid*
  • planworkspace_id*, plan*, trial_days
  • intervalworkspace_id*, interval*, from
    • interval maand | jaar
    • from date · De eerste van een maand.
  • trial_extendworkspace_id*, days

    Antwoord: trial_ends_at.

    • days int · 1–90, standaard 7; vanaf de huidige einddatum.
  • data_holdworkspace_id*, until
    • until ?date · Opruimen uitstellen tot deze datum; leeg heft het op.
  • partnerworkspace_id*, code*, commission_pct, discount_pct, active
  • commission_paidinvoice_id*

    Antwoord: updated.

  • mark_paidinvoice_id*, paid_on, reference

    Betaald per bankoverschrijving; heft een schorsing op.

    • paid_on date · Tussen factuurdatum en vandaag.
  • creditinvoice_id*, amount_cents, reason*, refund

    Antwoord: number, gross_cents.

    • amount_cents int · Zonder btw; leeg is de hele factuur.
    • refund bool · Ook terugbetalen via Mollie.
  • remindinvoice_id*
  • discountworkspace_id*, kind*, value*, months, note*, starts_on
    • kind pct | fixed
    • value int · Procent (1–100) of centen per factuur.
  • discount_endid*
  • close_workspaceworkspace_id*, reason
  • unsuspendworkspace_id*
  • end_pauseworkspace_id*

    Een pauze beëindigen; de klant krijgt een mail.

  • price_scheduleplan*, price*, price_year*, from*

    Antwoord: announced.

    • from date · Minstens 30 dagen vooruit; betalende klanten op dat plan krijgen een mail.
  • price_cancelid*
  • partner_payout_infoworkspace_id*, name, iban
  • payout

    Alle open commissie van betaalde facturen in één uitbetaling. Antwoord: id.

  • payout_paidid*
  • plesk_addurl*, api_key*, name

    Antwoord: id, domains, error.

  • plesk_checkid*

    Antwoord: domains.

  • plesk_removeid*

Projecten en overzicht

Projecten, de overzichten over alle klanten heen, dashboards, doelen, de tijdlijn en uren.

GET/api/projects

Projecten met het aantal bronnen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Antwoord

projectsobject[]id, name, color, website (het ingestelde adres, of afgeleid uit uptime of Search Console), website_set, position (eigen volgorde van de gebruiker, of null), brand_terms, template, conversion_value, property_count, app_source_count, search_console_count, access
templatesobject

Voorbeeld: Antwoord

{
  "ok": true,
  "projects": [
    {
      "id": 5,
      "name": "Bakkerij Jansen",
      "color": "#3552c9",
      "brand_terms": "jansen",
      "template": "lokaal",
      "conversion_value": 45,
      "property_count": 1,
      "app_source_count": 0,
      "search_console_count": 1,
      "access": {
        "overview": "manage",
        "website": "manage",
        "search": "manage",
        "product": "manage",
        "advice": "manage",
        "ads": "manage"
      }
    }
  ],
  "templates": {}
}
POST/api/projects

Projecten maken, wijzigen en indelen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createname*, template*

    Valt onder de limieten van het plan. Antwoord: project_id.

    • template webshop | saas | lokaal | b2b | content · Verplicht sinds 06-10-2026: het Overzicht kiest zijn kengetallen op het soort project.
  • renameproject_id*, name*
  • updateproject_id*, name*, color*, conversion_value, template, brand_terms, website

    Antwoord: website.

    • color string · Als #rrggbb.
    • brand_terms string · Komma-gescheiden.
    • website string · Adres van de site; leeg wist het. Een ander domein verhuist uptimecontroles en sitecontrole mee.
  • deleteproject_id*

    Bronnen blijven bestaan en worden los.

  • assignproperty_id*, project_id
    • property_id int · GA4-property.
  • rename_propertyproperty_id*, name
    • name string · Leeg zet de naam uit Google terug.
GET/api/glance

Alles in één oogopslag (menubalk en widgets)

Klein genoeg om elke minuut op te vragen. live is null als Google niet bereikbaar is.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Antwoord

projectsobject[]id, name, monitored, down, uptime_30d, live, visitors_today, visitors_yesterday, leads_today, open_advice, open_questions
totalsobjectsites_total, sites_up, uptime_30d, visitors_today, visitors_yesterday, leads_today, open_advice, last_deploy, approvals
live?object[]project, live
live_total?int
downobject[]project, url, since
open_questions?int
new_adviceint
proposalsobject[]
studiourl
POST/api/extension/connect

Sleutel voor de browserextensie maken

Een sleutel met bereik extension: die mag alleen /api/extension/*. Studio geeft hem via de pagina aan de extensie; hij staat daarna bij API-sleutels en is daar in te trekken.

Toegang
Alleen met een sessie in de app, niet met een API-sleutel
Wie
De ingelogde gebruiker zelf.

Antwoord

tokenstring
studiourl
GET/api/extension/sites

Projecten met hun domeinen (extensie)

Registreerbare domeinen per project waarvan je de website mag zien. De extensie telt daar je eigen bezoeken niet mee, als je dat aanzet.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Antwoord

projectsobject[]id, name, domains
studiourl
GET/api/extension/site

Het project bij een adres, met cijfers (extensie)

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

url*url

Antwoord

project?objectid, name, link
visitors_today?int
visitors_yesterday?int
uptimeobjectmonitored, down, uptime_30d
security_score?objectscore, previous
open_advice?int
last_deploy?objecttitle, at
refs_todayobject[]ref, visitors
GET/api/extension/post

Wie een post volgt (extensie)

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

url*urlLink naar een post op Reddit, Hacker News, Bluesky of Mastodon.

Antwoord

platformstring
followedobject[]id, project (id, name), ref, score, comments, last_checked_at, last_error
projectsobject[]id, name; waar je hem kunt volgen
POST/api/extension/post

Cijfers van een post die je bekijkt naar Studio (extensie)

Voor Reddit, dat servers weigert: de extensie leest score en reacties van de pagina die je zelf open hebt, na een klik.

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Wie de website van het project mag beheren.

Acties (action)

  • snapshoturl*, score*, comments*, title, author

    404 als niemand in deze workspace de post volgt. Antwoord: updated.

  • followurl*, project_id*, ref, score, comments, title, author

    Antwoord: id, updated.

GET/api/runtime

Versies en lekken over alle projecten

PHP, webserver, database, besturingssysteem en CMS per project (21-10-2026), de beste bron eerst: de site zelf (plugin, module, pakket), dan de headers, dan Plesk. Met de status uit endoflife.date: ok, update (er is een nieuwere release in dezelfde lijn), eol (geen beveiligingsupdates meer) of onbekend. Met cve of product + below zie je welke projecten een lek raakt; certain is false als alleen 8.3 bekend is (Plesk).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

cvestringEen CVE, bijv. CVE-2026-1234: lekken die Studio al vond plus de geraakte versies uit de NVD.
productphp | nginx | apache | litespeed | mysql | mariadb | postgresql | wordpress | drupal
belowstring
fromstring

Antwoord

projectsobject[]project_id, project, items (per product: label, version, source site|header|plesk, detail, state ok|update|eol|onbekend, cycle, latest, eol), vulnerabilities (serious, total)
productsobject
checked_at?string
lookupobjectcve, summary, severity, ranges, projects (project_id, project, product, version, certain, fixed_in, resolved), source nvd|studio|onbekend
POST/api/runtime

Versies nu controleren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid.

Acties (action)

  • check

    Haalt de releases op, neemt over wat headers en Plesk weten en loopt de lekken in plugins en pakketten op de achtergrond na. Hooguit eens per minuut. Antwoord: projects.

GET/api/tech-overview

Technisch overzicht over alle projecten

Per project een score met de punten die aandacht vragen: onbereikbaar, certificaat, domein, lekken, PHP, Web Vitals, headers, back-ups en JavaScript-fouten. Zie het voorbeeld met Home Assistant hierboven.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

kpisobjectprojects, attention, down, certs_14d, domains_30d, vulns_critical_high, vulns_open, php_outdated, vitals_poor, js_new_7d, sources_error, sources_waiting, app_downloads_total (?int, eerste downloads van alle gekoppelde apps sinds de lancering), app_downloads_7d (?int)
sourcesobject[]bronnen met status error, stale of unknown, met project_name (zie GET /api/inventory)
projectsobject[]id, name, score, status, issues, sites, down, uptime_30d, ssl, domain, vulns, php, php_outdated, vitals, headers, js_errors_7d, js_new_7d, backup, last_deploy
appsobject[]project_id, project, connect, downloads_total, downloads_7d, downloads_30d, downloads_prev_30d, crashes_7d, rating, reviews, version

Voorbeeld: Antwoord

{
  "ok": true,
  "kpis": {
    "projects": 9,
    "attention": 2,
    "down": 0,
    "certs_14d": 1,
    "domains_30d": 0,
    "vulns_critical_high": 1,
    "vulns_open": 3,
    "php_outdated": 0,
    "vitals_poor": 0,
    "js_new_7d": 4,
    "sources_error": 1,
    "sources_waiting": 2
  },
  "projects": []
}
GET/api/source-catalog

Catalogus van bronnen: aanbevolen en wat nodig is

Voor de catalogus onder Bronnen. recommended: per soort de projecten waar Studio de dienst op de site zag (Wat draait er) zonder koppeling. capabilities: per soort de onderdelen met de rechten die minimaal nodig zijn. De stand per bron staat in GET /api/inventory.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

recommendedobjectsoort → object[]: project_id, project, host, label
capabilitiesobjectsoort → object[]: key, label, needs, why, write
GET/api/app-downloads

Downloads van de app van een project

Uit de verkooprapporten van App Store Connect die Studio bewaart, aangevuld met App Analytics: eerste downloads per dag (365 dagen), per maand (24) en per jaar, het totaal sinds de lancering, landen en de vergelijking met vorig jaar. Voor een dag die App Analytics dekt telt die waarde, net als in App Store Connect; analytics_differs meldt dat het verkooprapport iets anders zegt (vaak een ontbrekend vendornummer). acquisition is het overzicht van App Store Connect per datum: vertoningen (inclusief productpagina's), productpaginaweergaven, eerste downloads, opnieuw gedownload, updates, conversie (downloads ÷ unieke vertoningen), herkomst, en sessies en crashes (alleen opt-in), voor de laatste dag, 7 en 30 dagen. Herdownloads en updates staan apart. null is onbekend, geen nul. Vraagt het onderdeel Product.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

project_id*int

Antwoord

appsobject[]account_id, app_id, name, history_running, analytics_differs, acquisition (last_day, periods (dag, 7d, 30d: impressions, impressions_unique, page_views, page_views_unique, first_downloads, redownloads, updates, sessions, crashes, installs, deletions, conversion, sources, territories, crashes_by_version, from, to), days, covered) of null, total (downloads, redownloads, updates, complete), d7, d30, prev30, days (day, value), months (month, value, running), years (year, value, running), countries, countries_30d, compare (label, previous_label, value, previous), history (pending, fetched)

Voorbeeld: Antwoord

{
  "ok": true,
  "apps": [
    {
      "app_id": "6818309309",
      "name": "Kenteken Spel",
      "total": {
        "downloads": 412,
        "redownloads": 37,
        "updates": 220,
        "complete": true
      },
      "d7": 58,
      "d30": 190,
      "prev30": 164
    }
  ]
}
GET/api/app-downloads/total

Downloads van alle apps samen

Het hoogste niveau: alle apps van alle Apple-accounts van de werkruimte, ook apps die niet aan een project hangen.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

include_archivedboolOok gearchiveerde apps meetellen; standaard volgens de instelling van de werkruimte.

Antwoord

appsint
total?int
d7?int
d30?int
prev30?int
archived_excludedint
include_archivedbool
GET/api/project-overview

Overzicht van één project: wat aandacht vraagt en de kengetallen van zijn soort

Hooguit zes kengetallen, gekozen op het soort project (webshop, SaaS, lokaal, B2B, content); met een app worden de laatste twee downloads en beoordeling. Een kengetal zonder bron heeft missing: true en connect met wat je moet koppelen. Wat de kijker per onderdeel niet mag zien, valt weg; omzet en ROAS alleen voor het team of een klant die het overzicht mag goedkeuren. Downloads zijn een aantal en volgen het onderdeel Product. Zonder gekozen soort staat er een voorstel in suggested; Studio slaat dat nooit zelf op.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

project_id*int
days7 | 28 | 90Standaard 28.

Antwoord

type?string
suggested?objecttype, reason
has_appbool
daysint
typesobject
can_managebool
attentionobjectitems (key, tone, text, tab), actions (id, title), checked_at
kpisobject[]key, label, value, previous, unit (count|pct|eur|ratio|stars|text), series, tone, hint, invert, of missing en connect (label, kind, tab of href)
trendobjectvisitors, leads, clicks — elk null of een reeks (day, value) met elke dag van de periode
funnel?object[]label, value — bezoeken, formulier begonnen en verstuurd, leads; alleen stappen met gegevens

Voorbeeld: Antwoord

{
  "ok": true,
  "type": "saas",
  "suggested": null,
  "has_app": true,
  "days": 28,
  "attention": {
    "items": [
      {
        "key": "ssl",
        "tone": "warn",
        "text": "Certificaat van voorbeeld.nl verloopt over 12 dagen",
        "tab": "uptime"
      }
    ],
    "actions": [
      {
        "id": 41,
        "title": "Titels herschrijven voor zoektermen op plek 4 tot 10"
      }
    ],
    "checked_at": "2026-10-06 10:41:00"
  },
  "kpis": [
    {
      "key": "status",
      "label": "Bereikbaar (30 d)",
      "value": 99.98,
      "unit": "pct",
      "hint": "nu bereikbaar"
    },
    {
      "key": "signups",
      "label": "Aanmeldingen",
      "value": 42,
      "previous": 35,
      "unit": "count",
      "series": [
        1,
        3,
        2
      ]
    },
    {
      "key": "downloads",
      "label": "Downloads",
      "missing": true,
      "connect": {
        "label": "Koppel App Store Connect",
        "kind": "appstore_connect"
      }
    }
  ]
}
GET/api/work

Werkbord: adviezen over alle klanten en de werklast

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

assigneestringme of een gebruikers-id.

Antwoord

columnsobjectopen, planned, done
workloadobject[]project_id, name, open, planned, overdue, done_30
teamobject[]
meint
todaydate
healthobject[]
GET/api/portfolio

Projectlijst: één rij per project

De startpagina van het team: per project status (ok, warn, bad) met de punten die aandacht vragen, uptime, tags, klanten, bezoek en het resultaat dat bij het soort project hoort, de app en het laatste rapport. Dezelfde cijfers als Techniek en het projectoverzicht.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

days7 | 28 | 90Standaard 28.

Antwoord

projectsobject[]id, name, color, template, suggested, tags, clients (id, name), status, issues, uptime_30d, down, headline (visitors, result: key, label, value, previous, unit), app (downloads_30d, downloads_prev_30d, downloads_total, rating, reviews), report (period, status), open_advice
kpisobjectprojects, attention, visitors, downloads_7d, open_advice
unassigned_sourcesint
templatesobject
daysint
GET/api/portfolio-trend

Verloop over alle projecten

Bezoek, conversies (GA4 key events plus leads uit het sitescript) en omzet (betaald min terugbetaald, plus winkelomzet) per dag over alle projecten samen, met het totaal, de periode ervoor en de verdeling per project. Een metriek zonder enige bron is null.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

days7 | 28 | 90Standaard 28.

Antwoord

daysint
metricsobjectvisitors, conversions, revenue — elk null of { unit, total, previous, series (day, value), by_project (id, name, color, value) }
GET/api/benchmarks

Benchmarks: een project naast vergelijkbare projecten

Mediaan, 25e en 75e percentiel en het aantal projecten per kengetal, plus de waarde en positie van dit project (better_than van others). Elke nacht berekend. Cijfers alleen bij minstens 5 projecten in de groep (enough); gedeeld over werkruimtes heen bovendien uit minstens 3 werkruimtes, en alleen als je werkruimte zelf deelt. Nooit namen of waarden van andere projecten. Zonder project_id: per kengetal over alle projecten van de werkruimte, met de projecten in het zwakste kwart (alleen het team). Een klant krijgt hidden: true tenzij het team benchmarks voor klanten aanzet; eigen tags en gedeelde cijfers ziet een klant nooit.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_idint
period28 | 90Standaard 28.
scopewerkruimte | gedeeldStandaard werkruimte.
groupstringSleutel uit groups, bijv. soort:webshop of tech:drupal. Zonder: de meest specifieke groep met de meeste bruikbare kengetallen.

Antwoord

periodint
scopestring
groupstring
groupsobject[]key, label, usable
metricsobject[]metric, label, unit, higher_is_better, note, value, n, min, enough, median, p25, p75, position (better_than, others, percentile); zonder project_id: behind (project_id, name, value) in plaats van value en position
settingsobjectAlleen zonder project_id: share, show_clients.
computed_at?string
hiddenbool
POST/api/benchmarks

Benchmarks instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • settingsshare, show_clients

    Antwoord: settings.

    • share bool · Anoniem meedoen met de vergelijking over werkruimtes heen. Standaard uit.
    • show_clients bool · Klanten zien de positie van hun eigen project. Standaard uit.
GET/api/report-overview

Maandrapporten over alle projecten

Per project de stand van het rapport van één maand: ontbreekt, concept (fouten bij het ophalen), klaar, verstuurd of geopend (door een klant, in Studio of via een deellink; alleen een teller, niet wie).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

periodstringEen afgesloten maand als 2026-09; standaard de vorige maand.

Antwoord

periodstring
labelstring
periodsobject[]period, label
rowsobject[]project_id, project, color, clients, tags, report_id, status, errors, generated_at, published_at, views, first_viewed_at
countsobjectontbreekt, concept, klaar, verstuurd, geopend
can_managebool
POST/api/report-overview

Concepten maken en klaarstaande rapporten versturen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • generate_missingperiod

    Een concept voor elk project zonder rapport, op de achtergrond (202). Antwoord: queued, tasks.

  • publish_readyperiod, ids

    Alleen status klaar; een concept met fouten blijft staan. Klanten krijgen de rapportmail via de standaardautomatisering. Antwoord: published, notified.

    • ids int[] · Alleen deze rapporten; standaard alle met status klaar.
GET/api/today

Vandaag: wat er over alle projecten aandacht vraagt

Storingen, kritieke en hoge lekken (per pakket en versie over alle projecten samen), certificaten en domeinen die binnen 14 dagen verlopen, bronnen die niet werken, nieuwe fouten na een deploy, een daling in de App Store-beoordeling, acties die op jou wachten en rapporten van vorige maand die als concept klaarstaan. Elk punt heeft een to naar de plek waar je het oplost.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

itemsobject[]key, group (storing|lek|verloop|bron|fout|beoordeling|actie|rapport), tone (bad|warn|info), title, detail, projects (id, name), to, fix (?object: steps[], links[] (label, url), copy[] (label, value); "Zo los je het op")
groupsobject
countsobjectbad, total

Voorbeeld: Antwoord

{
  "ok": true,
  "items": [
    {
      "key": "lek-0",
      "group": "lek",
      "tone": "bad",
      "title": "Drupal core 10.2.3, 3 projecten",
      "detail": "2 lekken, ernst kritiek · opgelost in 10.2.4",
      "projects": [
        {
          "id": 3,
          "name": "Alpha"
        }
      ],
      "to": "/techniek"
    }
  ],
  "counts": {
    "bad": 1,
    "total": 1
  }
}
GET/api/tags

Tags van de projecten

Platform (Web, iOS) en techniek (Drupal 11, Laravel 13, PHP 8.4) herkent Studio zelf, uit koppelingen, lockbestanden, de Drupal-module of WordPress-plugin, de sitecontrole en Plesk; origin en origin_at zeggen waar en wanneer. Eigen tags maakt het team.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_idintAlleen dit project.
hiddenboolOok uitgezette automatische tags.

Antwoord

tagsobject[]id, project_id, kind (platform|tech|own), slug, key, label, color, auto, hidden, origin, origin_at
POST/api/tags

Tags toevoegen, uitzetten en opnieuw herkennen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • addproject_id*, label*, color

    Antwoord: tag.

    • label string · Hooguit 40 tekens.
    • color string · Als #rrggbb.
  • removetag_id*

    Een eigen tag gaat weg; een automatische tag gaat uit en komt bij de volgende herkenning niet terug.

  • restoretag_id*

    Antwoord: tag.

  • detectproject_id

    Antwoord: tags.

    • project_id int · Zonder: alle projecten.
GET/api/views

Je bewaarde weergaven van de projectlijst

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

viewsobject[]id, name, filters (client, type, tags, attention)
POST/api/views

Weergaven bewaren en verwijderen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Acties (action)

  • savename*, filters, view_id

    Antwoord: view_id.

    • filters object · client (?int), type (?string), tags (string[], als kind:slug, bijv. tech:drupal), attention (bool).
    • view_id int · Met id: bijwerken.
  • deleteview_id*
GET/api/preferences

Je persoonlijke voorkeuren

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

start_page?stringje eigen keuze, null is de standaard
start_page_defaultstring
optionsobject
POST/api/preferences

Startpagina kiezen, Wat is er nieuw gelezen, taal van de app

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Iedereen voor locale; de rest alleen het team.

Acties (action)

  • start_pagestart_page

    Null zet de standaard terug: Vandaag voor wie alleen werkt, Projecten voor een team. Antwoord: start_page.

    • start_page ?overzicht | vandaag | projecten | techniek
  • changelog_seenversion*

    Gaat nooit terug in de tijd; /api/me geeft changelog_seen mee. Antwoord: changelog_seen.

    • version string · Datum van de bovenste versie, jjjj-mm-dd.
  • localelocale*

    Taal van de app voor deze gebruiker; /api/me geeft hem mee als user.locale. Standaard nl. Antwoord: locale.

    • locale nl | en
  • project_orderids*

    Per gebruiker; ook voor klanten. Projecten die je niet mag zien worden overgeslagen. GET /api/projects en /api/portfolio sorteren erop. Antwoord: ids.

    • ids int[] · Project-id's in de gewenste volgorde.
GET/api/portal

Startpagina voor klanten

Per project het resultaat van deze maand tegenover dezelfde dagen vorige maand, doelen, wat gedaan is en wat er komt.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Antwoord

monthstring
days_so_farint
projectsobject[]id, name, numbers, series (day, value: bezoeken per dag deze maand), goals, done, next, report, weekly_update
POST/api/portal

Weekupdate aan of uit

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Klanten met toegang tot het project.

Acties (action)

  • weeklyproject_id*, on*

    Antwoord: weekly_update.

GET/api/notifications

Meldingencentrum: wat er is gebeurd

De bel in de app, per gebruiker en werkruimte, van de laatste 30 dagen: storingen en herstel, afwijkingen, nieuw gevonden bronnen, goedkeuringen, vragen van klanten, afgewezen app-versies, bevestigde adviezen en nieuwe formulierinzendingen. Een klant ziet alleen storingen van zijn eigen projecten, antwoorden op zijn vragen en inzendingen als hij Website mag bekijken. Storingen en afwijkingen volgen de meldingsvoorkeuren van het account.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

countboolAlleen het aantal ongelezen.

Antwoord

itemsobject[]key, kind (storing|afwijking|nieuw|goedkeuring|vraag|antwoord|app|bevestigd|inzending), tone (bad|warn|info|ok), title, detail, at (?datetime), to, project (?object: id, name), read
unreadint
kindsobject
POST/api/notifications

Meldingen als gelezen markeren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Acties (action)

  • readkeys*

    Antwoord: unread.

    • keys string[] · Sleutels uit items[].key, hooguit 200.
  • read_all

    Alles wat nu in de bel staat; wat daarna binnenkomt is weer nieuw. Antwoord: marked, unread.

GET/api/start-checklist

Checklist bij de start van een werkruimte

De stappen waarmee een werkruimte gaat werken, berekend uit de stand van nu: Google, eerste project, soort, bereikbaarheid, script, Search Console, klant, en voor de eigenaar tweestap en factuurgegevens.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar en teamleden; voor anderen is checklist null.

Antwoord

checklist?objectsteps (object[]: key, done, title, why, to, action), done (int), total (int), complete (bool), hidden (bool)
POST/api/start-checklist

Checklist verbergen of terughalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar en teamleden.

Acties (action)

  • hide

    Per persoon en per werkruimte. Antwoord: checklist.

  • show

    Antwoord: checklist.

GET/api/task

Stand van een achtergrondtaak

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

id*string

Antwoord

statusqueued | running | done | failed
result?object
error?string
GET/api/inventory

Alle bronnen met hun status

GA4, Search Console, eigen systemen, aanvullende diensten en uptime-controles, met per bron of hij werkt.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_idintAlleen de bronnen van dit project; dan zonder projects.

Antwoord

itemsobject[]key, type, subtype, id, name, detail, project_id, status (ok|error|stale|unknown|off|setup|tracking), status_text, action, fix (?object: steps[], links[] (label, url), copy[] (label, value); "Zo los je het op"), last_ok_at, last_error_at, fetching, can_fetch, can_assign, missing (object[]: id, label, since, since_text; cijfers die de bron eerder meestuurde en al een tijd niet meer)
projectsobject[]id, name, color, sources, problems, unchecked, clients, open_advice, monitors_down, latest_report
countsobjecterror, waiting, ok
POST/api/inventory

Een bron nu ophalen, of een ontbrekend cijfer niet meer verwachten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • fetchtype*, id*

    Eén API-verzoek (de meeste koppelingen, eigen systemen) meteen; GA4, Search Console, betalingen, Ads en App Store Connect via de wachtrij, met fetching: true tot hij klaar is. Hooguit eens per minuut per bron (429). Antwoord: item.

    • type ga | search | app | integration
  • ignore_metricid*

    Het cijfer is bewust weg: geen signaal meer. Komt het later terug, dan telt het gewoon weer mee. Antwoord: ignored.

    • id int · Het id uit missing.
GET/api/discovery

Nieuw gevonden bronnen

Wat Studio via een koppeling ziet maar nergens aan hangt (Analytics-properties, Search Console-sites, apps, bedrijfsprofielen en voor beheerders Plesk-domeinen), plus wat genegeerd of gearchiveerd is. Studio beslist zelf niets. Soorten op "verbergen" staan alleen in hidden.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

newobject[]key, type (ga|search|apple|gbp|plesk), ref, name, detail, project_id, project_name, state, decided_at, data_deleted, suggestion {name, template}
ignoredobject[]
archivedobject[]
linkedobject[]
archived_projectsobject[]id, name, archived_at
hiddenint
notifyint
settingsobjectmodes {ga, search, apple, gbp, plesk: melden|stil|verbergen}, include_archived
can_managebool
projectsobject[]id, name
templatesobject[]key, label
POST/api/discovery

Koppelen, negeren, archiveren of terughalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • linkkey*, project_id*
  • new_projectkey*, name*, template*

    Antwoord: project_id.

  • ignorekeys*

    Antwoord: count.

  • archivekeys*, delete_data

    Daarna haalt Studio niets meer op en telt de bron niet mee in totalen. Een gekoppelde Analytics- of Search Console-bron gaat los van het project (onthouden voor terughalen); een gekoppelde app of vestiging blijft hangen. Antwoord: count.

    • delete_data bool · Ook de opgehaalde gegevens verwijderen; standaard bewaard.
  • restorekeys*

    Antwoord: count.

  • settingsmodes, include_archived

    Antwoord: settings.

  • search_locations

    Antwoord: found.

GET/api/capabilities

Wat Studio met een koppeling kan

Per onderdeel wat minimaal nodig is, wat de sleutel volgens de laatste meting mag (ja, nee, onbekend) en of het aan staat. Uit betekent dat Studio het helemaal niet ophaalt. minimal zegt welke rechten genoeg zijn voor wat aan staat; warnings noemt sleutels met meer rechten dan nodig.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

subject_type*stringapple, google, integration, slack of chat.
subject_id*intId van het Apple-account, de Google-koppeling, de projectkoppeling, de workspace (slack) of het kanaal.

Antwoord

typestring
namestring
itemsobject[]cap, label, needs, why, write, enabled, have (ja|nee|onbekend), detail, state (aan|uit|niet mogelijk|niet gemeten)
measured_at?string
warningsstring[]
fix?objectWaar je de rechten verlaagt: steps, links (label, url), copy (label, value).
keysobject[]key_id, role, role_label, account_key, allowed (alleen Apple)
minimal?string
can_managebool
POST/api/capabilities

Onderdeel aan- of uitzetten, of opnieuw meten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • togglesubject_type*, subject_id*, cap*, enabled*

    Antwoord: items.

  • measuresubject_type*, subject_id*

    Alleen leesverzoeken bij de dienst; een onderdeel dat iets zou veranderen probeert Studio niet uit. Hooguit eens per minuut (429). Antwoord: items.

GET/api/dashboards

Alle dashboards van de werkruimte

Dashboards over meerdere projecten (zonder project_id) eerst, daarna die per project.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

dashboardsobject[]id, name, goal, project_id, project_name, tiles (aantal), scope
can_editbool
limit?int
workspace_countint
GET/api/dashboard

Dashboard van een project, of over projecten heen

Met project_id een projectdashboard. Alleen dashboard_id zonder project_id geeft een dashboard over projecten heen (alleen het team): tiles over de projecten in scope, plus losse projecttegels; catalog en project_catalog zijn de keuzes.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_idintLeeg voor een dashboard over projecten heen.
dashboard_idintStandaard het eerste.

Antwoord

dashboardsobject[]id, name, goal
currentobjectid, name, goal
tilesobject[]
chosenstring[]
catalogobject
goalsobject
can_editbool
limit?int
POST/api/dashboard

Dashboards maken, wijzigen en verwijderen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id, goal, name

    Valt onder de limieten van het plan. Antwoord: id.

    • project_id int · Leeg: een dashboard over projecten heen.
    • goal string · Een doel uit goals; standaard eigen.
  • savedashboard_id*, tiles, name, scope
    • tiles json · Hooguit twaalf, uit catalog; over projecten heen ook {key, project_id} voor één project.
    • scope object · Alleen over projecten heen: {tags: ["platform:ios"], project_ids: [3]}; leeg is alle projecten.
  • deletedashboard_id*

    Het laatste dashboard van een project blijft staan.

GET/api/goals

Maanddoelen, prognose en benchmark

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_id*intProject-id.

Antwoord

goalsobject[]metric, label, target, value, projected, status
metricsobject
can_managebool
suggested?object
forecast?object
languages?object
benchmark?object
signals?object
POST/api/goals

Maanddoel zetten of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Overzicht); anderen krijgen 404.

Acties (action)

  • setproject_id*, metric*, target*

    Antwoord: goals.

    • metric sessions | key_events | new_users | clicks
    • target int · Minstens 1.
  • deleteproject_id*, metric*

    Antwoord: goals.

    • metric sessions | key_events | new_users | clicks
GET/api/annotations

Tijdlijn van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_id*intProject-id.
daysint1 tot 800; standaard 28.

Antwoord

annotationsobject[]id, kind, title, detail, url, happened_at
can_managebool
POST/api/annotations

Gebeurtenis op de tijdlijn of deploysleutel

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id, date, kind, title*, detail, url
    • project_id ?int · Null: voor alle projecten.
    • kind notitie | google | meting | deploy
  • deleteid*
  • deploy_tokenproject_id

    Antwoord: token, url.

GET/api/checklist

Inrichtingschecklist van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_id*intProject-id.

Antwoord

sectionsobject[]
can_managebool
POST/api/checklist

Checklistpunt afvinken of opnieuw controleren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • setproject_id*, key*, state, note

    Antwoord: sections.

    • state ?done | na · Null zet het punt terug.
  • recheckproject_id*

    Status 202. Antwoord: task_id.

GET/api/hours

Urenbudget per klant

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

monthmonthStandaard deze maand.

Antwoord

monthmonth
projectsobject[]project_id, name, budget, spent, pace
entriesobject[]id, project_id, project, day, minutes, note, user, advice
can_managebool
POST/api/hours

Uren boeken en budgetten zetten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Acties (action)

  • budgetproject_id*, hours

    Alleen de eigenaar van de workspace.

    • hours ?number · Per maand; leeg is geen afspraak.
  • logproject_id*, day, minutes*, note, recommendation_id

    Status 201. Antwoord: id.

    • day date · Niet in de toekomst.
    • minutes int · 1 tot 1440.
  • deleteid*

    Je eigen uren, of als eigenaar die van anderen.

GET/api/page-insight

Wat Studio weet over één pagina

Voor de browserextensie: zoekt het project op domein en geeft crawl, zoektermen, adviezen en snelheid voor dat pad, per onderdeel waar je toegang toe hebt.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

url*url

Antwoord

project?objectid, name
pathstring
crawl?object
queriesobject[]
adviceobject[]
speed?object
linkurl
GET/api/domains

Domeinen van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Queryparameters

project_id*intProject-id.

Antwoord

domainsobject[]id, domain, record, verified, via (dns|plugin), plugin, primary, source (auto|manual), verified_at, checked_at
POST/api/domains

Domein verifiëren, toevoegen, weghalen of hoofddomein maken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • checkproject_id*, domain*

    Antwoord: verified, domains.

  • addproject_id*, domain*

    Antwoord: verified, domains.

    • domain string · Een domein of adres; Studio bewaart het domein zelf (zonder www).
  • removeproject_id*, domain*

    Het domein komt niet terug, ook niet via een oude Search Console-property. De sitecontrole op dat domein gaat mee. Antwoord: left, domains.

  • primaryproject_id*, domain*, move

    Antwoord: website, domains.

    • move bool · Standaard true: uptimecontroles verhuizen mee en het oude hoofddomein gaat weg.
GET/api/mail-funnels

Mailfunnels uit andere systemen

Wat een site zelf verstuurt (veld mail_funnels in het metrics-contract), straks ook Mailchimp en Brevo. Alleen aantallen. Zonder project_id alle projecten (alleen het team).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Het team; met project_id ook klanten met Mailfunnels.

Queryparameters

project_idint
days7 | 30 | 90

Antwoord

daysint
funnelsobject[]id, key, project_id, project, origin (site|mailchimp|brevo), name, status (actief|aan|uit|weg), trigger, audience, goal, url (alleen team), seen_at, sent, clicked, converted, unsubscribed, delivered, bounced, complained, revenue, click_rate, conversion_rate, unsubscribe_rate, series (date, sent, clicked, converted, unsubscribed), steps (id, name, subject + dezelfde tellers)
GET/api/social-posts

Gevolgde posts op social media

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Wie de website van het project mag zien.

Queryparameters

project_id*intProject-id.

Antwoord

postsobject[]id, platform (reddit|hackernews|bluesky|mastodon), url, title, community, author, ref, posted_at, score, comments, ratio, last_checked_at, last_error, series (at, score, comments), visitors, signups, days (day, visitors, signups)
can_managebool
POST/api/social-posts

Een post volgen, bijwerken of niet meer volgen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Wie de website van het project mag beheren.

Acties (action)

  • addproject_id*, url*, ref

    Antwoord: id, error.

    • url url · Link naar een post op Reddit, Hacker News, Bluesky of Mastodon.
  • updateid*, ref
  • refreshid*
  • deleteid*
GET/api/site-events

Sitegebeurtenissen van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_id*intProject-id.
statusok | opnieuw | dubbel | mislukt | geweigerd | ongeldig
entryintEén regel uit het logboek, met runs_detail (automatisering, voorwaarden, acties).

Antwoord

logobject[]id, event, event_id, data, private_keys (alleen namen), status, reason, http_status, runs, duration_ms, received_at; de laatste 100
hook?objectreceived, last_at, created_at
eventsobject[]event, total, refs (ref, n), days (day, n); 30 dagen
automationsobject[]id, name, enabled, event
retryingint
can_managebool
POST/api/site-events

Adres voor sitegebeurtenissen maken of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id*

    Een nieuw adres vervangt het oude. Het geheim is maar één keer te zien. Antwoord: url, secret.

  • deleteproject_id*
GET/api/project-tips

Wat je bij een project nog kunt instellen

Uit de basis, wat Studio op de site ziet maar niet gekoppeld is, en wat minstens de helft van de projecten van dezelfde soort heeft.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_id*intProject-id.
allboolOok de weggeklikte.

Antwoord

tipsobject[]key, source (basis|gezien|soortgelijk), title, why, action {label, to}, peers (?object: count, total, template), dismissed
POST/api/project-tips

Tip wegklikken of terugzetten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Acties (action)

  • dismissproject_id*, key*

    Voor het hele team. Antwoord: tips.

  • restoreproject_id*, key*

    Antwoord: tips.

Bronnen en koppelingen

Google-koppelingen, Search Console, eigen systemen (instnt-metrics), aanvullende diensten en inkomende formulieren. Geheimen gaan nooit terug naar de browser; een ingevuld geheim staat als <veld>_configured: true.

GET/api/connections

Google-koppelingen met hun GA4-properties

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

connectionsobject[]id, kind, google_email, status, own_key, usable, created_at, properties
POST/api/connections

Service-account koppelen, vervangen of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createkey*

    Antwoord: connection_id, google_email, property_count.

    • key json · De service-account-JSON, als object of tekst. Wordt meteen bij Google getest.
  • replace_keyconnection_id*, key*

    Behoudt de koppeling en alle indelingen; de oude sleutel blijft actief als de nieuwe niet werkt. Antwoord: google_email, property_count.

  • toggleproperty_id*, enabled*
  • refresh

    Leegt de caches van de workspace, bijvoorbeeld na nieuwe leestoegang in Analytics.

  • deleteconnection_id*
GET/api/connections/google

Koppelen met Google starten (OAuth)

Stuurt de browser naar Google voor leestoegang tot Analytics, Search Console en het Bedrijfsprofiel. Bedoeld voor de browser.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.
Status
302
GET/api/connections/google/callback

Terugkeer van Google na koppelen

Toegang
Geen inlog
GET/api/connections/oauth/{provider}

Koppelen met Teamleader of Microsoft Advertising starten (OAuth)

provider is teamleader of microsoft_ads. Stuurt de browser naar de dienst; bij terugkeer bewaart instnt studio het refresh-token versleuteld bij de koppeling. Zonder app op de server (client-ID en geheim in .env) gaat de browser terug met oauth=niet-ingericht.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.
Status
302

Queryparameters

integration_id*intEen koppeling van de soort teamleader of microsoft_ads, eerst aangemaakt met POST /api/integrations.
GET/api/connections/oauth/{provider}/callback

Terugkeer van Teamleader of Microsoft na koppelen

Toegang
Geen inlog
GET/api/search-console

Search Console-properties

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

sitesobject[]id, project_id, connection_id, site_url, display_name, status
POST/api/search-console

Search Console-properties toevoegen en indelen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • availableconnection_id*

    Antwoord: sites.

  • createproject_id*, connection_id*, site_url*

    Antwoord: site_id.

  • updatesite_id*, display_name
  • assignsite_id*, project_id
  • deletesite_id*
GET/api/sources

Eigen systemen (instnt-metrics)

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

sourcesobject[]id, project_id, name, url, status
POST/api/sources

Eigen systeem koppelen of wijzigen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createname*, url*, token*, project_id

    Wordt meteen getest tegen het instnt-metrics-contract; 422 source_rejected met de reden als dat faalt. Antwoord: source_id, preview.

    • url url · https; http alleen voor localhost.
  • updatesource_id*, name*, url, token
    • token string · Leeg houdt het bestaande token.
  • assignsource_id*, project_id
  • deletesource_id*
GET/api/integrations

Aanvullende diensten van een project

oauth staat er alleen bij teamleader en microsoft_ads: connected (er is een token) en available (de server kan koppelen).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

integrationsobject[]id, project_id, kind, name, status, config, oauth
POST/api/integrations

Dienst koppelen, testen of wijzigen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id*, kind*, config*, name

    Antwoord: integration_id.

    • kind string · Bijvoorbeeld clarity, sentry, umami, posthog, mollie, stripe, github, bing, dataforseo, shopify, woocommerce, appstore_connect. De volledige lijst staat in de bronnenmarkt.
    • config object · Voor appstore_connect: account_id en app_id (zie /api/appstore-accounts). Een config met issuer_id, key_id en private_key wordt een Apple-account.
  • updateintegration_id*, config*
    • config object · Een leeg geheim veld houdt het bestaande geheim.
  • testintegration_id*

    Haalt meteen één keer op. Antwoord: testable, passed, metrics, items, error.

  • appstore_analyticsintegration_id*, key_id*, private_key*

    Alleen voor een App Store Connect-koppeling: vraagt App Analytics eenmalig aan bij Apple. De Admin-sleutel wordt alleen voor deze aanvraag gebruikt en niet bewaard. Antwoord: analytics.

    • key_id string · Sleutel-ID van een App Store Connect-sleutel met de rol Admin.
    • private_key string · Inhoud van het .p8-bestand van die sleutel.
  • deleteintegration_id*
GET/api/appstore-accounts

Apple-accounts voor App Store Connect

Per account de apps van het team en aan welk project elke app hangt. De .p8-sleutel komt nooit terug.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

accountsobject[]id, name, issuer_id, key_id, vendor_number, key_configured, status, status_message, checked_at, history (running, pending), keys (id, role, role_label, key_id, status, status_message, denied), webhook (url, secret; alleen voor beheerders), apps (id, name, bundle_id, sku, downloads_total, downloads_complete, downloads_30d, project_id, project_name, integration_id, analytics)
projectsobject[]id, name
POST/api/appstore-accounts

Apple-account toevoegen, apps koppelen of App Analytics aanzetten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createissuer_id*, key_id*, private_key*, vendor_number, name

    Test de sleutel eerst bij Apple door de apps op te halen; een sleutel die Apple weigert wordt niet opgeslagen. Dezelfde issuer en sleutel-ID werken het bestaande account bij. Status 201. Antwoord: account_id, apps.

    • private_key string · Inhoud van het .p8-bestand (rol Sales and Reports).
    • vendor_number string · Eén of meer vendornummers, gescheiden door een komma.
  • updateaccount_id*, name, issuer_id, key_id, vendor_number, private_key
    • issuer_id string · Een gewijzigde ID wordt eerst bij Apple getest.
    • key_id string · Een gewijzigde ID wordt eerst bij Apple getest.
    • vendor_number string · Eén of meer, gescheiden door een komma. Een ander nummer haalt de geschiedenis opnieuw op.
    • private_key string · Leeg houdt de bestaande sleutel.
  • refreshaccount_id*

    Haalt de apps opnieuw op bij Apple. Antwoord: apps.

  • linkaccount_id*, app_id*, project_id

    Een app hangt aan hooguit één project, en een project heeft één App Store Connect-bron: een nieuwe koppeling vervangt de oude. Antwoord: integration_id.

    • project_id ?int · Leeg of null ontkoppelt de app.
  • historyaccount_id*

    Haalt de ontbrekende verkooprapporten op: jaren (tien jaar terug), maanden en dagen (één jaar). Gebeurt ook vanzelf na het toevoegen en twee keer per dag; een afgesloten periode vraagt Studio nooit opnieuw op. Antwoord: started, pending.

  • analyticsaccount_id*, key_id*, private_key*, app_ids

    Vraagt App Analytics aan per app. De Admin-sleutel wordt alleen voor deze aanvragen gebruikt en niet bewaard. Antwoord: enabled, failed.

    • key_id string · Sleutel-ID van een sleutel met de rol Admin.
    • app_ids string[] · Leeg is alle apps van het account.
  • deleteaccount_id*

    409 in_use zolang er apps aan projecten hangen.

  • key_addaccount_id*, role*, key_id*, private_key*

    Extra sleutel met een eigen rol, van hetzelfde team (zelfde issuer-ID). Wordt eerst bij Apple getest. Studio kiest per onderdeel de sleutel met de minste rechten die het mag, en onthoudt een weigering (403) een week. Developer opent builddetails, feedback uit TestFlight, diagnoses, Xcode Cloud, Game Center en aankopen; Customer Support antwoorden op reviews en naam en ondertitel van de winkelpagina. Status 201.

    • role sales | developer | customer_support | marketing | app_manager | admin
  • key_deleteaccount_id*, key_id*
    • key_id int · Het id uit keys, niet de sleutel-ID van Apple.
  • webhookaccount_id*

    Nieuw adres en geheim voor meldingen van App Store Connect (Gebruikers en toegang → Integraties → Webhooks). Een oud adres werkt daarna niet meer. Antwoord: webhook.

GET/api/google-play-accounts

Google Play-accounts

Per account de apps die het service-account ziet, met installaties en aan welk project elke app hangt. De sleutel komt nooit terug, alleen het e-mailadres van het service-account.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

accountsobject[]id, name, client_email, bucket, status, status_message, checked_at, apps (package_name, title, installs_total, installs_30d, project_id, project_name, state)
projectsobject[]id, name
can_managebool
POST/api/google-play-accounts

Google Play-account toevoegen of apps koppelen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createkey*, bucket, name

    Test de sleutel eerst bij Google door de apps op te halen; een sleutel die niets mag, wordt niet opgeslagen. Hetzelfde service-account werkt het bestaande account bij. Status 201. Antwoord: account_id, apps.

    • key string · De JSON-sleutel van een service-account uit Google Cloud, uitgenodigd in Play Console.
    • bucket string · Cloud Storage-URI van de rapporten (gs://pubsite_prod_…). Zonder bucket geen installaties.
  • updateaccount_id*, name, bucket, key
    • key string · Alleen een nieuwe sleutel van hetzelfde service-account.
  • refreshaccount_id*

    Apps en installatierapporten opnieuw ophalen; hooguit eens per minuut. Antwoord: apps, files.

  • linkaccount_id*, package_name*, project_id

    Een app hangt aan hooguit één project; daarna volgt meteen een eerste ronde (installaties, vitals, reviews, versies). Antwoord: linked, integration_id.

    • project_id ?int · Leeg of null ontkoppelt de app.
  • deleteaccount_id*

    Haalt ook de koppelingen van de apps bij projecten weg. De opgehaalde installaties gaan mee.

GET/api/google-play

Google Play: installaties, vitals en versies van een app

Per Google Play-app van het project: installaties door gebruikers per dag (365 dagen) en maand uit de maandrapporten in Cloud Storage, actieve toestellen, beoordeling, Android vitals (door gebruikers gemerkte crashes en ANR, gemiddeld over 28 dagen, met de grens van Google) en de versies per track. Een onderdeel dat uit staat bij het account geeft null. null in een dag is onbekend, geen nul. Reviews staan onder /api/reputation. Vraagt het onderdeel Product.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

project_id*int

Antwoord

appsobject[]account_id, package_name, name, store_url, bucket, installs (total (downloads, complete), d7, d30, prev30, uninstalls_30d, active_devices, active_on, rating, days (day, value), months (month, value, running), first_month) of null, vitals (user_crash_rate, user_anr_rate, crash_rate, anr_rate, crash_limit, anr_limit, crash_bad, anr_bad, until, days (day, crash, anr)) of null, tracks (track, label, releases (name, status, version_codes, user_fraction, notes)) of null, tracks_at, fetched_at
GET/api/app-store

App Store voor makers: versies, TestFlight, reviews, prestaties, abonnementen en winkelpagina

Per app van het project wat App Store Connect weet, opgehaald elk half uur (versies, builds, testgroepen, feedback, reviews) en één keer per dag (de rest). sections geeft per onderdeel de stand: ok, leeg, fout, of sleutel met in message welke rol er nodig is. Abonnementen alleen voor het team of een klant die het overzicht mag goedkeuren. Vraagt het onderdeel Product.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

project_id*int

Antwoord

appsobject[]account_id, app_id, name, roles, sections, versions, testflight (builds, groups, feedback), reviews (items, count, average, per_rating, open, territories), performance (versions, metrics, insights, diagnostics), subscriptions (events_30d, active, trials, proceeds_30d, days, catalog) of null, store (current, changes), ci, game_center
can_replybool
teambool
POST/api/app-store

Reviews beantwoorden, crash als prompt, nu ophalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • replyproject_id*, review_id*, body*

    Plaatst of vervangt het antwoord bij Apple. Vraagt een sleutel met de rol Customer Support of App Manager. Antwoord: response.

    • review_id int · Het id uit reviews.items.
    • body string · Hooguit 5970 tekens.
  • delete_replyproject_id*, review_id*
  • suggest_replyproject_id*, review_id*

    Claude schrijft een voorstel in de merkstem; het staat daarna als suggestion bij de review. Nooit automatisch geplaatst. Antwoord: task_id.

  • promptproject_id*, feedback_id*

    Prompt voor een Claude Code-sessie in de repo van de app, met de crashlog. Antwoord: prompt.

  • syncproject_id*

    Hooguit eens per minuut (429). Status 202. Antwoord: started.

GET/api/modules

Modules en hun stand

Catalogus van modules met per module of hij in het plan zit, aan staat voor de werkruimte en (met project_id) voor het project, en of de bron die nodig is gekoppeld is. status: aan, uit, plan, project_uit of nodig.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; een klant alleen met project_id, en dan alleen aan of uit per module.

Queryparameters

project_idint

Antwoord

modulesobject[]key, label, uitleg, icon, min_plan, needs_label, scope, plan_allows, workspace_on, project_on, needs_met, projects_ready, status
can_managebool
POST/api/modules

Module aan- of uitzetten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • workspacemodule*, enabled*

    402 plan_limit als de module niet in het plan zit. Antwoord: modules.

  • projectproject_id*, module*, enabled*

    Een project kan een module alleen uitzetten; aan volgt de werkruimte. Antwoord: modules.

GET/api/orders

Bestellingen

Losse bestellingen uit Shopify, WooCommerce en eigen systemen, zonder gegevens van de klant, met een link naar de order in de winkel. Alleen als de module Bestellingen aan staat; alleen voor het team of een klant die het overzicht mag goedkeuren. Met scope=today per project de bestellingen van vandaag.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_idint
scopetoday
daysint
statusopen | betaald | verzonden | afgerond | geannuleerd | terugbetaald | mislukt
qstring

Antwoord

ordersobject[]id, source, number, ordered_at, status, total_cents, currency, items (name, qty), admin_url
countsobject
soldint
total_centsint
module?object
synced_at?datetime
projectsobject[]Alleen bij scope=today: project_id, name, count, total_cents, currency, latest.
POST/api/orders

Bestellingen nu ophalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • refreshproject_id*

    Antwoord: orders, errors.

GET/api/landing-pages

Module Landingspagina's

Aangewezen landingspagina's met bezoek (GA4, anders het sitescript), conversie, advertentiekosten van gekoppelde Ads-campagnes, formulieren, scrolldiepte (Clarity), Search Console en snelheid, plus A/B-vergelijkingen met de kans dat B beter converteert (Beta-Binomiaal, vanaf 100 bezoeken per variant). Alleen als de module aan staat. Advertentiekosten alleen voor het team of een klant die het overzicht mag goedkeuren. Met page_id één pagina met kanalen, zoektermen en verloop.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.
daysintPeriode in dagen, 7–365; standaard 28.
page_idint

Antwoord

pagesobject[]id, url, path, name, status, utm_campaign, ads_campaign_ids, thumbnail, visits, visits_source, conversions, conversion_source, conversion_rate, ads, cost_per_conversion_cents, funnel, forms, scroll_depth, search, speed
testsobject[]id, name, page_a_id, page_b_id, started_on, ended_on, prob_b_better, min_sessions, verdict
suggestionsobject[]path, sessions, key_events
campaignsobject[]id, name, channel
moduleobject
can_managebool
moneybool
base_url?url
pageobjectAlleen met page_id: de pagina met channels, queries en series.
POST/api/landing-pages

Landingspagina's aanwijzen en vergelijken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • createproject_id*, url*, name, status, utm_campaign, ads_campaign_ids

    Status 201. Antwoord: id.

    • url string · Pad (/offerte) of volledig adres op de site van het project.
    • status live | concept | gestopt
  • updateproject_id*, page_id*, name, status, utm_campaign, ads_campaign_ids
    • status live | concept | gestopt
  • deleteproject_id*, page_id*
  • test_createproject_id*, page_a_id*, page_b_id*, name

    Status 201. Antwoord: id.

  • test_endproject_id*, test_id*
  • test_deleteproject_id*, test_id*
GET/api/submissions

Formulierinzendingen

Welk formulier wanneer is verstuurd, op welke pagina, met een link naar de inzending in het CMS of de formuliertool. Nooit wat er is ingevuld. Alleen als de module Inzendingen aan staat. admin_url alleen voor het team of een klant met Website op goedkeuren; anders null. new: na de laatst bekeken inzending van deze gebruiker en van de laatste 30 dagen. Met scope=new de nieuwe inzendingen per project.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_idint
scopenew
daysintPeriode in dagen, 1–396; standaard 30.
formstring

Antwoord

submissionsobject[]id, source, source_label, form, page, submitted_at, new, admin_url
formsobject[]form, count, latest_at
totalint
unreadint
can_openbool
moduleobject
projectsobject[]Alleen bij scope=new: project_id, name, count, last_id, latest_at.
POST/api/submissions

Inzendingen als gezien markeren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Team; klanten met toegang tot het onderdeel Website.

Acties (action)

  • seenproject_id*

    Per gebruiker: alles tot nu toe in dit project telt niet meer als nieuw. Antwoord: seen_id.

GET/api/reputation

Reputatie: reviews van alle bronnen

Reviews van het Google Bedrijfsprofiel, Trustpilot, Kiyoh en de App Store samen. summary.average en count komen van de platforms zelf waar die bekend zijn (Kiyoh omgerekend van 10 naar 5), de rest uit de bewaarde reviews (de laatste 50 tot 100 per bron). trend per maand over twaalf maanden. Voorstellen van Claude (suggestion) alleen voor het team. Zonder project_id: per project dat je onder Vindbaarheid mag zien.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_idint
sourcegbp | trustpilot | kiyoh | appstore | google_play
ratingintAlleen dit aantal sterren, 1–5.
openboolAlleen zonder antwoord.

Antwoord

summaryobjectaverage, count, new_this_month, answered_pct, open_low, stored
sourcesobject[]source, label, average, count, stored, platform, can_reply
trendobject[]month, count, average
itemsobject[]id, source, source_label, rating, score, title, body, author, language, country, url, reviewed_at, reply, can_reply, suggestion
can_replybool
teambool
projectsobject[]Alleen zonder project_id: project_id, project, sources, average, count, new_this_month, answered_pct, open_low.
POST/api/reputation

Reviews beantwoorden

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • replyproject_id*, review_id*, body*

    Alleen Google en de App Store; Trustpilot en Kiyoh geven 422. Google vraagt "Koppel met Google" met het onderdeel Reviews beantwoorden aan. Antwoord: reply.

    • review_id int · Het id uit items.
    • body string · Google hooguit 4096 tekens, de App Store 5970.
  • delete_replyproject_id*, review_id*
  • suggest_replyproject_id*, review_id*

    Claude schrijft een voorstel in de merkstem; het staat daarna als suggestion bij de review. Nooit automatisch geplaatst. Antwoord: task_id.

GET/api/campaigns

Campagnes: UTM, advertenties en mailings bij elkaar

Module Campagnes (vanaf Copiloot). Een campagne telt op wat bij haar regels past: GA4 per UTM-campagne, bron en medium, aanmeldingen en betalingen uit het eigen systeem met dezelfde UTM, Google Ads-, Meta- en LinkedIn-campagnes en mailings uit Mailchimp en Brevo. Regels van dezelfde soort: één moet kloppen; verschillende UTM-soorten: allemaal. previous is een even lange periode direct ervoor. Gebruikers zijn per dag opgeteld. Kosten, omzet, budget, CPC, CPA en ROAS alleen voor het team of een klant die het overzicht mag goedkeuren. Zonder project_id: alle projecten met de module die je mag zien. Met campaign_id ook series, channels, sources, pages, ads en mailings.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_idint
campaign_idint

Antwoord

campaignsobject[]id, project_id, name, starts_on, ends_on, budget, goal, rules, period, current, previous, derived, mail
suggestionsobject[]UTM-campagnes zonder campagne (90 dagen): value, sessions, sources. Alleen met beheerrecht.
ignoredstring[]
linkablesobject[]Wat je als regel kunt koppelen: kind, value, label.
moduleobject
moneybool
can_managebool
base_url?string
campaignobjectMet campaign_id.
projectsobject[]Zonder project_id: project_id, name, campaigns.
POST/api/campaigns

Campagnes beheren

Versturen kan hier niet: dat doe je in Brevo of Mailchimp; instnt studio leest de resultaten.

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • createproject_id*, name*, starts_on, ends_on, budget, goal, rules

    De eerste campagne van een project haalt de GA4-cijfers per campagne meteen op (een half jaar terug). Antwoord: id.

    • budget ?number · In euro's.
    • rules object[] · kind (utm_campaign|utm_source|utm_medium|google_ads|meta_ads|linkedin_ads|mail), match (exact|prefix|contains, alleen UTM), value. Een Ads-campagne of mailing moet bij het project horen. Hooguit 30.
  • updateproject_id*, campaign_id*, name, starts_on, ends_on, budget, goal, rules
    • rules object[] · Vervangt alle regels.
  • deleteproject_id*, campaign_id*
  • ignoreproject_id*, value*

    Deze UTM-campagne niet meer voorstellen.

  • unignoreproject_id*, value*
GET/api/journey

Klantreis: fasen, kanalen en paden als totalen

Module Klantreis (vanaf Inzicht). Elke nacht opgeteld uit GA4, het sitescript, leads, aanmeldingen uit het eigen systeem en bestellingen; geen reis per persoon. stages: bezoek, betrokken, lead en klant met de bronnen die meetellen (per projecttype, of zoals ingesteld), de vorige even lange periode en from_previous (verhouding van totalen, geen gevolgde groep). channels: kanaal × fase; een fase zonder kanaalinformatie staat in missing. paths: stappen van pagina naar pagina, pagina's met een lead en landingspagina's met belangrijke acties, alleen met minstens k keer; hidden telt wat daaronder bleef. ttc: dagen van aanmelding tot abonnement, alleen met minstens k abonnementen. Zonder module: journey is null.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.
periodint28 of 90; standaard 28.

Antwoord

moduleobject
can_managebool
journey?objecttype, type_label, period, range, stages, trend, channels, paths, ttc, sources, custom, stage_labels, computed_at, k
POST/api/journey

Klantreis instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • settingsproject_id*, stages

    Antwoord: stages.

    • stages ?object · Per fase (bezoek, betrokken, lead, klant) een lijst bronnen uit sources; null zet de standaard voor het projecttype terug.
  • recomputeproject_id*

    Opnieuw optellen in de wachtrij; hooguit eens per vijf minuten (429 too_soon). Antwoord: queued.

GET/api/traffic

AI-verkeer en klikken tegenover sessies, per dag

Uit de feitentabellen, elke nacht bijgewerkt. view=ai: sessies uit AI-assistenten (ChatGPT, Perplexity, Gemini, Copilot, Claude …) uit GA4, of zonder GA4 bezoekers uit het sitescript (unit); previous is de even lange periode ervoor. view=search: Search Console-klikken tegenover organische GA4-sessies per dag. Search Console loopt een paar dagen achter; die dagen hebben clicks: null. totals telt alleen dagen waarop beide er zijn.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
view=ai: Bezoek (website) bekijken; view=search: Vindbaarheid (search) bekijken. Anderen krijgen 404.

Queryparameters

project_id*intProject-id.
viewai | search
daysint7, 28 of 90; standaard 28.

Antwoord

daysint
source?stringAlleen bij ai: ga4, script of null.
unitstring
currentint
previousint
seriesobject[]day, value (ai) of day, clicks, sessions (search)
sourcesobject[]key, value, previous
has_searchbool
has_gabool
search_until?date
ga_until?dateLaatste dag met GA4-cijfers; daarna sessions: null.
totalsobjectclicks, sessions, ratio
GET/api/not-found

404-monitor

Pagina's die niet bestaan maar bezoek of links krijgen, elke ochtend samengevoegd uit GA4 (titel of pad van de foutpagina), het sitescript, de crawler en URL-inspectie van Search Console. De API van Search Console heeft geen lijst met 404's; alleen per inspectie. Een pagina die zeven dagen niet meer is gezien, staat op opgelost; krijgt hij weer bezoek, dan is hij weer nieuw.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.
statusnieuw | opgelost | genegeerd

Antwoord

statusstring
countsobjectnieuw, opgelost, genegeerd
pagesobject[]id, path, status, hits, sources, referrers, first_seen, last_seen, resolved_at
settingsobjecttitles, paths, min_hits
can_managebool
POST/api/not-found

404-monitor bijwerken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • ignoreproject_id*, id*

    Antwoord: id, status.

  • reopenproject_id*, id*

    Antwoord: id, status.

  • resolveproject_id*, id*

    Antwoord: id, status.

  • settingsproject_id*, titles, paths, min_hits

    Antwoord: settings.

    • titles string[] · Woorden in de titel van de foutpagina, hooguit 10.
    • paths string[] · Paden die altijd als foutpagina tellen, zoals /404.
    • min_hits int · Vanaf zoveel weergaven in 28 dagen telt een nieuwe 404 als melding.
GET/api/extra-sources

Kengetallen uit de aanvullende diensten

Met verloop over 30 dagen. Geld, deals en fouten (Moneybird, Sentry, winkels, CRM, advertenties, App Store Connect) alleen voor het team of klanten met goedkeurrecht. analytics staat er alleen bij App Store Connect: of App Analytics is aangevraagd.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

can_managebool
sourcesobject[]id, kind, name, status, metrics, items, analytics
GET/api/conversion-sources

Bronnen voor conversie-events

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_id*intProject-id.

Antwoord

sourcesobject[]id, app_source_id, name, retention_days
POST/api/conversion-sources

Conversiesleutel maken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createapp_source_id*

    409 already_exists als de bron al een sleutel heeft. Status 201. Antwoord: app_source_id, token, webhook_url.

GET/api/inbound

Inkomende formulieren en afspraken

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Queryparameters

project_id*intProject-id.

Antwoord

hooksobject[]id, provider, label, signed, received, last_at, url
providersobject
POST/api/inbound

Inkomend adres maken of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id*, provider*, secret

    Status 201.

    • provider typeform | calendly | gravityforms | overig | github | belmeting
    • secret string · Om de handtekening te controleren; verplicht voor GitHub.
  • deleteid*
GET/api/clarity

Microsoft Clarity: samenvatting van drie dagen

Drie uur gecachet, want Clarity staat tien verzoeken per dag toe. 422 setup_required zonder token, 502 clarity_unavailable als Clarity faalt.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

integration_id*int

Antwoord

summaryobjectsessions, users, rage_clicks
daysint
GET/api/clarity/pages

Clarity: frictie per pagina over 28 dagen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

pagesobject[]url, sessions, dead, rage, quickback, error_clicks, script_errors, scroll, active_seconds, friction
daysint
GET/api/feed

Staat de datafeed aan

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Queryparameters

project_id*intProject-id.

Antwoord

activebool
created_at?datetime
last_used_at?datetime
POST/api/feed

Datafeed (CSV) maken of intrekken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id*

    Een nieuwe feed maakt het oude adres ongeldig. Antwoord: url, formula.

  • revokeproject_id*

Cijfers

Bezoek, conversie, omzet en de eigen metingen van het sitescript. GA4 en Search Console komen live van Google (gecachet); de rest uit de eigen feitentabellen.

GET/api/data

GA4, Search Console en eigen systemen

scope=overview: per site totalen en dagreeks. realtime: actieve bezoekers per property. detail: één property (property=properties/123). project: web, zoeken en product van een project (project=5). 503 no_connections zonder werkende Google-koppeling.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Iedereen in de workspace; een klant ziet alleen zijn eigen projecten.

Queryparameters

scopeoverview | realtime | detail | project
propertystring
projectint
days7 | 28 | 90Periode in dagen; standaard 28.

Antwoord

generatedint
daysint
sitesobject[]
appsobject[]
liveobject
…objectOverige velden hangen af van scope.
GET/api/landing

Landingspagina's met conversie

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.
days7 | 28 | 90Periode in dagen; standaard 28.
channelstringBijvoorbeeld Organic Search.

Antwoord

pagesobject[]
daysint
channel?string
GET/api/revenue

Omzet, MRR, churn en betaalsucces

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met goedkeurrecht op Overzicht (anders hidden: true).

Queryparameters

project_id*intProject-id.

Antwoord

revenue?object
hiddenbool
GET/api/attribution

Kanaal tot betaling, LTV en CAC

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met goedkeurrecht op Overzicht (anders hidden: true).

Queryparameters

project_id*intProject-id.

Antwoord

attribution?object
hiddenbool
can_managebool
POST/api/attribution

Kosten per kanaal per maand

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • costproject_id*, month*, channel*, amount*, note
    • amount number · In euro; 0 haalt de kosten weg.
GET/api/brand

Merkzoekopdrachten tegenover de rest

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.
days7 | 28 | 90Periode in dagen; standaard 28.

Antwoord

daysint
visibilityobject[]
…objectMerk- en niet-merkcijfers.
GET/api/cause

Oorzaak van een verandering

Geeft disabled: true als de functie uitstaat voor de workspace.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met Website (of Zoeken bij klikken).

Queryparameters

project_id*intProject-id.
metricsessions | key_events | clicks
days7 | 14 | 28 | 90

Antwoord

cause?object
disabledbool
GET/api/cookieless

Cookieloze meting over 28 dagen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

daysobject[]day, pageviews, visitors
pagesobject[]label, pageviews, visitors
sourcesobject[]label, pageviews, visitors
refsobject[]label, pageviews, visitors; waarden van ?ref= of ?source= in het adres
referrersobject[]label (domein), pageviews, visitors
consentobjectalles, statistieken, advertenties, geweigerd → bezoekers (28 dagen)
ga4_users?intsom van GA4-gebruikers per dag over dezelfde 28 dagen
totalsobjectpageviews, visitors
GET/api/vitals

Web Vitals van echte bezoekers

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

has_scriptbool
…objectLCP, INP en CLS per pagina en apparaat.
GET/api/forms

Formulieranalyse, leads en cohorten

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.
daysint7 tot 90; standaard 28.

Antwoord

formsobject[]page, form, starts, submits, rate, fields, worst
has_scriptbool
leadsobject
cohortsobject
GET/api/speed

PageSpeed per pagina: mobiel en desktop, vier categorieën, verloop en verbeterpunten met tips

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

pagesobject[]url, path, planned, mobile, desktop (scores, lab, field, origin_field, audits), mobile_history, desktop_history, mobile_error, desktop_error
summaryobjectaverage, worst, opportunities, issues, origin_field
tipsobjectTip per audit-id voor de stack van het project.
quotaobjectused, budget, blocked_until, source
measuringbool
can_managebool
pages_limitint
setup?objectWaarom er niets gemeten wordt (error), een link om het op te lossen (enable_url) en fix: steps, links, copy.
POST/api/speed

Pagina's nu meten met PageSpeed Insights

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • measureproject_id*, url

    Meet op de achtergrond, mobiel en desktop; hooguit eens per twee minuten per project (429). Antwoord: pages.

    • url url · Leeg: alle gemeten pagina's van het project.

Zoeken en SEO

Het werkblad met zoektermen, gevolgde zoekwoorden, concurrentie, de site-audit, logbestanden en content.

GET/api/seo

Werkblad zoektermen en meta

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.
days7 | 28 | 90Periode in dagen; standaard 28.

Antwoord

daysint
sitesobject[]
errorsobject[]
pagesobject[]Hooguit 300, met open adviezen en indexstatus.
page_countint
ctr_curveobject[]position, ctr
GET/api/keywords

Gevolgde zoekwoorden

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

keywordsobject[]
suggestionsobject[]
can_managebool
ads_candidatesobject[]
clustersobject[]
seasonsobject
title_testsobject[]
POST/api/keywords

Zoekwoorden toevoegen, koppelen of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • addproject_id*, keywords*

    Valt onder de limieten van het plan. Antwoord: keywords, suggestions.

    • keywords string · Eén per regel of komma-gescheiden; hooguit 200 per project.
  • targetproject_id*, id*, target_url

    Antwoord: keywords, suggestions.

  • deleteproject_id*, id*

    Antwoord: keywords, suggestions.

GET/api/competition

Concurrenten, contentgaten, backlinks en kaartposities

source zegt welke bron actief is: DataForSEO of de gratis bronnen (Bing, Brave, eigen crawler).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

enabledbool
sourcestring
freeobject
backlinks_source?string
gaps_sourcestring
competitorsstring[]
keywordsobject[]
gapsobject[]
backlinks?object
gridobject
spent?number
can_managebool
POST/api/competition

Concurrenten en kaartraster instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • addproject_id*, domain*
    • domain string · Hooguit vijf per project.
  • removeproject_id*, domain*
  • gridproject_id*, business_name*, keyword*, lat*, lng*, radius_km
    • radius_km number · 0,5 tot 25; standaard 3.
  • braveproject_id*

    Posities in Brave Search, live en niet bewaard; hooguit eens per tien minuten per project (429 too_many). Antwoord: live.

GET/api/audit

Site-audit uit de laatste crawl

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

crawled_at?datetime
pagesint
workingint
redirectsint
errorsint
linksint
issuesobject[]
suggestionsobject[]
can_crawlbool
llms_txt?object
budget?object
indexnowobjectkey, verified_at
text?object
POST/api/audit

Crawl starten of IndexNow instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • crawlproject_id*

    Status 202. Antwoord: task_id.

  • indexnowproject_id*

    Antwoord: key, location, verified.

GET/api/schema

Schema-wizard: soorten en wat al bekend is

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

typesobject
prefillobjectname, url
presentstring[]
POST/api/schema

JSON-LD opstellen

Zonder action. Geeft de JSON-LD, of welke velden ontbreken.

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Body

project_id*int
type*string
fieldsobject

Antwoord

…objectJSON-LD of ontbrekende velden.
GET/api/logs

Analyse van het laatste logbestand

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

report?object
can_uploadbool
from_serverbool
POST/api/logs

Access-log uploaden

Multipart, zonder action. Combined-formaat, ook .gz, hooguit 100 MB.

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.
Status
201

Body (multipart/form-data)

project_id*int
file*file

Antwoord

linesint
bot_linesint
GET/api/content

Contentkalender

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Zoeken.

Queryparameters

project_id*intProject-id.

Antwoord

itemsobject[]
suggestionsobject[]
can_managebool
POST/api/content

Content plannen, nieuwsbrief en socials

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • addproject_id*, title*, query, publish_on, reason, url

    Status 201. Antwoord: id.

  • updateid*, title, query, publish_on, status, url, reason

    Op live komt het stuk op de tijdlijn.

    • status idee | schrijven | klaar | live
  • deleteid*
  • newsletterproject_id*, days, intro, skip

    Antwoord: items, html.

  • newsletter_draftproject_id*, target*, subject*, list_id*, from_name*, reply_to*, days, intro, skip

    Antwoord: draft_id.

    • target mailchimp | brevo
  • social_draftsproject_id*, skip

    Zet concepten klaar in socials.instnt.studio.

POST/api/writeback

Terugschrijfsleutel voor WordPress of Drupal

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Zoeken); anderen krijgen 404.

Acties (action)

  • tokenproject_id*

    Antwoord: token.

Advies, vragen en AI

Adviezen met hun status, playbooks, tests, vragen van klanten en AI-taken.

GET/api/advice

Adviezen van een project

Met scope=workspace (alleen team) de tien belangrijkste acties over alle projecten. Elk advies heeft why: de delen van de rangorde (klikken, betrouwbaarheid, moeite, wat het team leerde).

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Advies.

Queryparameters

project_id*intProject-id.
statusopen | planned | done | bevestiging | dismissed | expired | all | actief | archiefStandaard open. bevestiging: gedaan, maar nog niet bevestigd door de bron. actief: open en in behandeling. archief: gedaan, afgewezen en verlopen, nieuwste eerst.
grouppageMet status=actief: ook pages, de adviezen per pagina.
scopeworkspace

Antwoord

itemsobject[]Hooguit 500, belangrijkste eerst, met impact_euros en confirmation (state confirmed of waiting, by, at, waits_on, overdue, note).
euro_basis?object
countsobject
tip?object
last_refresh?datetime
thresholdsobject
learnedobject[]
effect_daysint
can_managebool
has_githubbool
progressobject[]Per categorie: category, done, total (zonder verlopen).
effect?objectAlleen bij archief: done, measured, clicks, impressions (na min vóór, over de gemeten adviezen).
pages?object[]Alleen bij status=actief&group=page: url, path, ids, count, impact_clicks, categories.
POST/api/advice

Status, toewijzen, GitHub-issue, opnieuw controleren, prompt maken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • statusid*, status*, note, task_url

    Bij done legt Studio de stand van nu vast om het effect na 14 dagen te meten, en zet het op de tijdlijn. Het advies wacht daarna op bevestiging door de bron (Google, live controle, lockbestand, meting). Antwoord: item.

    • status open | planned | done | dismissed
  • assignid*, assignee_id, due_date

    Toewijzen plant een open advies. Antwoord: item.

  • issueid*

    Maakt een issue in de GitHub-repo van het project (502 github als GitHub weigert). Antwoord: url.

  • recheckid*

    Status 202. Antwoord: task_id.

  • refreshproject_id*

    Draait alle regels opnieuw. Status 202. Antwoord: task_id.

  • promptproject_id*, ids*, mode, mark

    Alleen het eigen team. Maakt van adviezen die in code of configuratie op te lossen zijn één opdracht, met bewijs, wanneer het klaar is en hoe je het controleert. URL's zonder querystring; geen persoonsgegevens of sleutels. Antwoord: prompt, filename, items.

    • ids int[] · Hooguit 30; alleen adviezen met fixable: true tellen mee.
    • mode claude | algemeen
    • mark bool · Standaard true: zet de punten op planned met een notitie.

Voorbeeld: Verzoek

{
  "action": "status",
  "id": 812,
  "status": "done",
  "note": "Titel aangepast"
}
GET/api/playbooks

Playbooks van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Advies.

Queryparameters

project_id*intProject-id.

Antwoord

runsobject[]
availableobject
can_managebool
POST/api/playbooks

Playbook starten en afvinken

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Advies); anderen krijgen 404.

Acties (action)

  • startproject_id*, playbook*

    Status 201. Antwoord: id.

  • stepid*, step*, done
  • finishid*
GET/api/experiments

Testlog en hypothesekaarten

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Advies.

Queryparameters

project_id*intProject-id.

Antwoord

experimentsobject[]
cardsobject[]
can_managebool
POST/api/experiments

Test vastleggen of verwijderen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Advies); anderen krijgen 404.

Acties (action)

  • saveproject_id*, id, title*, hypothesis, metric, page_url, starts_on, ends_on, outcome, result

    Antwoord: id.

    • id int · Zonder id: nieuw.
    • outcome won | lost | neutral
  • deleteproject_id*, id*
GET/api/questions

Vragen bij een rapport, advies of project

Geeft disabled: true als vragen uitstaan voor de workspace.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team en klanten met toegang tot het onderwerp; open=1 alleen het team.

Queryparameters

project_idint
subject_typereport | advice | project
subject_idint
openboolAlle open vragen over alle klanten.

Antwoord

questionsobject[]id, label, project_id, project_name, subject_type, subject_id, subject_title, anchor, status (open|wacht_ons|wacht_klant|opgelost|gesloten), link, created_by, updated_at, messages (body, from_team, internal, name, at)
disabledbool
POST/api/questions

Vraag stellen, antwoorden of sluiten

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Team en klanten met toegang tot het onderwerp.

Acties (action)

  • askproject_id*, subject_type*, subject_id*, anchor, body*

    Status 201. Antwoord: question_id.

    • subject_type report | advice | project
    • body string · Hooguit 4000 tekens.
  • replyquestion_id*, body*
  • closequestion_id*

    Het team, of wie de vraag stelde.

GET/api/support

Support: tickets

Klantvragen aan het bureau (deel=klant, module Support, vanaf Copiloot) en vragen aan instnt (deel=instnt). Een vraag bij een rapport of advies is ook een ticket. Zonder id een lijst met tellers per status; met id één ticket met het gesprek, bijlagen en voor de behandelaar de projectcontext, interne notities, het team en vaste antwoorden. Een ticket van een andere werkruimte geeft 404.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Klant: eigen tickets (met de module Support). Team: alle klanttickets; kijkers alleen lezen. deel=instnt: eigenaar of lid. admin=1: alleen platformbeheerders.

Queryparameters

deelklant | instnt
adminbool
idint
setsboolAlleen de sets vaste antwoorden om in te laden (team, 13-10-2026).
langnl | en
statusactief | te_laat | open | wacht_ons | wacht_klant | opgelost | geslotenStandaard actief: alles behalve opgelost en gesloten. Leeg voor alles.
qstringZoekt in onderwerp, nummer en berichten.
project_idint
mineboolAlleen aan mij toegewezen.

Antwoord

ticketsobject[]id, label, number, scope, title, subject_type, anchor, project, requester, status, priority, channel, assigned, due_at, overdue, messages, last_from_team, created_at, updated_at, workspace
countsobject
overdueint
moduleobject
statusesobject
prioritiesobject
can_createbool
setsobject[]Met sets=1: key, label, description, count, titles.
template_setsobject[]Voor het team: dezelfde sets.
settingsobjectAlleen voor het team: sla, sla_default, inbound_available, inbound_on, address, can_manage.
ticketobjectMet id: het ticket plus thread, link, role, can, en voor de behandelaar context, team, templates en projects.
POST/api/support

Support: vragen stellen en behandelen

Bijlagen als multipart files[]: hooguit 5 per bericht en 10 MB per bestand; afbeeldingen (geen SVG), pdf, tekst, csv en Office-bestanden. Het soort volgt uit de inhoud, niet uit de naam.

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Per actie: een klant maakt en beantwoordt zijn eigen tickets; eigenaar en lid behandelen en stellen in; met admin: true behandelen platformbeheerders vragen aan instnt.

Acties (action)

  • createdeel*, title*, body*, project_id, priority, files

    Status 201. Antwoord: ticket.

    • deel klant | instnt
    • title string · Hooguit 160 tekens.
    • body string · Hooguit 10.000 tekens.
    • project_id int · Klant met meer dan één project: verplicht.
    • priority laag | normaal | hoog | urgent · Alleen bij deel=instnt.
  • replyid*, template_id, body*, files, admin

    Op een gesloten ticket alleen de behandelaar. Antwoord: ticket.

    • template_id int · Het vaste antwoord waar dit uit kwam; heeft het acties (macro, 13-10-2026), dan voert Studio die na versturen uit.
  • noteid*, body*, files, admin

    Interne notitie: de aanvrager ziet hem nooit, ook de bijlagen niet. Antwoord: ticket.

  • statusid*, status*, admin

    De aanvrager kan alleen sluiten. Antwoord: ticket.

    • status open | wacht_ons | wacht_klant | opgelost | gesloten
  • assignid*, user_id, admin

    Antwoord: ticket.

  • priorityid*, priority*, admin

    Rekent een lopende deadline opnieuw uit. Antwoord: ticket.

    • priority laag | normaal | hoog | urgent
  • projectid*, project_id, admin

    Antwoord: ticket.

  • settingssla, inbound_on

    Antwoord: settings.

    • sla object · Uren per prioriteit (laag, normaal, hoog, urgent), elk 1–720.
  • rotate_address

    Nieuw adres voor mail naar support; het oude werkt meteen niet meer. Antwoord: settings.

  • template_saveid, project_id, category, actions, title*, shortcut, body*, buttons, admin

    Dezelfde vaste antwoorden gelden in Support en in de chat. Antwoord: templates.

    • project_id ?int · Alleen voor dit project (13-10-2026); leeg is voor alle projecten. Hooguit 50 per project en 50 algemeen.
    • category string · Categorie, hooguit 40 tekens (13-10-2026).
    • actions object · Macro (13-10-2026): status (wacht|afgesloten), tags (hooguit vijf), assign_me; na versturen in de chat.
    • shortcut string · Sneltoets voor de chat, zonder schuine streep: kleine letters, cijfers en streepjes, hooguit 30.
    • buttons string[] · Knoppen in de chat, hooguit vier (22-10-2026).
  • template_deleteid*, admin

    Antwoord: templates.

  • template_importset, project_id, sets, only, lang

    Een set vaste antwoorden inladen (13-10-2026). Voegt toe en overschrijft niets: dezelfde naam of sneltoets wordt overgeslagen, boven de 50 stopt het. Eigenaar of lid. Antwoord: templates, imported.

    • set basis | webshop | diensten | horeca | software
    • project_id int · In dit project in plaats van algemeen.
    • sets string[] · Meerdere sets tegelijk (13-10-2026).
    • only string[] · Alleen deze antwoorden, op naam.
    • lang nl | en
GET/api/support/attachment

Bijlage van een ticket

Altijd als download, met X-Content-Type-Options: nosniff.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Wie het ticket mag zien; een bijlage bij een interne notitie alleen de behandelaar.

Queryparameters

id*int
adminbool
GET/api/livechat

Chat: gesprekken met bezoekers

De inbox van de chat op de site (module Chat, vanaf Copiloot). Zonder id een lijst met tellers; met id één gesprek met berichten, interne notities, bezoekerscontext (pagina, taal, toestel, eerdere gesprekken), het team en vaste antwoorden met ingevulde variabelen. Een gesprek openen markeert het als gelezen. Met since alleen berichten na dat id, voor polling. Wie de inbox opent, telt anderhalve minuut als online voor het widget. Een gesprek van een ander project of een andere werkruimte geeft 404.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team: gesprekken van projecten met de module Chat; kijkers alleen lezen. Klant: alleen bij een project waar hij Website op goedkeuren heeft. settings: eigenaar of lid.

Queryparameters

viewopen | wachtend | mijn | niet_toegewezen | buiten_tijden | afgesloten | alleStandaard open: alles wat niet is afgesloten. wachtend: het team is aan zet.
project_idint
labelstringAlleen gesprekken met dit label.
sortwachtend | nieuwste | activiteitStandaard wachtend: wie het langst op het team wacht bovenaan.
qstringZoekt in naam, e-mail en berichten.
idint
sinceint
tellerboolAlleen de tellers, voor de navigatie en het app-icoon.
settingsintProject-id: de instellingen van de chat en de installatiecode.

Antwoord

conversationsobject[]id, project, name, email, status, offline, assigned, last, unread, tags, page_url, visitor_online, rating, ticket_id, created_at, last_message_at, waiting_since
countsobjectopen, mijn, niet_toegewezen, wachtend, ongelezen; zonder teller ook buiten_tijden, afgesloten, oudste_wacht, per_project (per project-id: open, wachtend) en labels (de vijf meest gebruikte: label, count); met teller=1 ook projects (aantal sites met chat voor deze gebruiker).
projectsobject[]id, name, enabled, can_reply, notify_after
sortstring
moduleobject
can_managebool
statusesobject
conversationobjectMet id: het gesprek plus messages, visitor, visitor_typing, rating_comment, ticket, can, team, templates en me (het eigen gebruikers-id). Sinds 11-10-2026 heeft visitor ook route (path, title, at: de pagina's van dit bezoek, zonder querystring, hooguit twintig, na 30 dagen zonder bericht weg), read_upto en read_at (tot welk bericht de bezoeker het venster zag); een bericht kan faq (id, title) hebben. Sinds 12-10-2026 bevat visitor.previous (id, status, created_at, last_at, rating, ticket, preview: de eerste zin) ook gesprekken van de andere browsers van de bezoeker, gekoppeld met een code of StudioChat.identify(). Sinds 13-10-2026 viewers (id, name, typing): collega's die dit gesprek ook open hebben.
settingsobjectMet settings: enabled, greeting, offline_message, color, position, hours, allowed_origins, allowed_hosts, prechat, proactive, notify_after, notify_users, snippet, token. Berichten hebben files (bijlagen met een URL die een half uur geldig is); visitor heeft consent_at.
POST/api/livechat

Chat: antwoorden en instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Wie mag antwoorden: eigenaar, lid, of een klant met Website op goedkeuren. Instellingen en verwijderen: eigenaar of lid.

Acties (action)

  • replyid*, faq_id, buttons, file, body*

    Wie antwoordt op een gesprek zonder behandelaar, krijgt het. Niet bij een gesprek dat een ticket werd. Antwoord: conversation.

    • faq_id int · Een gepubliceerde veelgestelde vraag van dit project als kaart onder het bericht (11-10-2026); body mag dan leeg.
    • buttons string[] · Hooguit vier knoppen van 1 tot 40 tekens onder het bericht (22-10-2026); in multipart als JSON-tekst. De bezoeker kiest er één.
    • file file · Bijlage (21-10-2026): afbeelding (jpg, png, webp, gif) of pdf, hooguit 10 MB; de inhoud bepaalt het type. Dan als multipart/form-data; body mag leeg. Ook bij note.
    • body string · Hooguit 2.000 tekens. {naam}, {voornaam}, {project}, {bureau} en {medewerker} worden ingevuld.
  • noteid*, body*

    Interne notitie: de bezoeker ziet hem nooit. Antwoord: conversation.

  • statusid*, status*

    Antwoord: conversation.

    • status open | wacht | afgesloten
  • assignid*, user_id

    Antwoord: conversation.

  • tagsid*, tags*

    Antwoord: conversation.

    • tags string[] · Hooguit tien, elk hooguit 30 tekens.
  • filesid*, allow*, limit

    Bijlagen van de bezoeker in dit gesprek toestaan of weer uitzetten. Standaard uit; de bezoeker krijgt een systeembericht en ziet pas daarna de paperclip. Antwoord: conversation.

    • limit ?int · Hoeveel bijlagen de bezoeker mag sturen voor het weer dicht gaat (13-10-2026); zonder geldt de instelling van de site.
  • ticketid*

    Zet het gesprek om naar een ticket in Support (module nodig) en sluit het. Met het e-mailadres van de bezoeker gaat het antwoord per mail. Antwoord: conversation.

  • typingid*

    De bezoeker ziet acht seconden "typt…".

  • readid*
  • activityid*, token*, environment, end

    Live Activity op de iPhone (12-10-2026): alleen vanuit een app-sessie (anders 403 app_only). Studio werkt de activiteit bij per push bij een nieuw bericht, een antwoord, toewijzen en afsluiten; bij afsluiten of een ticket eindigt hij. Antwoord: state.

    • token string · Pushtoken van de Live Activity (hex).
    • environment sandbox | production
    • end bool · Token weghalen: de app volgt dit gesprek niet meer.
  • deleteid*

    Gesprek met alle berichten weg, bijvoorbeeld op verzoek van de bezoeker.

  • identity_secretproject_id*, remove

    Sleutel voor StudioChat.identify() maken of vernieuwen (64 hex-tekens), of met remove weghalen. Oude handtekeningen werken daarna niet meer. Antwoord: settings.

  • muteid*, muted*

    Stil zetten: geen push meer voor dit gesprek, alleen voor jou (13-10-2026). Het gesprek geeft muted. Antwoord: conversation.

  • settingsproject_id*, enabled, auto_close_minutes, rating_aspects, file_types, file_max_mb, file_limit, greeting, offline_message, color, position, greeting_buttons, hide_branding, hours, allowed_origins, prechat, proactive, notify_after, notify_users, widget

    Antwoord: settings, widget_options.

    • auto_close_minutes ?int · Gesprek vanzelf dicht na zoveel minuten zonder reactie van de bezoeker nadat het team antwoordde (5 tot 10080); leeg is nooit (13-10-2026).
    • rating_aspects bool · Naast sterren ook vriendelijkheid, snelheid en deskundigheid laten beoordelen.
    • file_types string[] · Wat een bezoeker mag sturen (13-10-2026): afbeeldingen, pdf en/of documenten.
    • file_max_mb int · 1 tot 10.
    • file_limit ?int · Na zoveel bijlagen gaan bijlagen in dat gesprek weer dicht; leeg is geen grens.
    • position rechts | links
    • greeting_buttons string[] · Hooguit vier knoppen onder de groet; een klik begint het gesprek met die tekst.
    • hide_branding bool · Venster zonder instnt studio; alleen met white-label in het plan.
    • hours ?object · Per dag (1 = maandag) een lijst blokken ["09:00","17:00"], in de tijdzone van de werkruimte; leeg is altijd open.
    • allowed_origins string · Extra adressen die het widget mogen laden, naast de domeinen van het project. Over http alleen wat hier staat.
    • prechat object · Formulier vóór het eerste bericht: when (nooit|offline|altijd), name/email/topic (uit|optioneel|verplicht), topics (hooguit tien), privacy (bool) en privacy_url (https). Buiten openingstijden is e-mail altijd verplicht. Vervangt ask_email (21-10-2026).
    • proactive object[] · Hooguit vijf: match (bevat|is), path, delay (0–600 s), message (hooguit 300 tekens), every_days (0–365; 0 = één keer), only_new, only_open.
    • notify_after int · Mail na zoveel minuten zonder antwoord, 1–240.
    • widget object · Het venster (10-10-2026), per groep; wat ontbreekt blijft zoals het was. home: mode (zoeken|samen|chat), contact (altijd|na_zoeken), featured_count (0–8), categories, conversation_card, logo. contact: offline (bericht|faq), alternatives (hooguit drie: type telefoon|email|whatsapp, value, label, text, when altijd|offline), links (hooguit drie: label, https-url). faq: enabled, suggest, feedback, log_misses. team: names (voornaam|volledig|voornaam_foto|bureau), queue. visibility: paths (hooguit tien: match bevat|is, path met /), mobile, offline. launcher: offset_x, offset_y (0–200), label_mobile. texts: per taal (nl, en) greeting, offline, home_title, home_intro, search, contact, reply_time, launcher.
  • refused_allowproject_id*, origin*

    Een geweigerd adres toestaan: het komt bij allowed_origins en verdwijnt uit de lijst. Antwoord: settings.

  • refused_ignoreproject_id*, origin*

    Een geweigerd adres verbergen; na 7 dagen gaat het vanzelf weg. Antwoord: settings.

  • rotate_tokenproject_id*

    Nieuw widget-token; de oude installatiecode werkt meteen niet meer. Antwoord: settings.

GET/api/faq

Veelgestelde vragen

Artikelen die de bezoeker in het chatvenster doorzoekt. Markdown; html is opgeschoond (geen ruwe HTML, geen afbeeldingen, alleen http(s)- en mailto-links). Met suggest hooguit drie gepubliceerde treffers voor een vraag van de bezoeker, met plain om als antwoord in te voegen.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Zoals de chat: team bij Website op bekijken (concepten alleen voor eigenaar en lid), een klant alleen gepubliceerde artikelen en alleen bij Website op goedkeuren.

Queryparameters

project_idint
qstringZoeken in titel, categorie en tekst.
suggeststringVraag van de bezoeker.
statsintCijfers over zelfhulp over 7, 30 of 90 dagen; alleen wie beheert.
idintEén artikel met body, html en plain.

Antwoord

statsobjectMet stats: articles (per id views, yes, no, helpful_pct), views, yes, no, misses (zoektermen zonder resultaat: term, count), conversations_after (gesprekken na zelfhulp), deflection_pct.
articlesobject[]id, project_id, title, category, language, published, featured, position, views, updated_at, excerpt (met suggest ook body, html, plain)
articleobject
can_managebool
languagesobject
max_bodyint
POST/api/faq

Veelgestelde vragen beheren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (Website op beheren); preview iedereen die de chat ziet.

Acties (action)

  • createproject_id*, title*, body*, category, language, published

    Antwoord: article.

    • title string · Hooguit 200 tekens.
    • body string · Markdown, hooguit 20.000 tekens.
    • language nl | en
  • updateid*, title, body, category, language, published, featured

    Antwoord: article.

    • language nl | en
    • featured bool · Uitgelicht op het startscherm van het venster.
  • deleteid*
  • reorderproject_id*, ids*
    • ids int[] · Alle artikelen van het project in de nieuwe volgorde.
  • previewbody*

    Dezelfde HTML als het widget toont. Antwoord: html.

GET/api/chat-team

Chat: rapportage en beschikbaarheid

Met view=report (standaard): gesprekken per dag, per weekdag en uur, eerste reactietijd en afhandeltijd (mediaan en p90, in seconden, alleen binnen de openingstijden), gemist (na 15 minuten zonder antwoord en geen ticket), tickets, tevredenheid (4 of 5 van 5 telt als tevreden), drukste pagina's en per teamlid. Met view=team: de eigen status, het team met status en lopende gesprekken, en per project de verdeling.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Zoals de inbox. Per teamlid en de verdeling alleen voor het team; de verdeling aanpassen: eigenaar of lid.

Queryparameters

viewreport | team
fromdateStandaard 27 dagen voor to.
todateStandaard vandaag.
project_idint

Antwoord

reportobjectfrom, to, timezone, totals, days, heatmap, pages, comments, agents, truncated
projectsobject[]id, name
meobjectMet view=team: status, chosen, max_chats, open, can_set.
teamobject[]id, name, status, open, max_chats
routingobject[]project_id, name, assign_mode, report_block
POST/api/chat-team

Chat: status en verdeling

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Status: wie ergens mag antwoorden. Verdeling: eigenaar of lid.

Acties (action)

  • availabilitystatus*, max_chats

    Wie op beschikbaar staat maar de inbox anderhalve minuut niet opvroeg, telt als afwezig; na een kwartier als offline. Offline: je automatisch verdeelde gesprekken gaan naar een ander of worden vrij.

    • status beschikbaar | afwezig | offline
    • max_chats ?int · Hooguit zoveel lopende gesprekken tegelijk, 1–50; leeg is geen maximum.
  • routingproject_id*, assign_mode, report_block
    • assign_mode handmatig | rondgang | minst_bezet · Handmatig: niemand krijgt automatisch een gesprek. Rondgang: om de beurt onder wie beschikbaar is. Minst bezet: wie de minste lopende gesprekken heeft.
    • report_block bool · Chat in het maandrapport van dit project.
GET/api/ai

AI-taken, teksten, merkstem en AI-zichtbaarheid

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

project_id*intProject-id.

Antwoord

kindsobject
usageobjectused, limit, cost_usd
worker_seen?datetime
tasksobject[]
textsobject[]
voice?object
opportunitiesobject[]
adviceobject[]
reportsobject[]
contentobject[]
geoobjectquestions
POST/api/ai

AI-taak aanvragen en teksten beoordelen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • requestkind*, recommendation_id, report_id, content_id, project_id, question, keyword, landing

    Valt onder de limieten van het plan. Antwoord: task_id.

    • kind title_meta | advice_plain | report_intro | content_brief | draft_text | week_analysis | data_question | share_of_answer | ad_texts
    • recommendation_id int · Bij title_meta en advice_plain.
    • report_id int · Bij report_intro.
    • content_id int · Bij content_brief en draft_text.
    • project_id int · Bij de overige.
    • question string · Bij data_question.
    • keyword string · Bij ad_texts.
  • decidetext_id*, decision*, final
    • decision overgenomen | aangepast | afgewezen
    • final string · Verplicht bij aangepast.
  • voiceproject_id*, tone, do_words, dont_words, forbidden_claims
  • geo_addproject_id*, question*
    • question string · Hooguit tien per project.
  • geo_removeproject_id*, id*
GET/api/ai/worker

AI-worker: volgende taak claimen

Let op: deze GET claimt de taak (zet hem op running). Alleen voor de worker van instnt.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Antwoord

task?objectid, kind, prompt, schema, model
POST/api/ai/worker

AI-worker: resultaat inleveren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Alleen platformbeheerders van instnt; anderen krijgen 404 of 403.

Body

id*int
result*object

Uptime en techniek

Uptime-controles, JavaScript-fouten, back-ups, onderhoud, sitecontroles, versies met bekende lekken en de cookiescan.

GET/api/uptime

Uptime, fouten, back-ups en onderhoud

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

monitorsobject[]id, url, expect_status, expect_text, interval_minutes, enabled, state, last_checked_at, last_response_ms, last_error, ssl_expires_at, safe_browsing, uptime_24h, uptime_30d, avg_ms_24h, recent, incidents
errorsobject[]id, message, source, line, col, page, browser, stack, occurrences, first_seen, last_seen, status, last_14_days
error_key?string
snippet?string
script_tag?string
status_pagebool
alert_emails?string
backupsobject[]
maintenanceobject[]
can_managebool
suggested_url?url
POST/api/uptime

Controles, statuspagina, onderhoud en back-ups beheren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createproject_id*, url*, expect_status, expect_text, interval_minutes

    Controleert meteen één keer. Antwoord: monitor_id.

    • expect_status int · Standaard 200.
    • interval_minutes 1 | 5 | 15
  • updatemonitor_id*, url*, expect_status, expect_text, interval_minutes, enabled
    • interval_minutes 1 | 5 | 15
  • deletemonitor_id*
  • checkmonitor_id*
  • status_pageproject_id*, revoke

    Antwoord: link.

  • alert_emailsproject_id*, emails
    • emails string · Komma-gescheiden.
  • maintenance_createproject_id*, starts_at*, ends_at*, note
    • ends_at datetime · Hooguit een week na het begin.
  • maintenance_deleteid*
  • backup_createproject_id*, name*, max_hours
    • max_hours int · 1 tot 744; standaard 26.
  • backup_deleteid*
  • error_keyproject_id*

    Maakt de sleutel voor het sitescript als die er nog niet is.

  • error_statuserror_id*, status*
    • status open | resolved | ignored
GET/api/site-checks

Sitecontroles per host

Headers, blootgestelde bestanden, cookievlaggen, CMS, domein, DNSSEC en CAA, mail, tags, derde partijen, robots, AI-crawlers en sitemap.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

hostsobject[]host, checks
POST/api/site-checks

Sitecontroles nu opnieuw

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Team; klanten met toegang tot het onderdeel Website.

Acties (action)

  • runproject_id*

    Controleert de hosts van het project meteen opnieuw, ook het certificaat van de bewaakte adressen, en berekent de beveiligingsscore opnieuw. Hooguit twee keer per vijf minuten per project; daarna 429. Antwoord: hosts.

GET/api/security-score

Beveiligingsscore

Score 0–100 uit zes onderdelen met een vast gewicht (versleuteling, headers, blootstelling, software, mail en DNS, reputatie), berekend uit de laatste sitecontrole, certificaten, lekken en Safe Browsing. Niet gemeten onderdelen tellen niet mee (score per onderdeel is dan null); met minder dan twee gemeten onderdelen is score zelf null. trend is de dagelijkse score van de laatste 30 dagen. domains zegt per domein of het geverifieerd is en hoe (dns of plugin); het TXT-record staat bij /api/domains.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

score?int
previous?int
trendobject[]day, score
categoriesobject[]key, label, weight, description, score (?int), points (status, label, detail)
methodstring
domainsobject[]domain, verified, via
POST/api/security-score

Beveiligingsscore opnieuw berekenen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • recomputeproject_id*

    Telt opnieuw uit de laatste metingen en bewaart de score van vandaag; haalt niets op. De controles zelf lopen elke ochtend om 05:50. Antwoord: score.

GET/api/tech-stack

Wat draait er op de site

Herkende techniek per categorie uit de homepage en de headers (CMS, winkel, framework, meten, advertenties, toestemming, betalen, reviews, chat, hosting, lettertypen), wat er de laatste 90 dagen bij kwam of verdween, herkende diensten die nog niet gekoppeld zijn, punten die niet goed staan en gratis voorstellen. Regelwerk; summary is een optionele AI-alinea.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

hostsstring[]
checked_at?datetime
detectedobject[]category, label, items (tech, label, version, evidence, host, since, last_seen, connector, connected)
changesobject[]type (added|removed), label, host, at
connectobject[]tech, label, connector, url
gapsobject[]key, tone, title, detail, url, action
suggestionsobject[]key, title, detail, url, action
summary?objectstatus, text, at
can_managebool
can_aibool
POST/api/tech-stack

Opnieuw bekijken of een samenvatting laten schrijven

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • scanproject_id*

    Bekijkt de homepage(s) nu opnieuw. Hooguit eens per minuut (429).

  • summaryproject_id*

    Alleen het eigen team. Claude schrijft één alinea over de herkenning; die staat daarna als summary in de GET. Status 202. Antwoord: task_id.

GET/api/components

Versies en open lekken

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

componentsobject[]ecosystem, name, version, type, dev, active, reported_at
reportedobject
vulnsobject[]ecosystem, name, version, vuln_id, aliases, severity, summary, fixed_in, url, first_seen_at
resolved_30dint
wordfencebool
GET/api/cookiescan

Laatste cookiescan met verschil

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Website.

Queryparameters

project_id*intProject-id.

Antwoord

latest?object
last_error?object
findingsobject[]
gonestring[]
has_previousbool
historyobject[]
can_scanbool
POST/api/cookiescan

Nu scannen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid (beheer van Website); anderen krijgen 404.

Acties (action)

  • scanproject_id*

    Hooguit eens per vijf minuten per project. Status 202. Antwoord: task_id.

Rapporten

Maandrapporten, kwartaal- en jaaroverzichten, deellinks en PDF. Klanten zien alleen gepubliceerde rapporten.

GET/api/reports

Rapporten van een project

Zonder period: de lijst. Met period: één rapport met de gegevens. Met range: een kwartaal (2026-Q3) of jaar (2026) uit de maandrapporten.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

project_id*intProject-id.
periodmonth
rangestring

Antwoord

reportsobject[]id, period, label, status, intro, generated_at, published_at
reportobject
period_reportobject
suggested_periodmonth
can_managebool
projectstring
brandingobject
sharesobject[]
POST/api/reports

Rapport maken, publiceren of delen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • generateproject_id*, period

    Maakt het rapport of ververst de cijfers; de toelichting blijft. Status 202. Antwoord: task_id, period.

    • period month · Een afgelopen maand; standaard de vorige.
  • introid*, intro
  • publishid*

    Start de automatisering die de klant mailt. Antwoord: notified.

  • unpublishid*
  • deleteid*
  • shareid*, days

    Alleen gepubliceerde rapporten. Antwoord: link, expires_at.

    • days int · 1 tot 90; standaard 30.
  • unshareid*, share_id*
GET/api/reports/pdf

Rapport als PDF

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Overzicht.

Queryparameters

id*int

Google Ads

Inzichten, doelen, zoekwoordideeën en de Ads-piloot met voorstellen.

GET/api/ads

Google Ads van een project

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Team; klanten met toegang tot het onderdeel Ads.

Queryparameters

project_id*intProject-id.

Antwoord

summary?object
pacingobject[]
ngrams?object
quality?object
budget?object
ad_testsobject[]
pmaxobject[]
can_managebool
autopilot?objectAlleen voor wie beheert: mode, max_change_pct, max_daily_budget, max_changes_per_day, max_week_change_pct, allowed_kinds, excluded_campaigns, quiet_from, quiet_until, enabled_at, enabled_by, stopped_at, killed_at, auto_apply, campaigns, me (two_factor, owner, reauth), proposals (met effect, reversible, can_revert, auto_blocked) en changes (het logboek: action, result, before, after, request_id, user).
POST/api/ads

Doelen, ideeën en de Ads-piloot

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • targetsproject_id*, target_cpa, order_value, margin_pct
  • ideasproject_id*, seeds*

    Via Keyword Planner; een week gecachet. Antwoord: ideas, seeds.

    • seeds string[] · Hooguit tien.
  • modeproject_id*, mode*, max_change_pct, max_daily_budget, max_changes_per_day, max_week_change_pct, allowed_kinds, excluded_campaigns, quiet_from, quiet_until, password, code

    automatisch en ruimere grenzen alleen door de eigenaar, met tweestap aan en de code uit de authenticator (telt tien minuten; een wachtwoord is niet genoeg, sinds 11-10-2026). Zonder geldige code 422 reauth. Niet met een API-sleutel (403); stop en kill wel. Valt onder de limieten van het plan.

    • mode uit | lezen | voorstellen | automatisch
    • max_change_pct int · 1 tot 100; standaard 20.
    • max_changes_per_day int · 1 tot 50; standaard 5.
    • max_week_change_pct int · Hoeveel een budget in zeven dagen mag schuiven; standaard 30.
    • allowed_kinds string[] · budget, negative en/of pause_keyword; standaard budget en negative.
    • quiet_from ?int · Uur 0–23; samen met quiet_until.
  • proposeproject_id*
  • applyproject_id*, proposal_id*, confirm_irreversible, password, code

    Met tweestap. Eerst met validateOnly naar Google, dan echt; elke uitkomst komt in het logboek. Antwoord: proposal.

    • confirm_irreversible bool · Verplicht voor wat niet terug te draaien is (Googles aanbevelingen).
  • rejectproject_id*, proposal_id*, reason
  • revertproject_id*, proposal_id*, password, code

    Met tweestap; mag ook met de noodstop aan.

  • stopproject_id*

    Noodstop voor dit project: terug naar lezen.

  • killproject_id*

    Noodstop voor alle projecten van de workspace; zonder tweestap, zodat stoppen altijd snel kan.

  • releaseproject_id*, password, code

    Noodstop van de workspace uit: alleen de eigenaar, met tweestap.

Automatiseringen en meldingen

Automatiseringen (trigger, filters, acties), het logboek, goedkeuringen, meldingsregels en de kanalen: uitgaande webhooks, Slack en Teams. Uitgaande webhooks hebben de vorm {"event", "sent_at", "data"} met de header X-Studio-Signature: sha256=<HMAC-SHA256 van de body met het geheim>, plus X-Studio-Timestamp, X-Studio-Delivery en X-Studio-Signature-V2 (HMAC van <timestamp>.<delivery>.<body>) om oude of herhaalde berichten te weigeren.

GET/api/automations

Automatiseringen, catalogus, logboek en goedkeuringen

Zonder parameters: de lijst plus de catalogus van triggers en acties. runs=1: het logboek (25 per pagina). run=ID: één uitvoering. approvals=1: wat op goedkeuring wacht.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

runsbool
runint
approvalsbool
automation_idint
statusstring
project_idint
pageint

Antwoord

automationsobject[]id, name, enabled, is_default, trigger_type, trigger_params, project_id, filters, actions, rate_limit, requires_approval, fired, fired_30d, last_run, hook_url, schedule, can_run
catalogobject
action_catalogobject
templatesobject[]
triggersobject[]
runsobject[]
totalint
pagesint
runobject
approvalsobject[]
limit?int
usedint
timezonestring
POST/api/automations

Automatiseringen opslaan, testen en uitvoeren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • saveid, name*, trigger_type*, trigger_params, project_id, filters, actions*, rate_limit, requires_approval, enabled

    Fouten komen per veld terug in fields. Valt onder de limieten van het plan. Antwoord: id.

    • id int · Zonder id: nieuw.
    • trigger_type string · Uit catalog.
    • actions object[] · Elk {type, params}; als-dan-anders is type branch met then en else.
    • requires_approval bool · Uitzetten kan alleen de eigenaar.
  • testid, run_id

    Droogloop met dezelfde velden als save, of alleen een id; controleert, maar schrijft en verstuurt niets. Antwoord: source, data, *.

    • run_id int · Gegevens van een eerdere uitvoering in plaats van het voorbeeld.
  • timezonetimezone*

    Antwoord: timezone.

    • timezone string · Een IANA-naam, zoals Europe/Amsterdam.
  • toggleid*
  • deleteid*

    Een standaardautomatisering gaat uit in plaats van weg.

  • runid*

    Alleen bij een handmatige trigger of een schema. Antwoord: run_id.

  • rotate_hookid*

    Nieuw adres voor een inkomende webhook; het oude werkt meteen niet meer.

  • resetid*
  • retryrun_id*, action_index*
  • approveapproval_id*
  • rejectapproval_id*
GET/api/alerts

Meldingsregels en wat er verstuurd is

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Antwoord

emailsstring[]
rulesobject[]
automaticobject[]
logobject[]
approvals_openint
actionsobject
recipientsobject
channelsobject[]
webhooksobject[]
teamobject[]
can_editbool
is_ownerbool
POST/api/alerts

Meldingsregel maken of wijzigen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createkind*, project_id, metric, threshold*, name, actions

    Valt onder de limieten van het plan. Antwoord: rule_id.

    • kind threshold_live | milestone | event
    • project_id ?int · Verplicht bij event.
    • threshold int · Minstens 1.
  • updaterule_id*, threshold, metric, project_id, name, actions, requires_approval, enabled
  • deleterule_id*
  • togglerule_id*, enabled*
GET/api/webhooks

Uitgaande webhooks

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Antwoord

webhooksobject[]id, url, events, last_status, last_error, last_at, created_at
eventsobject
POST/api/webhooks

Webhook toevoegen, testen of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createurl*, events*

    Hooguit tien per workspace. Status 201. Antwoord: id, secret.

    • url url · Een openbaar https-adres.
    • events string[] · advice.created, incident.opened, incident.resolved, report.published, anomaly.detected, question.asked, vulnerability.found.
  • deleteid*
  • testid*

    Stuurt {"event": "test"}.

GET/api/chat

Slack- en Teams-kanalen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Antwoord

channelsobject[]id, kind, name, events, last_status, last_at
eventsobject
POST/api/chat

Kanaal toevoegen, testen of weghalen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • createkind*, name, url*, events*

    Status 201.

    • kind slack | teams
    • url url · Webhook-adres uit Slack of Teams.
  • deleteid*
  • testid*

    Antwoord: status.

GET/api/slack

Slack-bot: instellingen zonder geheimen

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Antwoord

app?objectchannel, events, last_status, last_at
eventsstring[]
interactivity_urlurl
POST/api/slack

Slack-bot instellen

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • savebot_token, signing_secret, channel*, events
    • bot_token string · xoxb-…; leeg houdt het bestaande.
    • channel string · Kanaal-ID (C…).
  • remove
  • test

    Antwoord: status.

Studio Mail

Contacten, lijsten, opt-in-formulieren, sjablonen, verzenddomeinen en -accounts (/api/contacts), en funnels, campagnes en segmenten (/api/mail). Een onbekende actie geeft hier 422 validation.

GET/api/contacts

Contacten, lijsten, formulieren, sjablonen en domeinen

Zonder parameters: het overzicht. list=contacten: contacten met filters (50 per pagina). contact_id=…: één contact met tijdlijn, lijsten en funnels.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

listcontacten
contact_idint
statusunconfirmed | subscribed | unsubscribed | bounced | complained
project_idint
list_idint
tagstring
min_scorenumber
segment_idint
qstring
sortscore
pageint

Antwoord

providersobject[]
countsobject
tagsstring[]
open_trackingbool
segmentsobject[]
listsobject[]
formsobject[]
templatesobject[]
domainsobject[]
accountsobject[]
regionsobject
contactsobject[]id, email, name, status, source, project_id, tags, consent_at, created_at, score
totalint
pageint
contactobject
POST/api/contacts

Contacten, formulieren, sjablonen, domeinen en accounts beheren

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • contact.updateid*, name, language, tags, project_id, list_ids
    • language nl | en · Taal van de bevestigings- en afmeldpagina's en -mails.
  • contact.unsubscribeid*
  • contact.deleteid*

    Wist ook de meetgegevens van het contact.

  • list.saveid, name*

    Antwoord: id.

  • list.deleteid*
  • form.saveid, name*, language, consent_text*, list_id, domain_id, project_id, redirect_url

    Antwoord: id.

    • language nl | en · Taal van het formulier en de embedcode; standaard nl.
    • redirect_url url · Bedankpagina, https.
  • form.deleteid*
  • importlist_id, confirmed*, csv*, declaration*

    Weigert de import als meer dan 20% van de regels ongeldig is; rol-adressen (info@, sales@ …) worden overgeslagen. Antwoord: imported, added, updated, invalid, role, duplicates, suppressed.

    • confirmed bool · Bevestiging dat iedereen toestemming gaf.
    • csv string · E-mailadres en naam per regel, optioneel een derde kolom met de taal (nl of en); hooguit 2 MB.
  • template.saveid, name*, subject*, mjml, html*, text

    Antwoord: id.

  • template.deleteid*
  • template.testid*, confirmed*, domain_id

    Testmail naar jezelf. Antwoord: sent_to.

  • domain.adddomain*, from_local, from_name, provider, account_id, project_id

    Status 201. Antwoord: domain.

    • from_local string · Standaard nieuws.
    • provider ses | resend
    • account_id int · Eigen verzendaccount; dan volgt de verzender daaruit.
  • domain.checkid*

    Antwoord: domain.

  • domain.resumeid*

    Haalt een automatische pauze weg.

  • domain.deleteid*
  • account.saveid, provider, name*, project_id, credentials

    Test de sleutel meteen. Sleutels komen nooit terug; alleen de laatste vier tekens. Antwoord: account.

    • provider ses | resend
    • credentials object · Resend: key, webhook_secret, region. SES: key, secret, region, configuration_set, sns_topic_arn. Leeg houdt de bestaande waarde.
  • account.testid*

    Antwoord: account.

  • account.deleteid*

    Pas als er geen domeinen meer aan hangen.

  • settingsopen_tracking
GET/api/mail

Funnels, campagnes en segmenten

funnel=ID: trechter en mails van één funnel; met contacts=1 (en step, status, page) de contacten erin. campaign=ID: één campagne met resultaten.

Toegang
Sessie of API-sleutel (lezen of schrijven)
Wie
Alleen het team (eigenaar, lid of kijker); klanten krijgen 403.

Queryparameters

funnelint
contactsbool
stepint
statusstring
pageint
campaignint

Antwoord

providersobject[]
attributionbool
funnelsobject[]
campaignsobject[]
segmentsobject[]
segment_fieldsobject[]
segment_opsobject
goalsobject
funnelobject
campaignobject
POST/api/mail

Segmenten en campagnes

Toegang
Sessie of API-sleutel met schrijfrecht
Wie
Eigenaar of lid; kijkers en klanten krijgen 403.

Acties (action)

  • segment.previewdefinition*

    Antwoord: count, subscribed, sample.

    • definition object · {match: all|any, rules: [{field, op, value}]}, hooguit 20 regels.
  • segment.saveid, name*, definition*

    Antwoord: id.

  • segment.deleteid*
  • campaign.saveid, name*, template_id, domain_id, list_id, segment_id, subject_b, ab_percent, ab_hours

    Alleen een concept kan nog wijzigen. Antwoord: id, audience.

    • subject_b string · Tweede onderwerp voor een A/B-test.
    • ab_percent int · 5 tot 50.
    • ab_hours int · 1 tot 72.
  • campaign.scheduleid*, confirmed*, now, scheduled_at

    Antwoord: campaign.

  • campaign.cancelid*
  • campaign.deleteid*
  • campaign.previewid*

    Antwoord: subject_a, subject_b, html.

  • campaign.testid*, confirmed*, variant

    Antwoord: sent_to.

    • variant a | b
  • settingsattribution
    • attribution bool · Klikattributie aan of uit.

Server naar server

Adressen voor andere systemen: conversie-events, deploys, lockbestanden, MCP, inkomende webhooks en het sitescript. Elk heeft een eigen sleutel of een geheim adres.

POST/api/events

Conversie-event vanuit je eigen backend

Het project volgt uit de sleutel. event_id is een UUID v4 en moet gelijk zijn aan de header Idempotency-Key; hetzelfde event nog eens sturen geeft 200 met duplicate: true. Hooguit 8 kB.

Toegang
Conversiesleutel van de bron: Authorization: Bearer <sleutel>
Status
201

Headers

Idempotency-Key*stringGelijk aan event_id.

Body

event_id*string
event*website_visited | signup_started | account_created | email_verified | onboarding_completed | activated | subscription_started | payment_succeeded | subscription_canceled
occurred_at*datetimeISO 8601; niet meer dan 5 minuten in de toekomst.
account_refstringUUID, geen e-mailadres.
visitor_idstring
session_idstring
propertiesobjectsource, plan, amount (als "25.00"), currency.
attributionobjectlanding_page, referrer, utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, fbclid, msclkid, studio_ref.

Antwoord

duplicatebool

Voorbeeld: Verzoek

{
  "event_id": "0b6f1c1e-6f0a-4c51-9d2b-3c1f6f7a8e90",
  "event": "payment_succeeded",
  "occurred_at": "2026-10-05T14:03:00+02:00",
  "account_ref": "6f1d2c3b-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
  "properties": {
    "plan": "pro",
    "amount": "25.00",
    "currency": "EUR"
  }
}

Voorbeeld: Antwoord

{
  "ok": true,
  "duplicate": false
}
POST/api/deploys

Deploy op de tijdlijn

Dezelfde commit twee keer is één gebeurtenis; alleen een nieuwe deploy start automatiseringen.

Toegang
Deploysleutel: Authorization: Bearer <sleutel>
Status
201

Body

titlestring
commitstring
urlurl
POST/api/components

Lockbestanden voor de lekkencontrole

Met een deploysleutel die bij een project hoort. Elke rapportage vervangt de vorige set van dat ecosysteem. Samen hooguit 5 MB.

Toegang
Deploysleutel: Authorization: Bearer <sleutel>

Body

files*objectBestandsnaam naar inhoud: composer.lock, package-lock.json, Package.resolved, Cargo.lock.

Antwoord

countsobject
POST/api/mcp

MCP-server voor Claude en andere assistenten

JSON-RPC 2.0 over HTTP (Streamable HTTP zonder SSE), alleen lezen: initialize, ping, tools/list, tools/call. Tools: projecten, stand_van_project, adviezen, belangrijkste_acties, zoektermen. Elke persoonlijke sleutel werkt, ook lezen of schrijven. Koppelen: claude mcp add --transport http studio https://instnt.studio/api/mcp --header "Authorization: Bearer <sleutel>".

Toegang
Elke persoonlijke API-sleutel (MCP, lezen of schrijven)

Body

jsonrpc*string
idint
method*string
paramsobject

Antwoord

jsonrpcstring
idint
resultobject
errorobject
POST/api/hooks/appstore/{token}

Melding van App Store Connect (webhook)

Met de header x-apple-signature: hmacsha256=<hex> (HMAC-SHA256 van de body met het geheim). Studio haalt de app daarna meteen opnieuw op, hooguit eens per minuut per account. Verkeerde handtekening 401, onbekend adres 404.

Toegang
Geen inlog; het geheim zit in het adres

Body

…objectHet bericht van Apple.

Antwoord

receivedbool
POST/api/hooks/{token}

Inkomende webhook van een automatisering

Het adres is het geheim. Velden uit de JSON-body (één niveau diep, hooguit 50, tot 500 tekens) zijn variabelen in de acties, zoals {{klant}}. Een onbekend of uitgezet adres geeft 404.

Toegang
Geen inlog; het geheim zit in het adres
Status
202

Body

…objectVrije velden.

Antwoord

runbool
POST/api/inbound/{token}

Formulier, afspraak, belmeting of GitHub als lead of tijdlijn

Met een geheim controleert Studio de handtekening: Typeform-Signature, Calendly-Webhook-Signature, X-Hub-Signature-256 (GitHub) of anders de header X-Studio-Secret. GitHub zonder geheim wordt geweigerd.

Toegang
Geen inlog; het geheim zit in het adres

Body

…objectHet bericht van de dienst.

Antwoord

notedbool
GET/api/backup/{key}

Back-up gelukt (ping)

GET of POST, zodat curl -fsS in een cronregel volstaat. Met size in bytes ziet Studio ook een back-up die ineens veel kleiner is.

Toegang
Geen inlog; het geheim zit in het adres

Queryparameters

sizeint
POST/api/backup/{key}

Back-up gelukt (ping)

Toegang
Geen inlog; het geheim zit in het adres

Queryparameters

sizeint
GET/api/titles

Goedgekeurde titels om door te voeren

Voor de WordPress- of Drupal-module.

Toegang
Terugschrijfsleutel: Authorization: Bearer wb_…

Antwoord

titlesobject[]id, url, title, description
POST/api/titles

Titels doorgevoerd

Toegang
Terugschrijfsleutel: Authorization: Bearer wb_…

Body

applied*int[]

Antwoord

appliedint
POST/api/errors/{key}

JavaScript-fout van het sitescript

De sleutel is openbaar (staat in de HTML). Zonder persoonsgegevens: geen IP, geen querystrings. Antwoordt altijd 204.

Toegang
Geen inlog
Status
204

Body

message*string
sourcestring
lineint
colint
stackstring
pagestring
POST/api/vitals/{key}

Web Vitals-meting van het sitescript

Toegang
Geen inlog
Status
204

Body

lcpnumber
inpnumber
clsnumber
pagestring
devicemobile | desktop
POST/api/forms/{key}

Formulier of lead-klik van het sitescript

Alleen veldnamen, nooit wat er is ingevuld. Of lead (telefoon, email, whatsapp) voor een klik op een link.

Toegang
Geen inlog
Status
204

Body

pagestring
formstring
fieldsstring[]
submittedbool
leadtelefoon | email | whatsapp
srstring
POST/api/pageviews/{key}

Cookieloze paginaweergave

Zonder cookies of opslag; een bezoeker is één dag te herkennen aan een hash met een dagelijks wisselend zout. Bots tellen niet.

Toegang
Geen inlog
Status
204

Body

page*string
refurl
qrefstringWaarde van ?ref= of ?source=.
utm_sourcestring
utm_mediumstring
utm_campaignstring
gclidstring
srstring
POST/api/site-events/{token}

Sitegebeurtenis ontvangen

Ondertekend met het geheim van het project: X-Studio-Timestamp (Unix-tijd, hooguit 5 minuten afwijking) en X-Studio-Signature = sha256=<hex hmac_sha256(geheim, timestamp + "." + body)>. data mag Studio bewaren en tellen (per ref); private gebruikt Studio alleen tijdens de afhandeling. Met id telt een herhaalde gebeurtenis niet dubbel. 502 als een actie mislukte en Studio het niet zelf opnieuw probeert: probeer het dan later opnieuw.

Toegang
Geen inlog
Status
202

Body

event*stringKleine letters, cijfers en . _ -, zoals tester.aangemeld.
idstring
dataobject
privateobject

Antwoord

runsint
duplicatebool
POST/api/consent/{key}

Keuze in de cookiebanner

Uit de Consent Mode-update die de banner aan Google doorgeeft. Eén keuze per bezoeker per dag, met dezelfde dagelijkse hash als de weergaven; een latere keuze vervangt de eerdere.

Toegang
Geen inlog
Status
204

Body

agranted | deniedanalytics_storage
dgranted | deniedad_storage
GET/api/site-script/{key}.js

Het sitescript

Fouten, Web Vitals, formulieren, leads en cookieloze meting in één bestand. Plaats <script src="…/api/site-script/<sleutel>.js" defer></script>.

Toegang
Geen inlog
GET/api/chat-widget.js

Het chatwidget

Plaats <script src="…/api/chat-widget.js?p=<widget-token>" defer></script>. Het widget toont zich alleen met de module Chat aan en vanaf een toegestaan domein.

Toegang
Geen inlog

Queryparameters

p*stringWidget-token uit de instellingen van de chat.
GET/api/chat-widget-home.js

Het startscherm van het chatwidget

Laadt het widget zelf als het project zelfhulp, eigen links of andere contactmogelijkheden gebruikt.

Toegang
Geen inlog
GET/api/chat-widget/{token}/beeld/{kind}

Logo of teamfoto voor het venster

kind: logo (als de kop het logo toont) of team-<id> (alleen bij "voornaam met foto" en alleen van het team van dat project). Anders 404.

Toegang
Geen inlog
POST/api/chat-widget/{token}

Het chatwidget: berichten van de bezoeker

Voor het widget zelf. JSON als text/plain, zodat er geen preflight is. Alleen met een Origin van een domein van het project (of een toegevoegd adres); anders 403 origin_not_allowed. Onbekend token of geen Origin: 404. visitor is een willekeurig id uit de browser (20–64 tekens); Studio bewaart alleen een HMAC daarvan en geen IP-adres. Het veld website is een honeypot. Hooguit 15 berichten per minuut per bezoeker en 10 nieuwe gesprekken per uur per IP.

Toegang
Geen inlog

Body

action*hallo | poll | stuur | gegevens | beoordeel | transcript | nieuw | vergeet | geschiedenis | gesprek | kies | koppel | bevestig | identificeer | uitloggen
visitor*string
sinceintAlleen berichten na dit id.
bodystringBij stuur; hooguit 2.000 tekens.
namestring
emailemail
pageurl
titlestring
typingbool
ratingintBij beoordeel: 1–5, alleen na afsluiten.
websitestringLeeg laten.
topicstringBij een nieuw gesprek: een onderwerp uit de instellingen; wordt een label.
consentboolAkkoord met de privacyverklaring, als het formulier daarom vraagt.
seenintBij poll: het laatste bericht-id dat de bezoeker in het open, zichtbare venster zag; voor "Gelezen" in de inbox. Gaat nooit terug.
routeobject[]Bij het eerste stuur: de pagina's die de bezoeker in het laatste half uur bekeek (p = pad, t = titel, at = tijd in ms), hooguit tien; tot dan bleven ze in zijn browser.
proactivestringDe tekst van het proactieve bericht waarop de bezoeker antwoordt; alleen als die in de regels staat.
idintBij gesprek: een eerder gesprek van dezelfde bezoeker. Bij kies: het bericht met de knoppen.
labelstringBij kies: een van de knoppen onder dat bericht; één keer per bericht, en gaat als bericht van de bezoeker.
codestringBij bevestig: de acht cijfers uit de mail na koppel, alleen geldig in dezelfde browser (visitor), een kwartier en één keer; na vijf foute pogingen vervalt hij. Daarna hangt deze browser aan het adres. Tot 11-10-2026 een link die de aanvrager koppelde aan wie klikte.
user_idstringBij identificeer: het id van de ingelogde gebruiker op de site.
signaturestringBij identificeer: HMAC-SHA256 van user_id met de sleutel uit de chatinstellingen, op de server van de site berekend.
email_signaturestringBij identificeer: HMAC-SHA256 van "user_id|adres" (adres in kleine letters). Alleen dan telt email als bevestigd. uitloggen maakt de koppeling van deze browser ongedaan.
filefileBij stuur als multipart (payload = de JSON hierboven): afbeelding of pdf, hooguit 10 MB, tien per uur.
selfhelpobjectBij een nieuw gesprek: articles (ids die de bezoeker las), searched, unhelpful (id van een artikel met "Nee, hielp niet"). Alleen gepubliceerde artikelen van dit project tellen; het team ziet het als notitie.

Antwoord

enabledbool
configobjectname, color, position, widget (de instellingen van het venster, teksten in beide talen, contactmogelijkheden als link), greeting, buttons (onder de groet), offline_message, prechat, proactive, files, known, status, privacy (null bij white-label zonder eigen verklaring), identify
statusonline | open | gesloten
conversation?objectstatus, name, email, rated, ticket, agent_typing, read (tot welk bericht het team las), files (mag de bezoeker bijlagen sturen), agent (name, initials, photo, of null), queue (plek in de rij zolang het team nog niet antwoordde)
messagesobject[]id, from, body, at, name, files, buttons, choice, faq (id, title van een gepubliceerd artikel)
historyobject[]Bij geschiedenis: id, at, last_at, status, ticket, preview.
errorstringBij 403: files_not_allowed als het team bijlagen niet toestond, closed als het buiten openingstijden alleen zelfhulp is. Bij 422: validation, email, unverified (transcript: eerst het adres bevestigen met koppel/bevestig), code, file (met detail) of prechat (met field: name, email, topic of consent).
GET/api/chat-file/{id}

Bijlage uit de chat

Alleen met de ondertekende URL uit files (expires en signature), een half uur geldig; anders 403. Afbeeldingen inline, een pdf als download, altijd met nosniff.

Toegang
Geen inlog
POST/api/chat-widget/{token}/faq

Het chatwidget: veelgestelde vragen

Voor het widget zelf, met dezelfde herkomstregels als chat-widget/{token}. Alleen gepubliceerde artikelen van dat project; taal eerst die van de pagina, anders alles. Met de module of het widget uit enabled: false. Hooguit 60 verzoeken per minuut per bezoeker.

Toegang
Geen inlog

Body

action*lijst | zoek | categorie | artikel | feedback
qstringBij zoek; hooguit 120 tekens. Zonder resultaat bewaart Studio de term zonder bezoeker, 90 dagen (uit te zetten).
langnl | en
idintBij artikel en feedback.
namestringBij categorie.
helpfulboolBij feedback: "Hielp dit?". Eén stem per artikel per dag per IP-hash.

Antwoord

enabledbool
totalint
resultsobject[]id, title, category, excerpt (bij lijst eerst de uitgelichte)
categoriesobject[]name, count (bij lijst)
articleobjectid, title, category, html, updated_at
POST/api/optin/{formKey}

Aanmelden via een formulier op de site van de klant

JSON of een gewoon HTML-formulier. Stuurt een bevestigingsmail (dubbele opt-in). Het veld website is een honeypot. Hooguit 5 per minuut per bezoeker.

Toegang
Geen inlog

Body (JSON of een HTML-formulier)

email*email
naamstring
toestemming*string1, on, true of ja.
taalnl | enTaal van de aanmelding; zonder die van het formulier.
websitestringLeeg laten.

Antwoord

messagestring
errorstring

Openbaar

Zonder inlog: gedeelde rapporten, statuspagina's, datafeeds en de eigen cijfers op de site.

GET/api/shared

Gedeeld rapport

Toegang
Geen inlog; het geheim zit in het adres

Queryparameters

token*stringUit de deellink.

Antwoord

reportobject
projectstring
sharedbool
expires_atdatetime
brandingobject
GET/api/status

Openbare statuspagina van een project

Toegang
Geen inlog; het geheim zit in het adres

Queryparameters

token*string

Antwoord

namestring
monitorsobject[]name, state, uptime_30d, incidents
maintenanceobject[]
brandingobject
checked_atdatetime
GET/api/public-stats

Totalen over alle workspaces

Voor de marketingsite; niets herleidbaar naar een klant. Een uur gecachet, CORS open.

Toegang
Geen inlog

Antwoord

projectsint
pages_crawledint
advice_givenint
advice_doneint
uptime_checks_30dint
incidents_30dint
updated_atdatetime
GET/api/feed/{token}.csv

Datafeed als CSV

Per dag: datum, gebruikers, sessies, paginaweergaven, conversies, klikken, vertoningen en positie in Google. Voor =IMPORTDATA in Google Sheets.

Toegang
Geen inlog; het geheim zit in het adres

Queryparameters

daysint7 tot 480; standaard 90.
GET/api/openapi.json

Deze referentie als OpenAPI 3.1

Toegang
Geen inlog

Queryparameters

langnl | enStandaard nl.

Intern

Adressen voor diensten waar Studio mee praat. Ze controleren de handtekening van de afzender en zijn niet bedoeld om zelf aan te roepen.

POST/api/ses/sns

Amazon SES via SNS (gedeeld account)

Bounces, klachten en aflevering. Alleen berichten met een geldige SNS-handtekening van het ingestelde topic.

Toegang
Ondertekend door de afzender
POST/api/ses/sns/{token}

Amazon SES via SNS (eigen account van een klant)

Het token wijst het verzendaccount aan, en daarmee het topic. Telt alleen voor verzendingen van dat account.

Toegang
Ondertekend door de afzender
POST/api/resend/webhook

Resend-meldingen (gedeeld account)

Met een geldige Svix-handtekening; tijdstempels van meer dan vijf minuten oud worden geweigerd.

Toegang
Ondertekend door de afzender
POST/api/resend/webhook/{token}

Resend-meldingen (eigen account van een klant)

Toegang
Ondertekend door de afzender
POST/api/support/inbound

Mail naar support (Resend Inbound)

Mail aan <token>@SUPPORT_INBOUND_DOMAIN wordt een ticket, of een antwoord als het onderwerp [#nummer] bevat. Alleen van bekende afzenders van die werkruimte, met de module en mail naar support aan. Met een geldige Svix-handtekening; anders 403. Een genegeerde mail geeft ook 200, met de reden.

Toegang
Ondertekend door de afzender

Antwoord

statusnieuw | antwoord | genegeerd
ticket_idint
reasonstring
POST/api/slack/interactions/{workspace}

Knoppen in Slack-berichten

Ondertekend met het signing secret van de Slack-app.

Toegang
Ondertekend door de afzender
POST/api/mollie/webhook

Betaalstatus van Mollie

Mollie stuurt alleen het betaal-id; Studio haalt de status zelf op bij Mollie, ook terugbetalingen en storneringen. 200 bij een onbekend id, 503 als ophalen bij Mollie mislukt (Mollie probeert het dan opnieuw).

Toegang
Geen inlog