# API-metoder

Komplett referanse for alle REST API-metoder med parametere, eksempler og svar.

## API-metoder

Komplett referanse for alle metoder i Formstep REST API. Hver metode viser parametere, eksempelforespørsler og responsformat.

> ℹ️ **Ett endepunkt, mange metoder**
> <p>
>     Alle metoder er <code>POST https://api.formstep.io/api/v1</code> med en JSON-kropp <code>{`{"method": "...", "params": {...}}`}</code>{' '}
>     og en <code>Authorization: Bearer fb_...</code>-header. Se <a href="/no/developers/overview">API-oversikt</a> for autentisering og
>     feilhåndtering, og <a href="/no/developers/api-tokens">API-tokens</a> for selve tokenet.
>   </p>

<h2 id="conventions">Konvensjoner</h2>

<ul>
  <li>
    <code>params</code> kan utelates; den er som standard <code>{`{}`}</code>. En ukjent metode gir <code>404 METHOD_NOT_FOUND</code>.
  </li>
  <li>
    Et token er bundet til <strong>én arbeidsområde</strong>. Å navngi en annen arbeidsområde, eller et skjema i én, gir{' '}
    <code>403 FORBIDDEN</code>, selv om du tilhører begge.
  </li>
  <li>
    <strong>Paginering.</strong> Listemetoder returnerer <code>{`{ items, nextCursor, hasMore }`}</code>; de fleste returnerer også{' '}
    <code>canPaginate</code>, som er <code>false</code> når <code>hasMore</code> er sann, men ingen markør kan fortsette (uskarpt søk). Send{' '}
    <code>nextCursor</code> tilbake som <code>cursor</code>. <code>limit</code> er 1–100, standard 20 — bortsett fra{' '}
    <code>requests.list</code>, hvis standard er 25.
  </li>
  <li>
    <strong>Hastighetsbegrensninger.</strong> 120 kall per minutt per token, delt med <a href="/no/developers/mcp-server">MCP-serveren</a>;{' '}
    <code>requests.create</code> har sin egen grense på 60 per minutt. Mislykket autentisering begrenses separat, 30 per 15 minutter per IP,
    hvoretter ugyldige tokens ser <code>RATE_LIMITED</code> i stedet for <code>UNAUTHORIZED</code>.
  </li>
  <li>
    <strong>Kroppsstørrelse.</strong> 1 MiB. Større kropper avvises med <code>VALIDATION_ERROR</code>.
  </li>
  <li>
    <strong>Versjonering.</strong> Stien bærer versjonen. Brytende endringer sendes som <code>/api/v2</code>; nye metoder og nye responsfelt
    gjør det ikke.
  </li>
</ul>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="forms">Skjemaer</h2>

{/* ── forms.list ──────────────────────────────────────────────────────────── */}

List opp skjemaer i en arbeidsområde. Støtter markørpaginering og valgfritt uskarpt navnesøk.

  
    Arbeidsområdeens ID.
  
  
    Filtrer etter mappe. Send <code>null</code> for kun skjemaer på rotnivå. Utelat for å liste alle.
  
  
    Uskarpt navnesøk. Resultater begrenses til <code>limit</code>; støtter ikke markørpaginering.
  
  
    Sidestørrelse (1–100).
  
  
    Pagineringsmarkør fra et tidligere svar.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.list",
    "params": { "workspaceId": "ws_abc123" }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "frm_abc123",
        "name": "Contact Form",
        "folderId": null,
        "workspaceId": "ws_abc123",
        "isPublished": true,
        "publishedAt": 1714041851000,
        "unpublishedAt": null,
        "createdAt": 1714041800000,
        "lastEditedAt": 1714042000000,
        "emoji": null
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── forms.get ───────────────────────────────────────────────────────────── */}

Hent fullstendige detaljer for et enkelt skjema, inkludert spørsmål, forsidebilde, logo og en forhåndsvisnings-URL.

  
    Skjemaets ID.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.get",
    "params": { "formId": "frm_abc123" }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Event Feedback",
    "folderId": null,
    "workspaceId": "ws_abc123",
    "isPublished": true,
    "publishedAt": 1714041851000,
    "unpublishedAt": null,
    "createdAt": 1714041800000,
    "lastEditedAt": 1714042000000,
    "emoji": null,
    "questions": [
      {
        "id": "q_1",
        "type": "email-input",
        "inputType": "email",
        "title": "Your email",
        "metadata": null
      },
      {
        "id": "q_2",
        "type": "rating-input",
        "inputType": "rating",
        "title": "Overall experience",
        "metadata": { "kind": "rating", "maxStars": 5 }
      }
    ],
    "hasContent": true,
    "cover": null,
    "logo": null,
    "isDeleted": false,
    "trashedAt": null,
    "previewUrl": "https://formstep.io/preview/abc..."
  }
}
```

  

{/* ── forms.create ────────────────────────────────────────────────────────── */}

Opprett et nytt tomt skjema. Returnerer skjemaet og en forhåndsvisnings-URL.

  
    Skjemaets navn (1–255 tegn).
  
  
    Arbeidsområdeens ID.
  
  
    Plasser skjemaet i en mappe. Utelat for å opprette på arbeidsområdeens rotnivå.
  

  
    
      
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.create",
    "params": {
      "name": "Contact",
      "workspaceId": "ws_abc123"
    }
  }'
```

    
    
      
```
const res = await fetch('https://api.formstep.io/api/v1', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.FORMSTEP_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    method: 'forms.create',
    params: { name: 'Contact', workspaceId: 'ws_abc123' },
  }),
})
const { ok, data } = await res.json()
```

    
    
      
```
import os, requests
res = requests.post(
  "https://api.formstep.io/api/v1",
  headers={"Authorization": f"Bearer {os.environ['FORMSTEP_TOKEN']}"},
  json={
    "method": "forms.create",
    "params": {
      "name": "Contact",
      "workspaceId": "ws_abc123",
    },
  },
)
data = res.json()
```

  

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_new123",
    "name": "Contact",
    "workspaceId": "ws_abc123",
    "folderId": null,
    "isPublished": false,
    "createdAt": 1714041851000,
    "previewUrl": "https://formstep.io/preview/abc..."
  }
}
```

  

{/* ── forms.update ────────────────────────────────────────────────────────── */}

Oppdater skjemametadata: navn, mappe, emoji, forsidebilde eller logo. Oppdaterer ikke skjemainnholdet (bruk redigeringsverktøyene for det).

  
    Skjemaets ID.
  
  
    Nytt skjemanavn (1–255 tegn).
  
  
    Flytt skjemaet til en mappe. Send <code>null</code> for å flytte til arbeidsområdeens rotnivå.
  
  
    Skjemaets emoji (maks 10 tegn). Send <code>null</code> for å fjerne.
  
  
    Forsidebilde. <code>{`{"type": "color", "color": "#ffffff"}`}</code>,{' '}
    <code>{`{"type": "image", "url": "https://...", "offsetY": 50}`}</code> (<code>offsetY</code> 0–100, standard 50), eller{' '}
    <code>{`{"type": "none"}`}</code> for å fjerne. Bilde-URL-er må være <code>http(s)</code> eller en <code>data:image</code>-URI.
  
  
    Logo. <code>{`{"type": "icon", "name": "HeartIcon"}`}</code>, <code>{`{"type": "image", "url": "https://..."}`}</code>, eller{' '}
    <code>{`{"type": "none"}`}</code> for å fjerne. Ikonnavnene er faste: <code>QuestionMarkIcon</code>, <code>ListBulletsIcon</code>,{' '}
    <code>ChartBarIcon</code>, <code>ClockCountdownIcon</code>, <code>HeartIcon</code>, <code>LightbulbIcon</code>,{' '}
    <code>CheckCircleIcon</code>, <code>MagnifyingGlassIcon</code>, <code>TrendUpIcon</code>, <code>EnvelopeIcon</code>,{' '}
    <code>PhoneIcon</code>, <code>CalendarIcon</code>, <code>LinkIcon</code>, <code>UsersIcon</code>.
  

<p>Send minst ett av de fem oppdaterbare feltene. Det endrer ikke skjemainnholdet — bruk MCP-redigeringsverktøyene for det.</p>

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.update",
    "params": {
      "formId": "frm_abc123",
      "name": "Updated Name",
      "emoji": "📋"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Updated Name",
    "folderId": null,
    "emoji": "📋"
  }
}
```

  

