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 URL for the speaker's GitHub Profile
     */
    github: string | null;
    /**
     * The URL for the speaker's Website
     */
    website: 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;
    /**
     * A URL for the speakers headshot at 512x512px
     */
    headshot4xURL: string | null;
    /**
     * A URL for the speakers headshot at 1024x1024px
     */
    headshot8xURL: string | null;
    /**
     * A URL to the speakers company logo, to fit within 128x128px
     */
    logoURL: string | null;
    /**
     * A URL to the speakers company logo, to fit within 256x256px
     */
    logo2xURL: string | null;
    /**
     * A URL to the speakers company logo, to fit within 512x512px
     */
    logo4xURL: string | null;
    /**
     * A URL to the speakers company logo, to fit within 1024x1024px
     */
    logo8xURL: 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;
    /**
     * Any data for Custom Fields for this speaker
     */
    customFieldData: CustomFieldData[];
}

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;
    /**
     * Any data for Custom Fields for this label
     */
    customFieldData: CustomFieldData[];
}

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 location
     */
    references?: SourceReferences | undefined;
    /**
     * Any data for Custom Fields for this location
     */
    customFieldData: CustomFieldData[];
}

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;
    /**
     * Any data for Custom Fields for this resource
     */
    customFieldData: CustomFieldData[];
}

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;
    /**
     * Any data for Custom Fields for this session
     */
    customFieldData: CustomFieldData[];
}

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;
    /**
     * Any data for Custom Fields for this resource
     */
    customFieldData: CustomFieldData[];
}

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;

    /**
     * If 'Speaker Ordering' is enabled for the event, the position, or order, for this speaker in the session. Null otherwise
     */
    position: number | 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[] };

Custom Field Data

An event may have Custom Fields. If data has been set for that item then the values will be returned in customFieldData

{
    /**
     * The UUID for this data
     */
    id: string;
    /**
     * The value for this data
     */
    value: string;
    /**
     * The UUID for this field
     */
    fieldId: string;
    /**
     * The type of field
     */
    fieldType:  'text' | 'textarea' | 'number' | 'checkbox' | 'radio' | 'email' | 'url' | 'date';
    /**
     * The name of the field
     */
    fieldName: 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;
}

How can I filter the published content?

You can filter which Speakers and Sessions will be published based on a number of criteria. Some common use cases for filters are:

  • Preventing ‘Placeholder’ sessions from being published
  • Holding back a Speaker who is not yet ready to be announced
  • Excluding sessions scheduled during the ‘build up’ day for the event
  • Only publishing speakers who have confirmed their slot
  • Removing a particular location, or track from the published schedule
  • Anything you can think of using labels!

For Speakers you can filter in 3 ways

  • Choose which speakers are to be published based on their relationship to sessions
    • (If Speaker Confirmation is enabled): Publish speakers that have a confirmed session that is published and not filtered out.
    • Publish speakers that are speaking on any session that is published and not filtered out.
    • Publish all speakers
    • Publish no speakers
  • Apply more granular filters with labels
    • Only publish speakers with a particular label. For example you might want to use a ‘Content Reviewed’ label to flag speakers that have had their content reviewed.
    • Exclude speakers with a particular label. For example you might want to exclude a ‘Do not publish’ label to prevent publishing of speakers who are not yet ready to be published.

For Sessions you can filter in numerous ways

  • Choose which sessions are to be published based on their relationship to speakers
    • Publish All Scheduled Sessions. Publishes sessions regardless of whether they have confirmed speakers or not.
    • (If Speaker Confirmation is enabled): Publish sessions that have one confirmed speaker.
    • (If Speaker Confirmation is enabled): Publish sessions that have all their speakers confirmed.
    • Publish All Sessions (available on Lineup Ninja Agenda App only)
  • Apply filters with labels
    • Only publish sessions with a particular label. For example you might want to use a ‘Content Reviewed’ label to flag sessions that have had their content reviewed.
    • Exclude session with a particular label. For example you might want to exclude a ‘Placeholder’ label to prevent publishing of sessions which are not yet populated.
  • Filter by location
    • Only publish sessions in a particular location, or locations. This can be useful if you are publishing an agenda for just one or two locations.
    • Exclude sessions in a particular location, or locations. This can be useful if you have scheduled sessions in your Green Room or similar back stage location.
  • Filter by resource
    • Only publish sessions needing a particular resource. This could be useful if you are producing an agenda for a particular team that manages some resources.
    • Exclude sessions needing a particular resource.
  • Filter by Date
    • Only publish sessions in a date or dates. Useful if you are producing an agenda for a particular day.
    • You can exclude a date or dates from your publication. Useful if you have dates for build up and tear down in your agenda.
  • Filter by Track
    • Only publish sessions in a particular track or tracks. Useful if you are producing separate agenda for separate parts of your event
    • Exclude sessions on a particular track. Can be useful to block presenting of a track until a product launch has happened.

To configure filters:

  • Click ‘Publish Agenda’
  • Click on the name for your existing publication
  • Click ‘Configure’
  • Expand the ‘Filter Speakers’ and ‘Filter Sessions’ sections and configure the filters you need
  • Save and republish