JSON Endpoint

Lineup Ninja can publish to a JSON endpoint. You can then access this endpoint to obtain a JSON representation of your agenda.

Please note that the published JSON document is not intended to be consumed directly by an attendee app, or other similar software. You should ingest the data into your system and publish it to attendees and other users yourself.

Once created the endpoint has a fixed URL. You can, optionally, be notified via a webhook when the agenda has been republished.

Create the integration

Follow these steps to get the integration initially configured.

Step 1: In your Lineup Ninja event, click the ‘Publish’ menu item and then click the ‘Publish’ button under ‘JSON’. This will create a new publication.

Step 3: A screen will pop up where you can enter a username and password to secure the endpoint. You can also input the ‘Webhook URL’ you would like Lineup Ninja to call when the agenda is published. Save the configuration.

Step 4: Now click ‘Publish’ to publish the agenda to the URL shown on the screen.

Fetch the data

Simply perform a GET to the URL shown after publishing your event. If you have configured a Username and Password for the agenda you must provide these as HTTP Basic Auth on your request.

Schema

Note

As our product develops we will add new fields to the schema without notice.

Where possible we will not deprecate or remove existing fields, if this becomes required we will notify active users of the integration.

These are the typescript definitions for the document.

Note that ‘speakers’ are called ‘contributors’ in the document.

{
    /**
     * Contributors are the speakers for the event
     */
    contributors: Contributor[];
    /**
     * Labels, aka tags, can be assigned to contributors, sessions, tracks, resources and locations
     */
    labels: Label[];
    /**
     * Locations are where sessions take place
     */
    locations: Location[];
    /**
      * Resources are things that sessions need. Locations can have resources assigned to them.
      * Sessions are then required to be scheduled in a location with matching resources.
      */
    resources: Resource[];
    /**
     * Roles model the relationship between contributors and sessions, eg Chair, Panel Member etc...
     */
    roles: Role[];
    /**
     * Sessions are sessions....
     **/
    sessions: Session[];
    /**
      * A session can take place in one or many tracks.
      */
    tracks: Track[];
}

Contributor (aka Speaker)

  {
    /**
     * The UUID for the speaker
     */
    id: string;
    /**
     * The speaker's title eg Mr, Mrs, Mx...
     */
    honorific: string | null;
    /**
     * The speaker's first name
     */
    firstName: string | null;
    /**
     * The speaker's last name
     */
    lastName: string | null;
    /**
     * Any letters after the speaker's name, eg 'Esq', 'OBE' etc...
     */
    postNominal: string | null;
    /**
     * The speaker's email. Note that some speakers may not have an email address, it is also not guaranteed to be unique.
     */
    email: string | null;
    /**
     * The speaker's company
     */
    company: string | null;
    /**
     * The speaker's job title at their company
     */
    position: string | null;
    /**
     * The speaker's phone number
     */
    phone: string | null;
    /**
     * The URL for the speaker's Twitter feed
     */
    twitter: string | null;
    /**
     * The URL for the speaker's Facebook page
     */
    facebook: string | null;
    /**
     * THe URL for the speaker's LinkedIn page
     */
    linkedin: string | null;
    /**
     * The URL for the speaker's Instagram page
     */
    instagram: string | null;
    /**
     * The URL for the speaker's Youtube channel
     */
    youtube: string | null;
    /**
     * The speakers bio formatted in Markdown
     */
    bio: string | null;
    /**
     * The speakers bio formatted in HTML
     */
    bio_HTML: string;
    /**
     * A URL to the speakers headshot, 128x128px
     */
    headshotURL: string | null;
    /**
     * A URL for the speakers headshot at 256x256px
     */
    headshot2xURL: string | null;
    /**
     * The speakers availability
     */
    availability: Availability[];
    /**
     * The UUIDs of labels assigned to the speaker
     */
    labels: string[];
    /**
     * The UUIDs of sessions assigned to the speaker
     */
    sessions: string[];
    /**
     * A list of sessions and the role id for each session assigned to the speaker
     */
    sessionJoins: ContributorSessionJoin[];
    /**
     * Any notes for the speaker. These are generally intended to be kept private.
     */
    notes: string | null;
    /**
     * When the speaker was last modified in UTC.
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this speaker
     */
    references?: SourceReferences | undefined;
}

Labels

{
    /**
     * The UUID for the label
     */
    id: string;
    /**
     * The name of the label
     */
    name: string;
    /**
     * A description of the label formatted in Markdown
     */
    description: string | null;
    /**
     * A description of the label formatted in HTML
     */
    description_HTML: string;
    /**
     * The UUIDs of contributors (speakers) assigned to this label
     */
    contributors: string[];
    /**
     * The UUIDs of locations assigned to this label
     */
    locations: string[];
    /**
     * The UUIDs of resources assigned to this label
     */
    resources: string[];
    /**
     * The UUIDs of sessions assigned to this label
     */
    sessions: string[];
    /**
     * The UUIDs of tracks assigned to this label
     */
    tracks: string[];
    /**
     * When the label was last modified in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this label
     */
    references?: SourceReferences | undefined;

}

Locations