<p>
  <code>cover</code> og <code>logo</code> kommer bare tilbake når du sendte dem. En nyttelast som matchet gjeldende tilstand på hvert
  skalarfelt legger til <code>noChange: true</code>.
</p>

{/* ── forms.publish ───────────────────────────────────────────────────────── */}

Publiser et skjema slik at det kan motta svar, og fryser [feltnøklene](/no/requests/field-keys) i et nytt øyeblikksbilde. Idempotent: et
allerede publisert skjema returnerer suksess med `alreadyPublished: true`, og et upublisert skjema publiseres på nytt fra sitt siste
øyeblikksbilde.

  
    Skjemaets ID.
  

<p>
  Et skjema med innholdsblokker, men ingen spørsmål, publiseres med en advarsel. Et skjema uten noe innhold i det hele tatt kan ikke
  publiseres. Publisering oppretter ikke en offentlig URL — kall <a href="#share-links-create">shareLinks.create</a> for det.
</p>

{/* ── forms.unpublish ─────────────────────────────────────────────────────── */}

Ta et skjema offline. Respondenter kan ikke lenger åpne det. Idempotent — et skjema som ikke er publisert returnerer
`alreadyUnpublished: true`. Reversibelt med `forms.publish`.

  
    Skjemaets ID.
  

{/* ── forms.delete ────────────────────────────────────────────────────────── */}

Flytt et skjema til papirkurven. De aktive delingslenkene tilbakekalles, slik at de offentlige URL-ene slutter å fungere.

  
    Skjemaets ID.
  

> ⚠️ **Gjenoppretting bringer ikke lenkene tilbake**
> <p>
>     <code>forms.restore</code> returnerer skjemaet, men delingslenkene det tilbakekalte forblir tilbakekalt. Lag nye med{' '}
>     <code>shareLinks.create</code>. Et skjema som allerede er i papirkurven returnerer <code>alreadyTrashed: true</code> og beholder sin
>     opprinnelige papirkurv-dato.
>   </p>

{/* ── forms.restore ───────────────────────────────────────────────────────── */}

Gjenopprett et skjema fra papirkurven.

  
    Skjemaets ID.
  
  
    Hvor det skal gjenopprettes. Utelat for den opprinnelige mappen, <code>null</code> for arbeidsområdeens rotnivå, eller en mappe-ID.
  

<p>
  Et skjema som ikke er i papirkurven returnerer <code>alreadyRestored: true</code>.
</p>

{/* ── formSettings.get ────────────────────────────────────────────────────── */}

Les et skjemas atferdsinnstillinger.

  
    Skjemaets ID.
  

<p>
  Returnerer <code>{`{ settings, isDefault, availableEmailDomains, defaultFromAddress, payment }`}</code>. <code>isDefault</code> er sann
  når skjemaet ennå ikke har en lagret innstillingsrad, og du ser standardverdiene. <code>availableEmailDomains</code> inneholder ID-ene til
  de verifiserte domenene du kan sende som <code>emailDomainId</code>, og <code>payment</code> forteller om Stripe er tilkoblet (å koble det
  til er et steg i dashbordet).
</p>

{/* ── formSettings.update ─────────────────────────────────────────────────── */}

Oppdater et skjemas atferdsinnstillinger. En delvis oppdatering: bare feltene du sender, skrives.

  
    Skjemaets ID.
  
  
    <code>language</code> (BCP-47, standard <code>"en"</code>), <code>requireAuthentication</code>, <code>showBranding</code>,{' '}
    <code>captchaEnabled</code>, <code>passwordEnabled</code>, <code>password</code> (4 tegn eller mer; en streng innebærer{' '}
    <code>passwordEnabled: true</code>, <code>null</code> fjerner sperren).
  
  
    <code>notifyOnSubmission</code>, <code>notificationEmails</code> (array), <code>selfNotificationSubject</code>,{' '}
    <code>selfNotificationEmailBody</code>, <code>pdfGenerationEnabled</code>, <code>showViewSubmissionButton</code>. E-poster til eieren er
    ikke oversettbare — skriv dem på språket du vil ha.
  
  
    <code>respondentNotificationEnabled</code>, <code>respondentNotificationTo</code> (felt-IDen til et e-postspørsmål, eller{' '}
    <code>null</code>), <code>respondentNotificationSubject</code>, <code>respondentNotificationBody</code>,{' '}
    <code>respondentNotificationPdfEnabled</code>.
  
  
    <code>respondentReminderEnabled</code>, <code>respondentReminderTo</code>, <code>respondentReminderSubject</code>,{' '}
    <code>respondentReminderBody</code>, <code>respondentReminderRequiredFieldIds</code>, og <code>reminderSteps</code> — inaktivitets-
    intervaller som <code>["1d","3d","1w"]</code>, maks 5, sortert og deduplisert ved lagring, <code>[]</code> for ingen. Planen gjelder
    både for forlatte offentlig-lenke-svar og for forespørsler. Pro.
  
  
    <code>redirectUrl</code> (<code>http(s)</code>; <code>null</code> eller <code>""</code> fjerner), <code>redirectQueryParams</code> (
    <code>{`[{ paramName, fieldId }]`}</code>), <code>allowAnotherResponse</code> (gjensidig utelukkende med en omdirigering),{' '}
    <code>maxSubmissionsPerRespondent</code> (0 = ubegrenset, maks 1000), <code>editAfterSubmit</code>, <code>maxEdits</code> (maks 3; 0
    betyr ubegrenset på Pro og Business, 3 på Free).
  
  
    <code>draftRetentionDays</code> og <code>submissionRetentionDays</code> (0–36500, <code>null</code> går tilbake til standard).
    Innsendingsoppbevaring er Business, og å sette den fjerner enhver fast slettedato konfigurert i skjemaverktøyet.
  
  
    En verifisert e-postdomene-ID fra <code>formSettings.get</code>, for en egendefinert Fra-adresse. <code>null</code> tilbakestiller til
    standardavsenderen.
  

