Abstracts API
List, create, edit, and delete scientific abstracts and e-posters.
Manage the scientific abstracts shown in your event app: titles, author lists with institution superscripts, abstract texts, and e-posters. Attendees browse abstracts organized by category, with each category as its own page in the app, and abstracts also appear on the public website through the abstracts widget after republishing. All endpoints require the standard authentication headers. Write endpoints require the abstracts:write scope; the read endpoint requires abstracts:read.
Every write supports ?dryRun=1 to validate without saving, and the authoritative field list is always available from /apiSchema.
GET /getAbstracts
Returns an array of all abstracts for the event. No request body required. Requires abstracts:read.
Response body (JSON array)
[
{
"documentId": "abc123",
"abstractNumber": "1008",
"title": "Long-term outcomes of early intervention",
"category": "Cardiology",
"institutions": ["University Hospital Oslo", "Karolinska Institutet"],
"authors": [
{ "name": "Dr. Jane Doe", "institutionIndexes": [0], "isPresenter": true, "speakerId": "spk42" },
{ "name": "John Smith", "institutionIndexes": [0, 1] }
],
"abstractText": "[{\"insert\":\"Background: ...\\n\"}]",
"posterImagePath": "https://.../poster-display.png",
"posterOriginalPath": "https://.../poster-full.png",
"posterExpected": true,
"keywords": "outcomes,cardiology",
"unListed": false,
"hidden": false
}
]
Example request
curl "https://api.event-vault.com/getAbstracts" \
-H "x-api-key: <your-api-key>" \
-H "x-client-id: <your-client-id>" \
-H "x-event-id: <your-event-id>" \
-H "x-timestamp: $(date +%s%3N)"
POST /upsertAbstract
Creates a new abstract, or edits an existing one. Omit documentId to create (title required); include it to edit that abstract (only the fields you send are updated; fields you omit are left unchanged). Edits also return a changes map with the before and after value of every field the write actually changed, so you can confirm what happened. Requires abstracts:write.
New abstracts are published by default: they appear in the app and on the published website right away. Send "unListed": true to keep an abstract in the console only, until you are ready to show it.
Request body fields
| Field | Type | Required | Description |
|---|---|---|---|
documentId |
string | The abstract you are editing. Omit to create, include to edit. /getAbstracts returns it, so a record you just fetched can be posted straight back. |
|
abstractId |
string | Accepted as an alias for documentId on every endpoint. Send one or the other - two different values is a 400. |
|
abstractNumber |
string | The display number shown with the abstract, e.g. "1008". Searchable in the app. |
|
title |
string | ✓ (create) | The abstract’s title. Required when creating. |
category |
string | Free text. A value not yet in the event’s category list is added to it automatically and reported in warnings. Each category becomes its own page in the attendee app. |
|
institutions |
array | Institution names as a JSON array of strings. Order matters: the first institution renders as superscript 1, the second as superscript 2, and so on. | |
authors |
array | The author list as a JSON array of objects - see Authors and institutions below. | |
abstractText |
string | The abstract body, as plain text or as a Delta JSON string, exactly like speaker biographies - see Rich Text Format. | |
posterImagePath |
string | URL of the display copy of the e-poster, shown in the app. Host images with /uploadImage. |
|
posterOriginalPath |
string | URL of the full-resolution e-poster, used for fullscreen viewing and download. When empty, the display copy is used instead. | |
posterExpected |
boolean | true = the e-poster is tracked as a deliverable: linked speakers show as missing it until it is uploaded. Leave false for oral presentations. Defaults to false. |
|
downloadLink |
string | Optional URL rendered as a download button on the abstract. | |
downloadLabel |
string | Label for the download button. Defaults to "Download". |
|
sessionId |
string | Optional reference to the session where the abstract is presented. An unknown id is stored but reported in warnings. Not yet shown anywhere. |
|
keywords |
string | Comma-separated keywords, used for search and shown as chips on the abstract. | |
unListed |
boolean | Publish toggle. true = hidden from the app and the published website, but still visible in the console; false = published. New abstracts default to false (published). |
Authors and institutions
Each entry in authors is an object:
| Key | Type | Description |
|---|---|---|
name |
string | The author’s name. Required for every author. |
institutionIndexes |
array | Positions into institutions, 0-based: index 0 is the first institution, which renders as superscript 1. Shown as superscript numbers after the author’s name. |
isPresenter |
boolean | Marks the presenting author, who is shown underlined and listed first. |
speakerId |
string | Optionally links the author to a speaker, so the abstract appears on that speaker’s profile and in the speaker deliverables view. An unknown speakerId is stored and reported in warnings; the link simply does not render until it matches an existing speaker. |
Read-only fields. documentId, clientId, apiImported, updated, deleted and hidden are bookkeeping fields, and behave exactly as on other object types: reads return them, writes ignore them. That makes read-modify-write round trips safe - fetch an abstract, change what you need, and post the whole record back.
Responses
| Status | Response body | Description |
|---|---|---|
200 OK |
{ "status": "success", "abstractId": "abc123", "created": true } |
Abstract created (created: true) or edited (created: false, plus a changes map of before/after values). May also carry warnings / ignoredFields - see Field Types |
400 Bad Request |
{ "error": "Invalid request body", "details": [...] } |
A field has the wrong type or format, or title is missing on create |
404 Not Found |
Abstract not found. |
An id was supplied but no such abstract exists |
500 Internal Server Error |
Error upserting abstract. |
Unexpected server error |
Plus the standard auth errors (400/403/404/408/429) - see Authentication.
Example - create an abstract
curl "https://api.event-vault.com/upsertAbstract" \
-X POST \
-H "Content-Type: application/json" \
-H "x-api-key: <your-api-key>" \
-H "x-client-id: <your-client-id>" \
-H "x-event-id: <your-event-id>" \
-H "x-timestamp: $(date +%s%3N)" \
-d '{
"abstractNumber": "1008",
"title": "Long-term outcomes of early intervention",
"category": "Cardiology",
"institutions": ["University Hospital Oslo", "Karolinska Institutet"],
"authors": [
{ "name": "Dr. Jane Doe", "institutionIndexes": [0], "isPresenter": true },
{ "name": "John Smith", "institutionIndexes": [0, 1] }
],
"keywords": "outcomes,cardiology"
}'
The response returns the new abstractId. To edit later, send the same endpoint with that id and only the fields you want to change:
curl "https://api.event-vault.com/upsertAbstract" \
-X POST \
-H "Content-Type: application/json" \
-H "x-api-key: <your-api-key>" \
-H "x-client-id: <your-client-id>" \
-H "x-event-id: <your-event-id>" \
-H "x-timestamp: $(date +%s%3N)" \
-d '{"abstractId": "abc123", "posterImagePath": "https://.../poster-display.png", "posterExpected": true}'
POST /deleteAbstract
Deletes an abstract. From the organizer’s point of view the deletion is permanent: the abstract disappears from the console and the app. Requires abstracts:write.
Request body fields
| Field | Type | Required | Description |
|---|---|---|---|
abstractId |
string | ✓ | ID of the abstract to delete (documentId is accepted too) |
| Status | Response body | Description |
|---|---|---|
200 OK |
{ "status": "success" } |
Abstract was deleted |
400 Bad Request |
The request must include abstractId in the body. |
abstractId is missing |
404 Not Found |
Abstract not found. |
No abstract with this ID exists in the event |
500 Internal Server Error |
Error deleting abstract. |
Unexpected server error |
Example request
curl "https://api.event-vault.com/deleteAbstract" \
-X POST \
-H "Content-Type: application/json" \
-H "x-api-key: <your-api-key>" \
-H "x-client-id: <your-client-id>" \
-H "x-event-id: <your-event-id>" \
-H "x-timestamp: $(date +%s%3N)" \
-d '{"abstractId": "abc123"}'
Importing a whole programme
Most abstract programmes arrive as an export from a submission system, hundreds of records at a time. /bulkUpsert accepts {"type": "abstract", "items": [...]} with up to 200 abstracts per call and reports a result per item, and each item takes the same fields as /upsertAbstract, including institutions and authors. That makes it the right way to load a full programme.
One difference from the single-record endpoint: speakerId reference checks are skipped in bulk. The links are stored as sent and simply do not render until the speaker exists, so you can import abstracts before their speakers without failing rows.