Voor ontwikkelaars
Mailconcepten klaarzetten via de API
Laat je eigen app een mail voorbereiden voor een collega. 1plek verstuurt niets; je collega verstuurt het concept zelf.
Je eigen app weet vaak precies welke mail er nodig is: een offerte bevestigen, een klant antwoorden over een bestelling. Met deze API zet je app die mail als concept klaar in 1plek, namens een collega en vanaf een inbox van het bedrijf. Je collega vindt het concept in Concepten (of in het gesprek, bij een antwoord), leest het na en verstuurt het zelf.
Deze API verstuurt nooit iets. Er bestaat geen recht mail:send. Komt dat er ooit,
dan vraagt het ook toestemming van de medewerker zelf — een sleutel van de app alleen
is dan niet genoeg.
Een sleutel maken
Ga naar Bedrijfsinstellingen → Koppelingen → Je app, blok Mailconcepten
klaarzetten, en maak een sleutel. Die heeft het recht mail:draft, hoort bij één
bedrijf en wordt gehasht opgeslagen — je ziet 'm één keer. Op dezelfde plek trek je
een sleutel weer in; daarna geeft elke aanroep 401.
Wat je app wel en niet kan
De sleutel geeft je app geen eigen toegang tot de inbox. Je app zet iets klaar namens een collega, en alleen als die collega dat in 1plek zelf ook had gekund:
- de collega (
actorEmail) heeft een account in 1plek, mag inloggen en werkt nu bij dit bedrijf; - de inbox (
from) is een inbox van dit bedrijf, en de collega mag die inbox gebruiken; - bij een antwoord: de collega mag het gesprek zien.
actorEmail is het hoofdadres van het account in 1plek. Een extra inlogadres (een
gekoppeld privé-account) telt hier niet: dat opent alleen de persoonlijke plek.
Elk concept laat zien waar het vandaan komt: in Concepten en bij het openen staat "Klaargezet via <naam van de sleutel> namens <collega>". Geef je sleutel dus een herkenbare naam.
Een concept klaarzetten
curl -X POST \
https://iam.1plek.com/api/platform/companies/jouw-bedrijf/mail/drafts \
-H "Authorization: Bearer $ONEPLEK_API_KEY" \
-H "Idempotency-Key: 6f1c2a1e-4b7d-4c1e-9d55-2f9a0c3e7b10" \
-H "Content-Type: application/json" \
-d '{
"actorEmail": "collega@jouwbedrijf.nl",
"from": "info@jouwbedrijf.nl",
"to": [{ "email": "klant@example.com", "name": "Sam de Klant" }],
"cc": [],
"subject": "Je offerte",
"html": "<p>Hoi Sam,</p><p>Hierbij je offerte.</p>",
"inReplyTo": "<abc123@mail.example.com>",
"context": { "offerte": "Q-2041" }
}'jouw-bedrijf is de korte naam van het bedrijf in 1plek (zie Je app). Het
adres van je 1plek-werkruimte kan afwijken van iam.1plek.com; gebruik het adres
dat bij je sleutel staat.
Headers
| Header | Verplicht | Betekenis |
|---|---|---|
Authorization | ja | Bearer <sleutel> met het recht mail:draft |
Idempotency-Key | ja | Een unieke waarde per concept, bijvoorbeeld een UUID. 8 tot 200 tekens: letters, cijfers, . _ : - |
Content-Type | ja | application/json |
Velden
| Veld | Verplicht | Betekenis |
|---|---|---|
actorEmail | ja | Hoofdadres van de collega namens wie het concept klaarstaat |
from | ja | Adres van een inbox van dit bedrijf in 1plek |
to | ja | 1 tot 50 ontvangers: { "email": "…", "name": "…" } (name is optioneel) |
cc, bcc | nee | Elk maximaal 50 ontvangers, zelfde vorm |
subject | ja | Maximaal 500 tekens. Leeg mag: dan "(Geen onderwerp)", of bij een antwoord het onderwerp van het gesprek |
html | ja | Alleen de tekst van de mail, maximaal 200.000 tekens. Geen kop, handtekening of voettekst: die zet 1plek er zelf omheen, in de stijl van de inbox. Scripts en andere onveilige onderdelen worden weggehaald |
inReplyTo | nee | Message-ID van de mail waarop je antwoordt, met of zonder punthaken |
context | nee | Vrij JSON-object (maximaal 4.000 bytes). Wordt bewaard, niet getoond aan de ontvanger en niet verstuurd |
Namen bij ontvangers worden nu niet gebruikt; 1plek toont de naam uit de contacten.
Antwoord of nieuwe mail
Met inReplyTo zoekt 1plek de mail met die Message-ID in de inbox van from. Staat
die in een gesprek dat je collega mag zien, dan wordt het concept een antwoord in
dat gesprek. Anders, of zonder inReplyTo, wordt het een nieuwe mail in
Concepten.
Een collega heeft per gesprek één antwoord-concept. Staat daar al een concept van die collega, dan blijft dat onaangeroerd (het kan half getypte tekst zijn) en wordt jouw concept een nieuwe mail in Concepten.
Antwoord bij succes: 201
{
"draftId": 123,
"conversationId": null,
"openUrl": "/inbox/compose?draft=123"
}| Veld | Betekenis |
|---|---|
draftId | Nummer van het concept |
conversationId | Het gesprek bij een antwoord, anders null |
openUrl | Pad om het concept te openen, relatief aan het adres van de werkruimte. Nieuwe mail: /inbox/compose?draft=<draftId>. Antwoord: /inbox?conversation=<conversationId> |
Dezelfde aanroep nog eens
Met dezelfde Idempotency-Key bij hetzelfde bedrijf binnen 24 uur krijg je
hetzelfde antwoord terug (201, zelfde draftId) en er komt geen tweede concept bij.
Zo kun je na een time-out veilig opnieuw proberen. Dat geldt ook als het concept
intussen is aangepast, verstuurd of weggegooid.
Gebruik je dezelfde sleutel binnen 24 uur met andere inhoud, dan krijg je 422.
Na 24 uur is de sleutel vergeten en maakt dezelfde waarde een nieuw concept.
Foutmeldingen
Een fout heeft altijd de vorm { "error": "<zin>" }. Deze zinnen zijn vast; je kunt
ze aan je gebruiker tonen.
| Status | error |
|---|---|
401 | De API-sleutel ontbreekt, is ongeldig of heeft het recht mail:draft niet. |
403 | Je hebt in 1plek geen toegang tot dit bedrijf. |
403 | Je hebt in 1plek geen toegang tot <adres>. — met het adres van from |
404 | Onbekend bedrijf. — ook als het bedrijf niet bij je sleutel hoort |
404 | Dit adres is geen inbox van dit bedrijf in 1plek. |
409 | Mail staat uit voor dit bedrijf in 1plek. |
422 | De header Idempotency-Key ontbreekt of is ongeldig. |
422 | Deze Idempotency-Key is al gebruikt voor een ander concept. |
422 | Een zin over het veld dat niet klopt, bijvoorbeeld "Geef minstens één ontvanger op in to." Anders: "De gegevens van het concept kloppen niet." |
429 | Te veel verzoeken. Probeer het later opnieuw. — met een Retry-After-header in seconden |
500 | Het concept klaarzetten is mislukt. Probeer het later opnieuw. |
De 403 voor het bedrijf zegt bewust niet of het adres een account heeft: je app
hoort alleen te weten dat het voor dit bedrijf niet kan.
Grenzen
- Per sleutel maximaal 60 concepten per uur, per bedrijf (alle sleutels samen) 200.
- Staat het onderdeel Inbox van het bedrijf uit in 1plek, dan weigert de API met
409. Er wordt niets bewaard. - Een nieuwe mail staat in Concepten bij de collega's van dit bedrijf; een antwoord-concept is persoonlijk en staat alleen bij de collega namens wie het klaargezet is.
Zet je sleutel in de omgevingsvariabelen van je app, nooit in code die naar de browser gaat.