<p>
  Emner og meldingstekster er ren tekst og godtar <code>{`{{variable}}`}</code>-plassholdere; linjeskift blir avsnitt. Å tilpasse et
  respondent-emne eller en respondent-melding gjør den oversettbar, så nøklene dukker opp i <code>translations.listEntries</code> med én
  gang.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="submissions" class="border-t border-border pt-8">
  Innsendinger
</h2>

{/* ── submissions.list ────────────────────────────────────────────────────── */}

List opp et skjemas innsendinger, nyeste side først, med markørpaginering.

  
    Skjemaets ID.
  
  
    Inkluder svar som ble påbegynt, men aldri sendt inn. Kladder er en Pro-funksjon: på Gratis listes bare fullførte innsendinger.
  
  
    Legg ved lagrede AI-oversettelser av svarene under <code>items[].translation.display</code>, nøkkelsatt som <code>display</code>.{' '}
    <code>items[].answers</code> og <code>items[].display</code> forblir alltid originalen.
  
  
    Sidestørrelse (1–100).
  
  
    Pagineringsmarkør fra et tidligere svar.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "formName": "Event Feedback",
    "items": [
      {
        "id": "sub_xyz789",
        "submittedAt": "2026-05-18 18:02:28",
        "isCompleted": true,
        "createdAt": "2026-05-18 18:02:19",
        "answers": {
          "email": "user@example.com",
          "plan": "pro",
          "contacts": [{ "name": "Ada" }, { "name": "Grace" }]
        },
        "display": {
          "email": "user@example.com",
          "plan": "Pro",
          "contacts": "Ada, Grace"
        }
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

> ℹ️ **Samme svar som webhooks og callbacks**
> <p>
>     Hvert element bærer <code>answers</code> nøkkelsatt etter <a href="/no/requests/field-keys">feltnøkkel</a> og <code>display</code> med
>     de samme nøklene som lesbar tekst — samme form som en <a href="/no/developers/webhooks-reference">webhook-nyttelast</a>, en{' '}
>     <a href="/no/requests/callbacks">forespørsel-callback</a> og <code>requests.get</code> bærer. Et valgsvar er sin valgnøkkel, en
>     gjentakende gruppe et array av instanser. Kall <code>fields.list</code> for tittelen og valgetikettene til hver nøkkel. Denne metoden
>     returnerer ingen totaler.
>   </p>

{/* ── submissions.pdf ─────────────────────────────────────────────────────── */}

Hent en lenke til én innsendings PDF. Bygget for Zapier-kobleren: den returnerer et resultat bare når skjemaet har en aktiv
Zapier-integrasjon konfigurert til å inkludere PDF-en, og PDF-en ble beholdt.

  
    Skjemaets ID.
  
  
    Innsendingens ID. Må tilhøre det skjemaet og være fullført.
  

  
    
```
{
  "ok": true,
  "data": {
    "url": "https://api.formstep.io/api/storage/...",
    "filename": "formstep-submission-sub_xyz789.pdf",
    "contentType": "application/pdf",
    "byteLength": 148213
  }
}
```

  

{/* ── submissions.sample ──────────────────────────────────────────────────── */}

Bygg en syntetisk eksempel-nyttelast for et skjema, uten ekte data. Det er nøyaktig samme form som en webhook-leveranse for en
delelenke-innsending bærer, så koblere bruker den til feltoppdagelse; en innsending som stammer fra en forespørsel når i stedet et
abonnement som <code>request.completed</code>, samplet av{' '}

<a href="#requests-sample">requests.sample</a>. <code>data.form.snapshotId</code> er skjemaets gjeldende publiserte versjon, samme id som
live-hendelser bærer, eller <code>null</code> mens skjemaet er upublisert.

  
    Skjemaets ID.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "submission.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}
```

  

<p>
  Felt- og nyttelastsemantikk er dokumentert ett sted, i <a href="/no/developers/webhooks-reference#payload">webhooks-referansen</a>.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="share-links" class="border-t border-border pt-8">
  Delelenker
</h2>

{/* ── shareLinks.list ─────────────────────────────────────────────────────── */}

List opp delelenker for et skjema.

  
    Skjemaets ID.
  
  
    Inkluder tilbakekalte lenker i resultatet.
  
  
    Sidestørrelse (1–100).
  
  
    Pagineringsmarkør.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "sl_abc123",
        "code": "RPjNes52",
        "url": "https://formstep.io/RPjNes52",
        "customDomainUrl": null,
        "formId": "frm_abc123",
        "createdAt": 1714041851000,
        "expiresAt": null,
        "maxClaims": null,
        "claimedCount": 7,
        "isRevoked": false,
        "revokedAt": null,
        "customDomainId": null,
        "customSlug": null
      }
    ],
    "availableCustomDomains": [],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── shareLinks.create ───────────────────────────────────────────────────── */}

Opprett en delelenke for et skjema. Skjemaet må være publisert først.

  
    Skjemaets ID. Et skjema som er upublisert, eller som ble publisert og deretter avpublisert, avvises — kall <code>forms.publish</code>{' '}
    først.
  
  
    Utløpstidspunkt som et fremtidig Unix-tidsstempel i millisekunder. I motsetning til ved oppdatering godtas ikke <code>0</code> her.
  
  
    Maksimalt antall ganger denne lenken kan brukes. Må være positiv; bruk <code>shareLinks.update</code> for å fjerne den senere.
  

<p>
  Svaret er delelenken (samme form som et element fra <code>shareLinks.list</code>) pluss <code>availableCustomDomains</code>, slik at du
  kan følge opp med <code>shareLinks.update</code> for å knytte til ett.
</p>

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "shareLinks.create",
    "params": {
      "formId": "frm_abc123",
      "maxClaims": 100
    }
  }'
```

{/* ── shareLinks.update ───────────────────────────────────────────────────── */}

Oppdater en delelenke. Du kan endre utløpstidspunkt, maks bruk, egendefinert domene, slug, eller trekke tilbake lenken.

  
    Delelenke-ID.
  
  
    Nytt utløpstidsstempel i millisekunder. Send <code>0</code> for å fjerne utløpet.
  
  
    Nytt maks bruk. Send <code>-1</code> for å fjerne grensen.
  
  
    Knytt til et egendefinert domene. Send <code>null</code> for å fjerne tilknytningen.
  
  
    Egendefinert URL-slug (3–64 tegn, små bokstaver, alfanumerisk og bindestreker). Påkrevd sammen med <code>customDomainId</code>; send
    begge <code>null</code> for å fjerne tilknytningen. <code>login</code>, <code>auth-callback</code>, <code>preview</code>,{' '}
    <code>payment</code>, <code>api</code>, <code>admin</code> og <code>health</code> er reserverte.
  
  
    Sett til <code>true</code> for å permanent trekke tilbake lenken. Kan ikke kombineres med andre felt, og kan ikke angres — dette er den
    eneste sletteveien for en delelenke.
  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="fields" class="border-t border-border pt-8">
  Felt
</h2>

{/* ── fields.list ─────────────────────────────────────────────────────────── */}

List opp hvert felt i et skjemas nåværende publiserte versjon, med nøkkelen du adresserer det med. Kall denne før `requests.create` i
stedet for å hardkode nøkler. Se [Feltnøkler](/no/requests/field-keys).

  
    Skjema-ID. Et skjema som aldri har blitt publisert, har ingen feltnøkler ennå og svarer med <code>published: false</code> uten
    elementer.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "fields.list",
    "params": { "formId": "j57..." }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "published": true,
    "items": [
      { "key": "company_name", "type": "text", "title": "Company", "required": true, "prefillable": true },
      {
        "key": "company_size", "type": "select", "title": "Company size", "required": false, "prefillable": true,
        "options": [
          { "key": "1_50", "label": "1–50" },
          { "key": "51_200", "label": "51–200" }
        ]
      },
      {
        "key": "satisfaction", "type": "matrix", "title": "How did we do?", "required": false, "prefillable": true,
        "rows": [{ "key": "delivery_speed", "label": "Delivery speed" }],
        "columns": [{ "key": "very_good", "label": "Very good" }, { "key": "poor", "label": "Poor" }]
      },
      { "key": "case_id", "type": "hidden", "title": "Case", "required": false, "prefillable": false, "context": true },
      { "key": "total", "type": "number", "title": "Total", "required": false, "prefillable": false, "calculated": true }
    ],
    "hasMore": false
  }
}
```

  

> ℹ️ **Å lese flaggene**
> <p>
>     <code>context: true</code> merker et skjult felt — verdien hører hjemme i <code>context</code>, aldri i <code>prefill</code>.{' '}
>     <code>prefillable: false</code> merker et felt ingen kan oppgi en verdi for (fil, signatur, betaling, avtalebooking, dokumenter). For et
>     valgspørsmål, send alternativets <strong>nøkkel</strong>, ikke etiketten; en matrise lister <code>rows</code> og <code>columns</code> på
>     samme måte, og tar <code>{'{ "row_key": "column_key" }'}</code>. <code>calculated: true</code> merker et beregnet felt: skjemaet regner
>     ut verdien, du leser den tilbake i <code>answers</code>, og ingenting kan sende den.
>   </p>

<p>
  En gjentakende gruppe er <code>type: "group"</code> med <code>repeating: true</code> og en <code>members</code>-array. En dokumentblokk er{' '}
  <code>type: "documents"</code> og bærer <code>documents: [{`{ name }`}]</code>, de faste filene enhver respondent allerede ser.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="requests" class="border-t border-border pt-8">
  Forespørsler
</h2>

En forespørsel tildeler ett publisert skjema til én person og kaller deg tilbake når den avsluttes. Den begrepsmessige guiden finnes i
[Opprette en forespørsel](/no/requests/creating-requests); dette er parameterlisten.

{/* ── requests.create ─────────────────────────────────────────────────────── */}

Opprett en forespørsel. Bruker én enhet av arbeidsområdens månedlige kvote, uansett om mottakeren svarer eller ikke.

  
    Det publiserte skjemaet som skal tildeles.
  
  
    <code>{`{ email?, name? }`}</code>. En e-post kreves når <code>delivery</code> er <code>"email"</code>; ellers identifiserer den bare
    personen på Forespørsler-siden og på svarene deres.
  
  
    Startsvar etter feltnøkkel. Mottakeren ser dem og kan endre dem.
  
  
    Forhåndsutfylte nøkler mottakeren ikke kan endre. Hver nøkkel her må også finnes i <code>prefill</code>, og et låst, obligatorisk felt
    må forhåndsutfylles med en verdi som ikke er tom.
  
  
    Verdier for skjemaets skjulte felt, etter feltnøkkel. Tiltrodd, uendelig, og gjentatt tilbake i callbacken. En ukjent nøkkel avvises med{' '}
    <code>UNKNOWN_FIELD_KEY</code>.
  
  
    Din egen bokføring. Når aldri skjemaet; kommer tilbake i callbacks og avlesninger.
  
  
    Ett av skjemaets publiserte språk. Standard er skjemaets eget standardspråk.
  
  
    <code>"email"</code> for å la Formstep sende invitasjonen (krever en mottaker-e-post, og Pro eller Business eller en av de 10 gratis
    invitasjonene til en Gratis-konto), eller <code>"none"</code> for å levere lenken selv.
  
  
    Overstyrer skjemaets påminnelsesplan for denne forespørselen. En tom array slår av påminnelser.
  
  
    Epoke-millisekunder. Standard er 30 dager frem; 365 dager er maksimum.
  
  
    Hvor Formstep POST-er callbacken når forespørselen avsluttes. Kun HTTPS, og verten må løses til en offentlig adresse.
  
  
    Din egen ID for denne forespørselen. Kan filtreres på i <code>requests.list</code>.
  
  
    Gjentar du den med samme body, får du den opprinnelige forespørselen tilbake med <code>deduplicated: true</code>. En annen body avvises.
    Nøkler lever i 30 dager.
  
  
    Utsted lenken på ett av dine egendefinerte domener. Kun REST API.
  
  
    <code>{`[{ documentId, field?, name? }]`}</code> — filer gitt til denne ene mottakeren, lastet opp først med{' '}
    <a href="#documents-create">documents.create</a>.
  
  
    En tørrkjøring: ingenting sendes på e-post, callbacken bærer <code>"test": true</code>, og innsendingen teller ingen steder. Lenken
    lukkes innen 24 timer, og på Free kan et workspace opprette 10 testforespørsler per dag.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "requests.create",
    "params": {
      "formId": "j57...",
      "recipient": { "email": "ada@acme.com", "name": "Ada" },
      "prefill": { "company_name": "Acme" },
      "readonly": ["company_name"],
      "context": { "case_id": "CASE-9" },
      "delivery": "email",
      "externalId": "run-42",
      "callbackUrl": "https://automation.example/webhook/resume-abc",
      "idempotencyKey": "run-42"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "status": "pending",
    "url": "https://form.formstep.io/r/rq_...",
    "deliveryStatus": "queued",
    "expiresAt": 1794787200000,
    "createdAt": 1789379200000,
    "externalId": "run-42",
    "deduplicated": false
  }
}
```

  

