# Send en forespørsel med REST API-et

Opprett et API-token, les et skjemas feltnøkler, og opprett en forhåndsutfylt forespørsel med curl, fra ethvert verktøy som kan gjøre et HTTP-kall.

## Send en forespørsel med REST API-et

Ethvert verktøy med et HTTP-steg kan sende en forespørsel: Pipedream, en serverløs funksjon, et skript. Denne guiden gjør det med curl, slik at du kan se hvert kall før du flytter det inn i din egen kode.

<p>
  Du trenger et publisert skjema. Denne guiden bruker det som ble bygget i{' '}
  <a href="/no/guides/ai-agents/build-a-form">Bygg et skjema med en AI-agent</a>: firmanavn, kontakt-e-post, MVA-nummer, et ja- eller
  nei-spørsmål om betalingsbetingelser, og en filopplasting. Hver metode og hvert alternativ brukt her er beskrevet i{' '}
  <a href="/no/developers/rest-api">API-metoder</a>.
</p>

<h2 id="token">1. Opprett et API-token</h2>

<p>
  I formbase, åpne <strong>OAuth og API-nøkler</strong> i arbeidsområdets sidepanel og{' '}
  <a href="/no/developers/api-tokens#create">opprett et token</a>. Verdien vises én gang. Behold det i en miljøvariabel, ikke i koden din:
</p>

```
export FORMBASE_TOKEN='fb_...'
```

<p>
  Et token når det ene arbeidsområdet det ble opprettet i. Hvert kall under er en <code>POST</code> til samme URL med tokenet i{' '}
  <code>Authorization</code>-headeren; kroppen navngir metoden og parameterne dens.
</p>

<h2 id="form-id">2. Finn skjema-IDen</h2>

<p>
  Åpne skjemaet i editoren. Skjema-IDen er delen av adressen etter <code>/forms/</code>:
</p>

```
https://app.formbase.so/<workspace ID>/forms/jx75hdx8vb5hy1x85gm17nqgkn8f674g/edit
```

<p>Kommandoene under bruker denne guidens skjema-ID. Sett inn din egen i stedet.</p>

<h2 id="fields">3. List feltnøklene</h2>

<p>
  En forespørsel fyller inn spørsmål, og svarene kommer tilbake, etter <a href="/no/requests/field-keys">feltnøkkel</a>. Spør skjemaet om
  nøklene sine i stedet for å gjette dem fra titlene:
</p>

```
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer $FORMBASE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"method": "fields.list", "params": {"formId": "jx75hdx8vb5hy1x85gm17nqgkn8f674g"}}'
```

<p>Svaret lister hvert spørsmål i det publiserte skjemaet. Forkortet:</p>

```
{
  "ok": true,
  "data": {
    "published": true,
    "items": [
      { "key": "company_name", "type": "text", "title": "Company name", "required": true, "prefillable": true },
      { "key": "contact_email", "type": "email", "title": "Contact email", "required": true, "prefillable": true },
      { "key": "vat_number", "type": "text", "title": "VAT number", "required": false, "prefillable": true },
      {
        "key": "do_you_accept_our_30_day_payment_terms", "type": "radio", "title": "Do you accept our 30-day payment terms?", "required": true, "prefillable": true,
        "options": [{ "key": "yes", "label": "Yes" }, { "key": "no", "label": "No" }]
      },
      { "key": "certificate_of_incorporation", "type": "file", "title": "Certificate of incorporation", "required": true, "prefillable": false }
    ],
    "hasMore": false
  }
}
```

<p>
  For å forhåndsutfylle et valgspørsmål, send alternativets <code>key</code>, her <code>"yes"</code>, ikke etiketten dets. Et spørsmål med{' '}
  <code>prefillable: false</code>, som filopplastingen, kan bare mottakeren svare på. De andre flaggene er forklart under{' '}
  <a href="/no/developers/rest-api#fields-list">fields.list</a>.
</p>

<h2 id="create">4. Opprett en testforespørsel</h2>

<p>
  Send forespørselen til Ada Lovelace, med firmanavnet fylt inn og låst. <code>test: true</code> gjør den til en{' '}
  <a href="/no/requests/creating-requests#test-mode">testforespørsel</a>: den sender aldri e-post til noen og teller ingen steder, så du kan
  gjenta dette steget så ofte du vil, med en ny <code>idempotencyKey</code> hver gang.
</p>