{
    /**
     * The UUID for the location
     */
    id: string;
    /**
     * The name of the location
     */
    name: string;
    /**
     * A description of the location formatted in Markdown
     */
    description: string | null;
    /**
     * A description of the location formatted in HTML
     */
    description_HTML: string;
    /**
     * The availability of the location
     */
    availability: Availability[];
    /**
     * The UUIDs of labels assigned to this location
     */
    labels: string[];
    /**
     * The UUIDs of resources assigned to this location
     */
    resources: string[];
    /**
     * The UUIDs of sessions taking place in this location
     */
    sessions: string[];
    /**
     * The UUIDs of tracks taking place in this location
     */
    tracks: string[];
    /**
     * When the location was last modified in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this label
     */
    references?: SourceReferences | undefined;
}

Resources

{
    /**
     * The UUID for the resource
     */
    id: string;
    /**
     * The name of the resource
     */
    name: string;
    /**
     * A description of the resource formatted in Markdown
     */
    description: string | null;
    /**
     * A description of the resource formatted in HTML
     */
    description_HTML: string;
    /**
     * The UUIDs of labels assigned to this resource
     */
    labels: string[];
    /**
     * The UUIDs of locations with this resource
     */
    locations: string[];
    /**
     * The UUIDs of sessions needing this resource
     */
    sessions: string[];
    /**
     * When the resource was last modified in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this resource
     */
    references?: SourceReferences | undefined;

}

Roles

Roles model the relationship between contributors and sessions, eg Chair, Panel Member etc…

{
    /**
     * The UUID for the role
     */
    id: string;
    /**
     * The name of the role
     */
    name: string;
}

Sessions

{
    /**
     * The UUID for the session
     */
    id: string;
    /**
     * The name of the session
     */
    name: string;
    /**
     * A code for the session. This is created by the Event Manager, eg TECH101.
     */
    code: string | null;
    /**
     * A description of the session formatted in Markdown
     */
    description: string | null;
    /**
     * A description of the session formatted in HTML
     */
    description_HTML: string;
    /**
     * If the session is scheduled, the start date of the session in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    startDate: Date | null;
    /**
     * If the session is scheduled, the end date of the session in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    endDate: Date | null;
    /**
     * The duration of the session in milliseconds
     */
    duration: number | null;
    /**
     * If the session is scheduled, the UUID of the location it is scheduled in
     */
    location: string | null;
    /**
     * Any notes for the location. These are generally intended to be kept private.
     */
    notes: string | null;
    /**
     * The UUIDs of contributors (speakers) for this session
     */
    contributors: string[];
    /**
     * A list of contributors and the role id for each contributor assigned to the speaker
     */
    contributorJoins: SessionContributorJoin[];
    /**
     * The UUIDs of labels assigned to this session
     */
    labels: string[];
    /**
     * The UUIDs of resources assigned to this session
     */
    resources: string[];
    /**
     * The UUIDs of tracks assigned to this session
     */
    tracks: string[];
    /**
     * When the session was last modified in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this session
     */
    references?: SourceReferences | undefined;

}

Note that a session may not yet be scheduled by the Event Manager. In this case it will not have a start or end time, nor a location.

Tracks

{
    /**
     * The UUID for the track
     */
    id: string;
    /**
     * The name of the track
     */
    name: string;
    /**
     * The description of the track formatted in Markdown
     */
    description: string | null;
    /**
     * The description of the track formatted in HTML
     */
    description_HTML: string;
    /**
     * The color of the track formatted in HEX
     * eg #FF00B1
     */
    color: string | null;
    /**
     * The UUIDs of labels in this track
     */
    labels: string[];
    /**
     * The UUIDs of sessions in this track
     */
    sessions: string[];
    /**
     * When the track was last modified in UTC
     * eg 2022-02-04T18:03:03.662Z
     */
    lastModified: Date;
    /**
     * Any Data Sources referenced for this resource
     */
    references?: SourceReferences | undefined;

}

SessionContributorJoin

A session may have multiple contributors with different roles, eg chair or panel member.

{
    /**
     * The UUID of the contributor
     */
    contributor: string;
    /**
     * If the contributor has a specific role in this session then the UUID of their role. Null otherwise
     */
    role: string | null;
}

ContributorSessionJoin

A contributor may have different roles across different sessions, eg they may be a chair for one session and a panel member in another.

{
    /**
     * The UUID of the session
     */
    session: string;
    /**
     * If the contributor has a specific role in this session then the UUID of their role. Null otherwise
     */
    role: string | null;
}

Source References

If the event is using ‘Data Sources’ then a mapping between the URI of the source, and the ID’s of the objects at the source.

{ [sourceService: string]: string[] };

Webhook

If configured Lineup Ninja will call a webhook after a successful publish of the event. The webhook is called as a POST with this body:

{
    /**
     * The UUID of the event
     */
    eventId: string;
    /**
     * The name of the event
     */
    eventName: string;
    /**
     * The timestamp for the publication. You can use this to deduplicate calls to the webhook
     * It is in epoch time with milliseconds (A javascript timestamp)
     */
    publicationTimestamp: number;
    /**
     * The UUID for the integration. The customer may wish to configure multiple integrations per event,
     * for example to different staging and production events. this ID can uniquely identify them
     */
    integrationId: string;
}