> ⚠️ **Ta vare på url**
> <p>
>     <code>url</code> bærer engangstokenet. <code>requests.get</code> kan vanligvis bygge den opp igjen, men den kommer tilbake som{' '}
>     <code>null</code> for en forespørsel opprettet før driftsmiljøet hadde en forespørsel-token-nøkkel. Leverer du lenken selv, lagre den
>     når du oppretter den.
>   </p>

<p>
  <code>deliveryStatus</code> er <code>not_requested</code> til en invitasjon er satt i kø, deretter <code>queued</code> → <code>sent</code>{' '}
  eller <code>failed</code>, og <code>bounced</code> når e-postleverandøren rapporterer en hard retur eller en klage.
</p>

{/* ── requests.get ────────────────────────────────────────────────────────── */}

Hent én forespørsel i sin helhet: status, utfall, hva som ble forhåndsutfylt, tidslinjen, og — når fullført — <code>answers</code> og <code>display</code> etter feltnøkkel, de samme to kartene callbacken bærer.

  
    Forespørsels-ID.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "formId": "j57...",
    "status": "completed",
    "outcome": "approve",
    "isTest": false,
    "recipient": { "email": "ada@acme.com", "name": "Ada" },
    "language": "en",
    "externalId": "run-42",
    "metadata": null,
    "context": { "case_id": "CASE-9" },
    "prefill": { "company_name": "Acme" },
    "readonlyKeys": ["company_name"],
    "delivery": "email",
    "deliveryStatus": "sent",
    "hasCallback": true,
    "callbackFailedAt": null,
    "submissionId": "kp2...",
    "url": "https://form.formstep.io/r/rq_...",
    "answers": { "company_name": "Acme", "decision": "approve" },
    "display": { "company_name": "Acme", "decision": "Approve" },
    "timeline": [
      { "id": "kd7...:created", "type": "created", "at": 1789379200000 },
      { "id": "kd7...:completed", "type": "completed", "at": 1789465600000 }
    ],
    "expiresAt": 1794787200000,
    "completedAt": 1789465600000
  }
}
```

  

> ℹ️ **outcome vs status**
> <p>
>     <code>status</code> sier om forespørselen ble fullført; <code>outcome</code> sier hva mottakeren bestemte — <code>approve</code>,{' '}
>     <code>decline</code>, <code>changes</code>, eller <code>null</code> på alt annet enn en fullført forespørsel der mottakeren valgte én av
>     de tre — inkludert et skjema uten <a href="/no/requests/decisions-and-approvals">beslutningsspørsmål</a>. Selve callback-URL-en
>     returneres aldri; <code>hasCallback</code> sier bare om én er satt.
>   </p>

<p>
  Eksempelet ovenfor er forkortet. Et fullstendig svar bærer også <code>workspaceId</code>, <code>formSnapshotId</code>,{' '}
  <code>createdVia</code>, <code>documents</code>, <code>reminderStep</code>, <code>remindersSent</code>, <code>reminderDueAt</code>,{' '}
  <code>dataPurgedAt</code>, og resten av tidsstemplene (<code>updatedAt</code>, <code>openedAt</code>, <code>startedAt</code>,{' '}
  <code>lastActivityAt</code>, <code>expiredAt</code>, <code>canceledAt</code>, <code>canceledBy</code>, <code>cancelReason</code>).
</p>
<p>
  To felt forteller deg når kopien foran deg er den eneste kopien. <code>callbackFailedAt</code> er satt mens denne forespørselens callback
  har gått tom for forsøk, og fjernes så snart ett kommer gjennom eller du spiller det av på nytt. <code>dataPurgedAt</code> settes når
  oppbevaringspolicyen har fjernet forespørselen: <code>context</code>, <code>prefill</code> og <code>metadata</code> kommer tilbake tomme,{' '}
  <code>readonlyKeys</code> og <code>documents</code> er <code>[]</code>, og <code>submissionId</code>, <code>answers</code> og{' '}
  <code>display</code> er <code>null</code>.
</p>
<p>
  <code>timeline</code> er utledet, eldste først. Hver oppføring har en <code>id</code>, en <code>at</code>, og en <code>type</code> —{' '}
  <code>created</code>, <code>invitation</code>, <code>reminder</code>, <code>opened</code>, <code>started</code>, <code>completed</code>,{' '}
  <code>expired</code>, <code>canceled</code>, <code>callback</code>. Leveringsoppføringer legger til <code>deliveryStatus</code> og{' '}
  <code>attemptCount</code>, og callbacks legger til <code>eventType</code>. Leveringsrader beholdes i 30 dager, så eldre tidslinjer tynnes
  tilbake til tidsstemplene.
</p>

{/* ── requests.list ───────────────────────────────────────────────────────── */}

List forespørsler i en arbeidsområde eller på ett skjema, nyeste først. Testforespørsler utelates med mindre du ber om dem.

  
    Avgrens til en arbeidsområde. Oppgi denne eller <code>formId</code>.
  
  
    Avgrens til ett skjema.
  
  
    <code>pending</code>, <code>completed</code>, <code>expired</code>, eller <code>canceled</code>.
  
  
    <code>approve</code>, <code>decline</code>, eller <code>changes</code>. Antyder fullførte forespørsler kun.
  
  
    Din egen ID, for å finne forespørselen en kjøring opprettet.
  
  
    Inkluder forespørsler opprettet med <code>test: true</code>.
  
  
    Sidestørrelse (1–100).
  
  
    Pagineringsmarkør fra et tidligere svar.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "kd7...",
        "formId": "j57...",
        "status": "pending",
        "outcome": null,
        "recipient": { "email": "ada@acme.com", "name": "Ada" },
        "externalId": "run-42",
        "deliveryStatus": "sent",
        "expiresAt": 1794787200000,
        "createdAt": 1789379200000
      }
    ],
    "nextCursor": null,
    "hasMore": false
  }
}
```

  