```
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer $FORMBASE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "requests.create",
    "params": {
      "formId": "jx75hdx8vb5hy1x85gm17nqgkn8f674g",
      "recipient": { "email": "ada@acme.example", "name": "Ada Lovelace" },
      "prefill": { "company_name": "Analytical Engines Ltd" },
      "readonly": ["company_name"],
      "externalId": "supplier-2043",
      "idempotencyKey": "supplier-2043",
      "test": true
    }
  }'
```

<ul>
  <li>
    <strong>prefill</strong> fyller inn svar mottakeren fortsatt kan endre. En nøkkel i <strong>readonly</strong> er også{' '}
    <a href="/no/requests/creating-requests#locked-fields">låst</a>.
  </li>
  <li>
    <strong>externalId</strong> er din egen id for dette stykket arbeid, som et leverandørnummer. Den kommer tilbake på hver lesing og
    callback.
  </li>
  <li>
    <strong>idempotencyKey</strong> gjør et nytt forsøk trygt. Hvis koden din sender det samme kallet to ganger, returnerer formbase den
    første forespørselen med <code>deduplicated: true</code> i stedet for å opprette en ny.
  </li>
</ul>

<p>Svaret bærer forespørsels-IDen og lenken for mottakeren:</p>

```
{
  "ok": true,
  "data": {
    "id": "m17ayhcnj9xvzkff3atek49bdd8f6872",
    "status": "pending",
    "url": "https://form.formbase.so/r/rq_...",
    "deliveryStatus": "not_requested",
    "externalId": "supplier-2043",
    "deduplicated": false,
    "createdAt": 1790539225370,
    "expiresAt": 1793131225370
  }
}
```

<p>
  <code>deliveryStatus: "not_requested"</code> betyr at formbase ikke sendte noen e-post; du leverer lenken selv. For å la formbase sende
  invitasjonen og påminnelsene, legg til <code>"delivery": "email"</code>, som krever en Pro- eller Business-plan. Se{' '}
  <a href="/no/requests/invitations-and-reminders">Invitasjoner, påminnelser og utløp</a>. Hvis skjemaet har{' '}
  <strong>Send påminnelser</strong> på, får en ekte forespørsel med en mottaker-e-post likevel de planlagte påminnelsene; legg til{' '}
  <code>"reminders": []</code> for å sende ingen.
</p>

> ℹ️ **Testforespørsler holder seg unna syne**
> <p>
>     <strong>Forespørsler</strong>-siden lister testforespørsler bare når du slår på filteret <strong>Vis testforespørsler</strong>. Åpne{' '}
>     <code>url</code> selv for å fullføre den. Fjern <code>test</code> når du sender det ekte.
>   </p>

<h2 id="read">5. Fullfør den og les svarene</h2>

<p>
  Åpne <code>url</code> i en nettleser. Firmanavnet er fylt inn og låst; svar på resten og send inn. Les så forespørselen tilbake med IDen:
</p>

```
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer $FORMBASE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"method": "requests.get", "params": {"requestId": "m17ayhcnj9xvzkff3atek49bdd8f6872"}}'
```

<p>
  Når <code>status</code> er <code>completed</code>, bærer svaret to kart nøkkelsatt etter feltnøkkel. <code>answers</code> er for kode: et
  valgsvar er alternativets nøkkel, et filsvar er en liste med filer med nedlastings-URL-er. <code>display</code> er for mennesker:
  etiketter og filnavn.
</p>

```
"answers": {
  "company_name": "Analytical Engines Ltd",
  "do_you_accept_our_30_day_payment_terms": "yes",
  "certificate_of_incorporation": [{ "name": "certificate-of-incorporation.pdf", "type": "application/pdf", "size": 635, "url": "https://api.formbase.so/api/storage/..." }]
},
"display": {
  "company_name": "Analytical Engines Ltd",
  "do_you_accept_our_30_day_payment_terms": "Yes",
  "certificate_of_incorporation": "certificate-of-incorporation.pdf"
}
```

<p>
  Å spørre igjen og igjen til statusen endres, fungerer for en test, men ikke i produksjon. Gi forespørselen en <code>callbackUrl</code>, og
  formbase kaller deg når den avsluttes; neste guide setter det opp.
</p>

<h2 id="next">Neste</h2>

<div class="not-prose grid gap-3 sm:grid-cols-2 mb-8">
  - [Motta og verifiser callbacken](/no/guides/rest-api/verify-the-callback) — Få svarene sendt til endepunktet ditt, og sjekk at formbase sendte dem.
  - [Opprett en forespørsel](/no/requests/creating-requests) — Hvert alternativ en forespørsel tar: context, metadata, dokumenter, utløp.
</div>
