Documentation

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)
Responses
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.