<p>
  Elementer i listen har de samme feltene som <code>requests.get</code> minus <code>url</code>, <code>answers</code>, <code>display</code>,
  og <code>timeline</code>, og hver har <code>isTest</code>. Oppgi <code>workspaceId</code> eller <code>formId</code> — ingen av dem gir{' '}
  <code>400 VALIDATION_ERROR</code> med årsak <code>SCOPE_REQUIRED</code>. <code>outcome</code> overstyrer <code>status</code>, siden bare
  en fullført forespørsel har en avgjørelse.
</p>

{/* ── requests.cancel ─────────────────────────────────────────────────────── */}

Trekk tilbake en ventende forespørsel. Lenken slutter å fungere, mottakeren ser en melding om at den er trukket tilbake, og en
`request.canceled`-callback utløses.

  
    Forespørsels-ID.
  
  
    Ditt notat om hvorfor, beholdt på forespørselen og sendt i callbacken.
  

{/* ── requests.remind ─────────────────────────────────────────────────────── */}

Send e-post til mottakeren nå, uten å røre påminnelsesplanen. Krever en mottaker-e-post og en Pro- eller Business-plan.

  
    Forespørsels-ID. Må fortsatt være ventende, og ikke en testforespørsel.
  

<p>
  To grenser gjelder: minst 10 minutter mellom manuelle påminnelser, og maks 8 påminnelser per forespørsel totalt, manuelle og planlagte til
  sammen. Den automatiske planen røres ikke — <code>reminderStep</code> og <code>reminderDueAt</code> forblir der de var.
</p>

{/* ── requests.replayCallback ─────────────────────────────────────────────── */}

Send på nytt callbacken en forespørsel utløste da den avsluttet — samme nyttelast, samme hendelses-ID, slik at en mottaker som allerede
håndterte den kan avduplisere. Bruk den etter å ha fikset et ødelagt endepunkt.

  
    Forespørsels-ID. Må være fullført, utløpt, eller kansellert.
  

  
    
```
{
  "ok": true,
  "data": { "dispatchId": "kf9...", "eventId": "evt_kf9..." }
}
```

  

{/* ── requests.sample ─────────────────────────────────────────────────────── */}

Bygg en syntetisk eksempel-forespørselshendelse for et skjema, uten noen ekte forespørsel. Det er nøyaktig samme konvolutt et <code>request\_\*</code>-abonnement
opprettet med <a href="#webhooks-create">webhooks.create</a> mottar, så koblere bruker den til feltoppdagelse. En fullført eksempelhendelse
bærer de samme eksempelsvarene <a href="#submissions-sample">submissions.sample</a> viser; en utløpt eller kansellert eksempelhendelse
bærer bare request-blokken.

  
    Skjemaets ID.
  
  
    Hvilken avslutning som skal vises som eksempel, i <code>webhooks.create</code>-stavemåten. Konvoluttens <code>type</code> er den
    punktum-delte formen.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "request.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "request": {
        "id": "req_example000000000000",
        "externalId": "order-1234",
        "status": "completed",
        "language": "en",
        "recipient": { "email": "recipient@example.com", "name": "Sample Recipient" },
        "metadata": { "source": "sample" },
        "context": {},
        "createdAt": "2026-05-18T18:00:00.000Z",
        "completedAt": "2026-05-18T19:00:00.000Z"
      },
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}
```

  

<p>
  Request-blokken og utfallet er dokumentert på <a href="/no/requests/callbacks#payload">callbacks-siden</a>; innsendings-halvparten på{' '}
  <a href="/no/developers/webhooks-reference#payload">webhooks-referansen</a>. Eksempel-IDene er de faste plassholderne vist ovenfor, og{' '}
  <code>test</code> er <code>true</code>, slik at en mottaker kan skille et eksempel fra en ekte hendelse.
</p>

{/* ── documents.create ────────────────────────────────────────────────────── */}

Reserver en opplasting for en fil du skal gi til én mottaker gjennom skjemaets [dokumentblokk](/no/building-forms/documents-block). Bytene
reiser aldri gjennom dette API-et: du får en forhåndssignert `PUT`, du laster opp, og `requests.create` verifiserer objektet før
forespørselen finnes.

  
    Skjemaet hvis dokumentblokk skal vise filen. Avgrenser opplastingen til den arbeidsområden.
  
  
    Visningsnavnet mottakeren ser (1–200 tegn). Kan overstyres per forespørsel.
  
  
    <code>application/pdf</code> eller en bildetype: <code>image/png</code>, <code>image/jpeg</code>, <code>image/webp</code>,{' '}
    <code>image/gif</code>, <code>image/svg+xml</code>, <code>image/avif</code>, <code>image/bmp</code>, <code>image/tiff</code>.
    Office-dokumenter godtas ikke.
  
  
    Eksakt byte-lengde. Maksimalt 25 MB (26 214 400).
  
  
    Hex-sammendrag av bytene. Verifiseres etter opplasting når det er oppgitt.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "kn7...",
    "name": "Lease contract draft",
    "contentType": "application/pdf",
    "size": 412000,
    "uploadUrl": "https://...",
    "expiresAt": 1792198800000
  }
}
```

  

<p>
  <code>PUT</code> de rå bytene til <code>uploadUrl</code> innen timen, med <code>Content-Type</code> satt til typen du oppga, og referer
  deretter ID-en fra <code>requests.create</code>:
</p>

```
{
  "method": "requests.create",
  "params": {
    "formId": "j57...",
    "documents": [
      { "documentId": "kn7...", "name": "Your lease contract" },
      { "documentId": "kn8...", "field": "attachments" }
    ]
  }
}
```

<ul>
  <li>
    <code>field</code> er dokumentblokkens feltnøkkel. Valgfri når skjemaet har nøyaktig én blokk; påkrevd med to eller flere.
  </li>
  <li>Blokkens faste dokumenter blir stående; dine dukker opp under dem, for denne ene mottakeren.</li>
  <li>Grenser: 25 MB per dokument, 100 MB dokumenter per forespørsel, 20 dokumenter vist per blokk inkludert de faste.</li>
  <li>
    Én opplasting kan refereres av et hvilket som helst antall forespørsler. En opplasting ingen refererer, går ut på dato. Bytene teller
    mot arbeidsområdeeierens lagring til den siste forespørselen som refererer dem, fjernes av oppbevaringspolicyen.
  </li>
</ul>

<p>
  Enhver feil her er <code>400 VALIDATION_ERROR</code> med en <code>details.reason</code>: <code>DOCUMENT_TYPE_NOT_ALLOWED</code>,{' '}
  <code>DOCUMENT_TOO_LARGE</code>, <code>INVALID_DOCUMENT_NAME</code> eller <code>INVALID_DOCUMENT_SHA256</code> fra denne metoden, og{' '}
  <code>DOCUMENT_NOT_FOUND</code>, <code>DOCUMENT_NOT_UPLOADED</code> (du hoppet over <code>PUT</code>), <code>DOCUMENT_INVALID</code>,{' '}
  <code>INVALID_DOCUMENT_TARGET</code>, <code>DOCUMENTS_TOO_LARGE</code> eller <code>DOCUMENTS_TOO_MANY</code> fra{' '}
  <code>requests.create</code>.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="webhooks" class="border-t border-border pt-8">
  Webhooks
</h2>

{/* ── webhooks.list ───────────────────────────────────────────────────────── */}

List opp webhook-abonnementer for et skjema.

  
    Skjemaets ID.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "subscriptionId": "int_abc123",
        "formId": "frm_abc123",
        "provider": "zapier",
        "targetUrl": "https://hooks.zapier.com/...",
        "eventType": "submission_created",
        "status": "active",
        "createdAt": 1714041851000
      }
    ],
    "hasMore": false
  }
}
```

  

{/* ── webhooks.create ─────────────────────────────────────────────────────── */}

Abonner en URL på skjemahendelser: nye eller forlatte innsendinger, eller at en forespørsel på skjemaet avsluttes. URL-en må bruke HTTPS.

  
    Skjemaets ID.
  
  
    HTTPS-URL som mottar webhook-nyttelast.
  
  
    Hvilket verktøy abonnementet hører til. Det er en etikett for din egen bokføring — det finnes ingen markedsplass-app å installere, og
    alle leverandører oppfører seg likt.
  
  
    Hendelsestype å abonnere på. De tre <code>submission_*</code>-typene leverer innsendings-nyttelasten: <code>submission_created</code> en
    første innsending, <code>submission_updated</code> en respondents redigering, og <code>submission_abandoned</code> et forlatt utkast. De
    tre <code>request_*</code> -typene leverer den tilhørende <a href="/no/requests/callbacks#payload">forespørselshendelsen</a> når en
    forespørsel på skjemaet avsluttes på den måten, signert med dette abonnementets hemmelighet; testforespørsler når ikke noe abonnement.
  
  
    Påkrevd når <code>eventType</code> er <code>submission_abandoned</code>; avvist for alle andre typer.
  
  
    Valgfri HMAC-signeringsnøkkel, 32–255 tegn. Når den er oppgitt, inkluderer leveranser <code>X-Formstep-Signature</code>. Nøkkelen
    lagres, men returneres aldri av API-et.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "webhooks.create",
    "params": {
      "formId": "frm_abc123",
      "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
      "provider": "zapier",
      "eventType": "submission_created",
      "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "subscriptionId": "int_new123",
    "formId": "frm_abc123",
    "provider": "zapier",
    "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
    "eventType": "submission_created"
  }
}
```

  

<p>
  Abonnementer på forlatte innsendinger returnerer det valgte <code>idleWindow</code> fra både <code>webhooks.create</code> og{' '}
  <code>webhooks.list</code>. Alle andre abonnementer utelater det.
</p>

<p>
  Et forespørsel-abonnement hører de samme hendelsene som en <a href="/no/requests/callbacks">callback</a> gjør, men som sin egen leveranse:
  sin egen hendelses-ID, sin egen signatur, og sitt eget forsøksbudsjett på fem forsøk, hvoretter abonnementet pauses. En forespørsel
  opprettet med en <code>callbackUrl</code> på et skjema med et <code>request_completed</code>-abonnement utløses derfor to ganger, én gang
  til hver mottaker. <code>requests.replayCallback</code> sender bare callbacken på nytt. Bruk{' '}
  <a href="#requests-sample">requests.sample</a> for å se nyttelasten før noen forespørsel har avsluttet.
</p>

{/* ── webhooks.delete ─────────────────────────────────────────────────────── */}

Fjern et webhook-abonnement.

  
    Abonnements-ID fra <code>webhooks.list</code> eller <code>webhooks.create</code>.
  

  
    
```
{
  "ok": true,
  "data": {
    "subscriptionId": "int_abc123",
    "deleted": true
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="analytics" class="border-t border-border pt-8">
  Analyse
</h2>

{/* ── analytics.get ───────────────────────────────────────────────────────── */}

Hent aggregerte analysemålinger for et skjema. Støtter filtrering på datoperiode, enhet, trafikkilde og land.

Analyser er en Pro-funksjon, og regelen følger planen til **eieren** av arbeidsområdet, på samme måte som Analyse-fanen i dashbordet. Er ikke eieren på Pro, svarer kallet `UPGRADE_REQUIRED` — også for historikk som ble registrert mens eieren var det. Et Free-medlem i arbeidsområdet til en Pro-eier får dataene.

  
    Skjemaets ID.
  
  
    Start på datoperiode som Unix-tidsstempel i millisekunder. Må være mindre enn eller lik <code>to</code> når begge er satt.
  
  
    Slutt på datoperiode som Unix-tidsstempel i millisekunder. Utelat begge for hele historikken — <code>period</code> kommer da tilbake som{' '}
    <code>{`{ "from": null, "to": null }`}</code>.
  
  
    Filtrer etter enhetstype.
  
  
    Filtrer etter trafikkilde (f.eks. <code>"Direct"</code>, <code>"Google"</code>).
  
  
    Filtrer etter tobokstavs landkode (f.eks. <code>"US"</code>, <code>"DE"</code>).
  
  
    Returner også de sanerte analysehendelsene bak målingene, for din egen analyse. Ingen besøkende-IDer.
  

<p>
  Rater er tall fra 0 til 100, antall er heltall, og <code>totalEvents</code> er det rå antallet hendelsesrader før deduplisering til unike
  besøkende.
</p>

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "period": { "from": null, "to": null },
    "totalEvents": 17,
    "metrics": {
      "views": 7,
      "uniqueVisitors": 7,
      "engaged": 6,
      "submissions": 4,
      "engagementRate": 86,
      "completionRate": 57,
      "bounceRate": 14
    },
    "breakdown": {
      "byBrowser": { "Chrome": 17 },
      "byCountry": { "US": 10, "DE": 7 },
      "byDevice": { "desktop": 14, "mobile": 3 },
      "bySource": { "Direct": 12, "Google": 5 }
    }
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="workspaces" class="border-t border-border pt-8">
  Arbeidsområdeer
</h2>

{/* ── workspaces.list ─────────────────────────────────────────────────────── */}

List opp arbeidsområdeene tokenet ditt kan nå. Ingen parametere.

Et API-token er bundet til én arbeidsområde, så dette returnerer nøyaktig den ene — selv når kontoen din tilhører flere.

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "ws_abc123",
        "name": "Acme Inc",
        "createdAt": 1714041800000,
        "role": "owner"
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── workspaces.createInvite ─────────────────────────────────────────────── */}

Opprett en invitasjonslenke til en arbeidsområde.

  
    Arbeidsområdeens ID.
  
  
    Utløpstidspunkt som et fremtidig Unix-tidsstempel i millisekunder.
  
  
    Maksimalt antall ganger invitasjonen kan brukes.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "inv_abc123",
    "workspaceId": "ws_abc123",
    "code": "aBcDeFgH",
    "expiresAt": null,
    "maxUses": null,
    "uses": 0,
    "createdAt": 1714041851000
  }
}
```

  

{/* ── workspaces.getInvite ────────────────────────────────────────────────── */}

Hent én arbeidsområdeinvitasjon. Returnerer samme form som `workspaces.createInvite`.

  
    Invitasjons-ID.
  

{/* ── workspaces.updateInvite ─────────────────────────────────────────────── */}

Oppdater en eksisterende arbeidsområdeinvitasjon. Oppgi minst ett av <code>expiresAt</code> eller <code>maxUses</code>, ellers avvises
kallet. Returnerer den oppdaterte invitasjonen.

  
    Invitasjons-ID.
  
  
    Nytt utløpstidsstempel i millisekunder.
  
  
    Ny grense for maks bruk.
  

{/* ── workspaces.revokeInvite ─────────────────────────────────────────────── */}

Trekk tilbake en arbeidsområdeinvitasjon permanent.

  
    Invitasjons-ID.
  

  
    
```
{
  "ok": true,
  "data": {
    "inviteId": "inv_abc123",
    "revoked": true
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="folders" class="border-t border-border pt-8">
  Mapper
</h2>

{/* ── folders.list ────────────────────────────────────────────────────────── */}

List opp mapper i en arbeidsområde.

  
    Arbeidsområdeens ID.
  
  
    Sidestørrelse (1–100).
  
  
    Pagineringsmarkør.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "fld_abc123",
        "name": "Customer Feedback",
        "workspaceId": "ws_abc123",
        "parentId": null,
        "createdAt": 1714041800000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── folders.create ──────────────────────────────────────────────────────── */}

Opprett en mappe i en arbeidsområde. Idempotent — returnerer den eksisterende mappen hvis en mappe med samme navn allerede finnes.

  
    Arbeidsområdeens ID.
  
  
    Mappenavn (1–255 tegn).
  
  
    Overordnet mappe-ID for nesting. Utelat for rotnivå.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "fld_new123",
    "name": "Customer Feedback",
    "workspaceId": "ws_abc123",
    "parentId": null,
    "createdAt": 1714041851000,
    "alreadyExisted": false
  }
}
```

  

{/* ── folders.update ──────────────────────────────────────────────────────── */}

Gi en mappe nytt navn eller flytt den til en annen overordnet mappe.

  
    Mappe-ID.
  
  
    Nytt mappenavn (1–255 tegn).
  
  
    Ny overordnet mappe. Send <code>null</code> for å flytte til rotnivå.
  

{/* ── folders.delete ──────────────────────────────────────────────────────── */}

Slett en mappe og alt innholdet permanent (undermapper og skjemaer).

  
    Mappe-ID.
  

> ⚠️ **Destruktiv operasjon**
> <p>Dette sletter alle undermapper og skjemaer i mappen permanent. Handlingen kan ikke angres.</p>

  
    
```
{
  "ok": true,
  "data": {
    "folderId": "fld_abc123",
    "deletedFolderIds": ["fld_abc123"],
    "deletedFormIds": ["frm_in_folder"],
    "message": "Folder and 1 form deleted."
  }
}
```

  

<h2 id="translations" class="border-t border-border pt-8">
  Oversettelser
</h2>

{/* ── translations.listLanguages ──────────────────────────────────────────── */}

List opp alle språk konfigurert på et skjema.

  
    Skjemaets ID.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "items": [
      {
        "language": "es",
        "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
        "lastUpdatedAt": 1714041851000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── translations.addLanguage ────────────────────────────────────────────── */}

Registrer et språk på et skjema. Enhver annen oversettelsesmetode feiler med `404 NOT_FOUND` inntil du gjør det.

  
    Skjemaets ID.
  
  
    BCP-47-språkkode (f.eks. <code>"es"</code>, <code>"pt-BR"</code>).
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "rowId": "tl_new123"
  }
}
```

  

{/* ── translations.removeLanguage ─────────────────────────────────────────── */}

Fjern et språk og alle dets oversettelser fra et skjema.

  
    Skjemaets ID.
  
  
    BCP-47-språkkode.
  

{/* ── translations.listEntries ────────────────────────────────────────────── */}

List opp hver kildenøkkel for ett språk på et skjema, med gjeldende tilstand. Dette er hvordan du finner `key`-verdiene{' '}
`translations.setEntry` tar.

  
    Skjemaets ID.
  
  
    BCP-47-språkkode. Må allerede være på skjemaet.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
    "items": [
      {
        "key": "block_q_1.title",
        "status": "current",
        "value": "[{\"text\":\"Tu correo electrónico\"}]",
        "sourceFragment": "[{\"text\":\"Your email\"}]",
        "updatedAt": 1714041851000,
        "block": { "id": "q_1", "type": "email-input", "label": "Your email" }
      }
    ],
    "hasMore": false
  }
}
```

  

<p>
  <code>status</code> er <code>missing</code> (ingenting lagret), <code>outdated</code> (kilden endret seg siden), <code>current</code>,
  eller <code>suggested</code> (et AI-forslag klargjort, men ikke godtatt). Nøkler dekker skjemainnhold (<code>block_&lt;id&gt;.*</code>)
  og, når en forfatter har tilpasset dem, respondentens bekreftelses- og påminnelses-e-poster (<code>email.confirmation.*</code>,{' '}
  <code>email.reminder.*</code>).
</p>

{/* ── translations.setEntry ───────────────────────────────────────────────── */}

Angi en enkelt oversettelsespost. Språket må ha blitt lagt til via <code>translations.addLanguage</code> først.

  
    Skjemaets ID.
  
  
    BCP-47-språkkode.
  
  
    En nøkkel fra <code>translations.listEntries</code>. Ikke konstruer en for hånd.
  
  
    Det oversatte fragmentet, JSON-stringifisert. Merkestrukturen må matche kildefragmentet.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "translations.setEntry",
    "params": {
      "formId": "frm_abc123",
      "language": "es",
      "key": "block_q_1.title",
      "value": "[{\"text\":\"Tu correo electrónico\"}]"
    }
  }'
```

> ⚠️ **Skriving her er live**
> <p>
>     API-et har ikke noe kladd-og-publiser-steg: en <code>setEntry</code> eller <code>deleteEntry</code> når respondenter umiddelbart.
>     Dashbordet og MCP-oversettelsesverktøyene bruker en kladd i stedet.
>   </p>

<p>
  Returnerer <code>{`{ formId, language, key }`}</code>.
</p>

{/* ── translations.deleteEntry ────────────────────────────────────────────── */}

Slett en enkelt oversettelsespost, som tilbakestiller den nøkkelen til skjemaets standardspråk. Idempotent. Når den siste posten for et
språk forsvinner, faller språket ut av skjemaets publiserte språk.

  
    Skjemaets ID.
  
  
    BCP-47-språkkode.
  
  
    Oversettelsenøkkel som skal slettes.
  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="me" class="border-t border-border pt-8">
  Konto
</h2>

{/* ── me.get ──────────────────────────────────────────────────────────────── */}

Hent informasjon om den autentiserte brukeren.

  
    
```
{
  "ok": true,
  "data": {
    "id": "usr_abc123",
    "email": "you@example.com",
    "name": "Jane Doe"
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="meta" class="border-t border-border pt-8">
  Meta
</h2>

List opp alle metodenavn dette driftsmiljøet betjener, sortert. Det autoritative svaret når denne siden og serveren er uenige.

  
    
```
{
  "ok": true,
  "data": {
    "methods": [
      "methods.list",
      "analytics.get",
      "folders.create",
      "folders.delete",
      "folders.list",
      "folders.update",
      "formSettings.get",
      "formSettings.update",
      "forms.create",
      "forms.delete",
      "forms.get",
      "forms.list",
      "..."
    ]
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="error-reference" class="border-t border-border pt-8">
  Feilreferanse
</h2>

Hvert feilsvar har samme form. Det øverste settet av `code`-verdier er bevisst lukket: en ny feiltilstand legger aldri til en ny kode,
den legger til en `reason`. Forgren på `code` for HTTP-nivåutfallet og på `details.reason` for fiksen.

```
{
  "ok": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "No field with key \"company\" on this form.",
    "details": { "reason": "UNKNOWN_FIELD_KEY", "field": "prefill.company", "validKeys": ["company_name", "contacts"] }
  }
}
```

<p>
  <code>details</code> finnes når serveren kan navngi årsaken. Ved siden av <code>reason</code> kan den bære <code>field</code> (den
  problematiske parameteren, punktnotasjon for nesting), <code>validKeys</code>, <code>validValues</code> (valgets <strong>verdier</strong>{' '}
  et valgspørsmål godtar), <code>expectedType</code>, <code>feature</code> (på <code>UPGRADE_REQUIRED</code>), og <code>retryAfterMs</code>{' '}
  (på et kall som er strupet). Årsaker for forespørseloverflaten er listet ved hver metode ovenfor.
</p>

<p>Dette er alle kodene:</p>

  
    Ugyldige eller manglende parametere i forespørselen.
  
  
    Manglende eller ugyldig API-token.
  
  
    Token mangler tilgang til den forespurte ressursen.
  
  
    Ressursen finnes ikke.
  
  
    Ukjent metodenavn. Bruk <code>methods.list</code> for å se tilgjengelige metoder.
  
  
    Ressursen er ikke i en tilstand som tillater dette kallet — en forespørsel som ikke lenger er ventende, en idempotensnøkkel gjenbrukt
    med en annen body.
  
  
    Over 120 kall i minuttet på dette tokenet, over 60 <code>requests.create</code>-kall i minuttet, eller for mange mislykkede
    autentiseringer fra denne IP-en.
  
  
    Funksjonen krever et høyere abonnementsnivå, arbeidsområdet har brukt opp sin månedlige kvote (årsak{' '}
    <code>MONTHLY_ALLOWANCE_REACHED</code>), eller en Gratis-konto har brukt opp sine 10 gratis invitasjoner (årsak{' '}
    <code>FREE_INVITATIONS_USED</code>).
  
  
    Uventet serverfeil. Prøv igjen senere.
  

<h2 id="next-steps">Neste steg</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [API-tokens](/no/developers/api-tokens) — Opprett og administrer tokens
  - [MCP-server](/no/developers/mcp-server) — Bruk Formstep fra AI-agenter
  - [Webhooks-referanse](/no/developers/webhooks-reference) — Nyttelastskjema og signering
</div>
