Assessments

📘

We recommend reading the Integration Plugins Overview first.

Overview

This documentation covers two components of the Integration Plugins Framework the createAssessment action workflow and the webhook processing mechanism. Together, these enable a complete integration cycle where the platform sends candidates to external assessment systems and receives status updates asynchronously.

Assessment Creation Flow

Lifecycle Overview

  1. User initiates "Send to ExampleAssessments" action (where ExampleAssessments is the name of the assessments provider/service defined by the plugin configuration)



  2. Pinpoint calls Action Meta Endpoint to build the form

  3. User fills and submits the form

  4. Platform calls Action Submit Endpoint to process

    1. The plugin calls the external system by passing the params from the form, webhook URL and redirect URL.
    2. External system (assessment provider) processes the request
      1. If the request is correct,
        1. The plugin should send a successful response with ID of the assessment from the external system.
        2. Pinpoint will then store the Assessment Record with ID of the assessment from the external system and request details.
        3. External system invites the candidate to perform the assessment (typically via email)
      2. If the external system rejects the request (validation errors, 5xx)
        1. The plugin should return an error response
        2. Pinpoint shows the errors on the form and allows the user to correct errors and submit again (go back to point 3)
  5. User completes the assessment

  6. External system sends webhook back to Pinpoint platform (using the webhook URL provided by the plugin)

  7. Pinpoint calls Webhook Process Endpoint to process (parse) the webhook payload

    1. Plugin extracts data from the webhook payload and responds with a structured payload to update the Assessment record
    2. Pinpoint updates the Assessment record and sends notifications about completed assessment (if requested by the plugin)
📘

All requests Pinpoint makes to the plugin are POST requests

Example implementations

We find it best to learn by looking at examples. Please find 2 example working implementations to get an idea of what is involved.

Example FastAPI implementation:

https://github.com/dwedigital/pinpoint_assessment_plugin_provider

Example Express.js implementation

https://github.com/dwedigital/pinpoint_assessment_plugin_express_example


createAssessment Action

Purpose

The createAssessment action enables users to send candidate information to an external assessment provider. This creates an assessment record in both the platform and the external system. It also handles the webhook response from the external system, which updates the assessment record in the platform.

Initial Set Up Endpoint (Meta Endpoint)

Endpoint: Defined by your service (e.g. / )

Called when: You initiate the setup of your plugin service. Pinpoint calls this endpoint when it registers the plugin in the system to get the name, logo and possible actions and configurations fields. You can see it as a handshake between Pinpoint (Integration Plugins Framework) and the plugin.

Responsibilities:

  • Create the integration in Pinpoint
  • Fetch configuration fields
  • Fetch form field data mappings

Response

Example Meta Response
{
          version: '1.0.0',
          name: 'ExampleAssessments',
          logoBase64: relative_base64_png('logo.png'),
          actions: [
            {
              key: 'createAssessment',
              label: 'Send to ExampleAssessments',
              iconSvgBase64: relative_base64_svg('action-logo.svg'),
              metaEndpoint: CREATE_ASSESSMENT_META_ENDPOINT,
              mappings: [
                { key: 'firstName', label: 'First Name', value: '{{candidate_first_name}}' },
                { key: 'lastName', label: 'Last Name', value: '{{candidate_last_name}}' },
                { key: 'email', label: 'Email', value: '{{{candidate_email}}}' },
                { key: 'cvDocument', value: '{{candidate_cv}}' },
              ],
            },
          ],
          webhookProcessEndpoint: WEBHOOK_PROCESS_ENDPOINT,
          webhookAuthenticationHeader: 'X-Verify',
          configurationFormFields: [
            {
              key: 'apiKey',
              label: 'API Key',
              description: "Your API key for ExampleAssessments. The correct key is #{CORRECT_API_KEY}",
              type: 'string',
              required: true,
              sensitive: true,
              useAsHttpHeader: 'X_EXAMPLE_ASSESSMENTS_KEY',
              placeholder: 'For example: uogKYdo4Foufve82P_*Mrpm7uu-bY2AwG7ur.usf',
            },
            {
              key: 'apiBaseUrl',
              label: 'Base URL',
              description:
                'Your Base URL for ExampleAssessments. Use `http://localhost:14568` if running local Sinatra server.',
              type: 'string',
              required: true,
              sensitive: false,
              useAsHttpHeader: 'X_EXAMPLE_BASE_URL',
              placeholder: 'For example: http://localhost:14568',
            },
            {
              key: 'mostRecentFirstName',
              label: 'Most Recent First Name',
              description:
                'The most recent first name that was successfully submitted, for persistence testing purposes',
              type: 'string',
              sensitive: false,
              placeholder: 'For example: Dave',
            },
          ],
        }

Meta response schema
FieldTypeRequiredValidationDescription
versionstringYesMust be '1.0.0'API version of the plugin interface
namestringYesNon-emptyDisplay name of the integration provider
logoBase64stringYesNon-emptyBase64-encoded logo image with data URI prefix (e.g., data:image/jpeg;base64,...)
actionsarrayYesSee Action Object SchemaList of action definitions supported by this integration. Typically just one action. For Assessments, it will be createAssessment
listEndpointsarrayOptionalSee List Endpoint Object SchemaEndpoints that return dynamic lists of options (for picklists/dropdowns/selects)
configurationFormFieldsarrayOptionalSee Configuration Form Field SchemaConfiguration form field definitions for plugin setup. Those will be displayed for the admin users in Pinpoint to configure the integration (e.g. API Key, Base URL, Default deadline days)
webhookProcessEndpointstringOptionalRelative endpoint path for processing webhooks (e.g., '/webhook/process')
webhookAuthenticationHeaderstringOptionalHTTP header name for webhook authentication (e.g., 'X-Verify-Token')
errorEndpointstringOptionalRelative endpoint for error handling/reporting
Action Object Schema
FieldTypeRequiredValidationDescription
keystringYesMust be a valid ActionKey (createAssessment)Defines the type of the action
labelstringYesNon-emptyDisplay label for the action in UI (e.g. Send to ExampleAssessments)
iconSvgBase64stringYesNon-emptyBase64-encoded SVG icon for the action (displayed next to the label)
metaEndpointstringYesNon-emptyRelative endpoint to fetch action-specific form fields. Called by the framework to render the form in the UI (after clicking the action button).
mappingsarrayOptionalSee Mapping Object SchemaDefault field mappings for this action
Configuration Form Fields Schema
FieldTypeRequiredValidationDescription
keystringYesNon-emptyUnique identifier for the configuration field
labelstringYesNon-emptyDisplay label for the field
typestringYesOne of: string, persisted_stringField type (persisted_string maintains value across actions)
actionKeystringOptionalMust be valid ActionKeyAssociates this config field with a specific action (when not provided, it will be sent to all actions)
defaultValuestringOptionalDefault value for the field
multilinebooleanOptionalWhether to render as textarea
placeholderstringOptionalPlaceholder text for the input
descriptionstringOptionalHelp text explaining the field
requiredbooleanOptionalWhether this field must be filled
readonlybooleanOptionalWhether the field is read-only
sensitivebooleanOptionalWhether this field contains sensitive data (encrypted and masked). Set to true for any fields storing credentials.
useAsHttpHeaderstringOptionalNon-emptyHTTP header name to include this value in requests (e.g., 'X-API-Key'). When set, the framework will add an HTTP header with the configured value when sending requests to all plugin endpoints.
singleSelectOptionsarrayOptionalSee Select Option ObjectOptions for single-select dropdown
multiSelectOptionsarrayOptionalSee Select Option ObjectOptions for multi-select dropdown
checkboxOptionsarrayOptionalSee Select Option ObjectOptions for checkbox group
radioOptionsarrayOptionalMax 3 options, See Select Option ObjectOptions for radio button group
Mapping Object Schema

Field

Type

Required

Description

key

string

Yes

Field identifier that references a form field

value

string

Yes

Default value or template variable (e.g., {{candidate_email}}).
Please find the list of possible values in a separate section.

label

string

Optional

Display label for the field

multiline

boolean

Optional

Whether this is a multiline text field

List Endpoint Object Schema
FieldTypeRequiredDescription
keystringYesUnique identifier for the list endpoint (e.g. locations)
labelstringYesDisplay label for the list
endpointstringYesRelative endpoint path to fetch the list (e.g./lists/locations)

Action Meta Endpoint

Endpoint: Defined in the meta response (at actions.[].metaEndpoint, e.g. /createAssessment/meta)

Called when: User clicks the action button in the UI (e.g. Send to ExampleAssessment)

Responsibilities:

  • Validate plugin configuration
  • Fetch dynamic options from external API (e.g., available tests)
  • Build the form fields

Dynamic form refetching

Plugins framework supports form re-rendering based on value selected by the user. Please find more information here

Response

Response Example

Return a form with all necessary fields:

{
  actionVersion: '1.0.0',
  key: 'createAssessment',
  label: 'Send to ExampleAssessments',
  description: 'Sends a candidate to the internal ExampleAssessments system',
  formFields: [
    {
      key: 'selectedTest',
      label: 'Selected Test',
      placeholder: 'Select test...',
      type: 'string',
      required: true,
      value: '',
      singleSelectOptions: options
    },
    {
      key: 'firstName',
      label: 'First Name',
      type: 'string',
      required: true,
      readonly: false,
    },
    {
      key: 'lastName',
      label: 'Last Name',
      type: 'string',
      required: true,
      readonly: false
    },
    {
      key: 'email',
      label: 'Email',
      type: 'string',
      required: true,
      readonly: false
    },
    {
      key: 'cvDocument',
      label: 'CV',
      type: 'file',
      required: false,
      readonly: false
    }
  ],
  submitEndpoint: CREATE_ASSESSMENT_SUBMIT_ENDPOINT
}
Response Schema
FieldTypeRequiredValidationDescription
actionVersionstringYesMust be 1.0.0Version of the action schema
keystringYesMust be createAssessmentAction identifier
labelstringYesNon-emptyDisplay label for the action (e.g. Send to ExampleAssessment
descriptionstringYesNon-emptyDescription of what this action does
formFieldsarrayYesSee Form Fields SchemaForm fields to display to the user
submitEndpointstringYesNon-emptyEndpoint to submit the form data to
Form Fields Schema

Field

Type

Required

Validation

Description

key

string

Yes

Non-empty

Unique identifier for the field (e.g. email, first_name)

label

string

Yes

Non-empty

Display label for the field

type

string

Yes

One of:
string,
callout,
heading,
date,
divider,
file,
files

Type of form field to render NOTE: Select/dropdown fields are of the string type, but requires specifying singleSelectOptions or multiSelectOptions (or their ListKeyvariations). Radio/checkbox and numbers are also of a string type.

value

string

Optional

Default or pre-filled value

placeholder

string

Optional

Placeholder text for input fields

description

string

Optional

Help text displayed below the field

multiline

boolean

Optional

Whether to render as a textarea

required

boolean

Optional

Whether the field must be filled

readonly

boolean

Optional

Whether the field is read-only

hidden

boolean

Optional

Whether the field is hidden from view

intent

string

Optional

One of: none, primary, success, warning, danger

Visual intent for callout fields

acceptedFileTypes

array

Optional

Array of: doc, docx, gif, jpeg, jpg, pdf, png, pptx, svg, xls, xlsx

Accepted file types for file/files fields

includeValueInRefetch

boolean

Optional

Include this field's value when refetching the form. This is useful when you want to re-render the form based on a selected value for this field.

performRefetchOnChange

boolean

Optional

Refetch the form when this field changes. This is useful when you want to re-render the form based on a selected value for this field. (e.g. when the user selects the location, you want to load a list of options for the departments field).

singleSelectOptions

array

Optional

See Select Option Object

Options for single-select dropdown

singleSelectOptionsListKey

string

Optional

Reference to a listEndpoint key for dynamic options. Must be a key of one of the endpoints defined in the listEndpoints array (of the meta response)

multiSelectOptions

array

Optional

See Select Option Object

Options for multi-select dropdown

multiSelectOptionsListKey

string

Optional

Same as for singleSelectOptionsListKey

checkboxOptions

array

Optional

See Select Option Object

Options for checkbox group

radioOptions

array

Optional

Max 3 options, See Select Option Object

Options for radio button group

Select Option Object Schema
FieldTypeRequiredDescription
labelstringYesDisplay text for the option
valuestringYesValue to submit when this option is selected

Action Submit Endpoint

Endpoint: Defined in meta response (via submitEndpoint, e.g. /createAssessment/submit)

Called when: User submits the form

Responsibilities:

  • Validate configuration and field values
  • Send assessment creation/inivte request to external system
  • Return success/error feedback

Payload

The platform sends several key pieces of data in the payload that can be used to facilitate some specific flows with third parties. Key fields are:

  • formFields - Form field values submitted by the user - use this to generate payload for assessment creation in assessment provider
  • configurationValues - Current configuration values from plugin setup (e.g. credentials)
  • generatedUuid - Unique identifier for this assessment instance - this is different for every request
  • generatedUuidRedirectUrl - URL to redirect candidates after assessment completion (to be shared with external system) - this is different for every request
  • webhookUrl - URL where an external system should send status updates to (status change, assessment completion, etc) - this is the same for every request. If your third party requests specific webhook URLs for each record, you can build a specific URL in your provider adding the generatedUuid in the query parameters.
Example payload
{
  payloadVersion: '1.0.0',
  key: 'createAssessment',
  formFields: [
    { key: 'selectedTest', value: 'cognitive-test' },
    { key: 'firstName', value: 'Example' },
    { key: 'email', value: '[email protected]' }
  ],
  configurationValues: [
    { key: 'cvDocument', value: 'https://example.com/cv.pdf' }
  ],
  generatedUuid: 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6',
  webhookUrl: 'https://app.pinpointhq.xyz/integration_plugins/webhooks/events/1ad84ce0-0e6f-4366-b939-834d63b8faf1',
  generatedUuidRedirectUrl: 'https://app.pinpointhq.xyz/integration_plugins/candidate_assessments/redirect/f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
}

Example Successful Response

{
  resultVersion: '1.0.0',
  key: 'createAssessment',
  success: true,
  assessmentName: 'Cognitive Assessment',
  status: 'pending',
  externalIdentifier: 'external-uuid-456',
  externalRecordUrl: 'https://api.example.com/api/external-uuid-456',
  message: 'Assessment was successfully sent to the candidate'
}

Example Error Response

{
  resultVersion: '1.0.0',
  key: 'createAssessment',
  success: false,
  toast: {
    error: 'Failed to send assessment to the candidate'
  },
  errors: {
    email: 'Email is invalid',
    firstName: 'First name is required',
    assessmentId: 'Assessment ID is required'
  }
}
Request Payload Schema

When the user submits the form, Pinpoint sends a POST request to your submit endpoint with the following payload structure:

FieldTypeRequiredValidationDescription
payloadVersionstringYesMust be '1.0.0'Version of the payload schema
keystringYesMust be 'createAssessment'Action identifier
formFieldsarrayYesSee Form Field Value ObjectUser-submitted form field values
configurationValuesarrayOptionalSee Configuration Value ObjectCurrent configuration values from plugin setup
webhookUrlstringOptionalNon-emptyURL for the provider to send webhooks to
generatedUuidstringOptionalNon-emptyUUID generated by Pinpoint for tracking this assessment instance
generatedUuidRedirectUrlstringOptionalNon-emptyURL to redirect candidates to after assessment completion
Form Field Value Object
FieldTypeRequiredDescription
keystringYesField identifier (matches the key from formFields in meta response)
valuestringOptionalUser-submitted value (null for empty fields)
Configuration Value Object
FieldTypeRequiredDescription
keystringYesConfiguration field key (from configurationFormFields)
valuestringOptionalConfiguration value (nullable)

Response Schema

Your endpoint must return a response following this schema:

Success Response
FieldTypeRequiredValidationDescription
resultVersionstringYesMust be '1.0.0'Version of the result schema
keystringYesMust be 'createAssessment'Action identifier
successbooleanYesMust be trueIndicates successful assessment creation
assessmentNamestringYesNon-emptyName of the assessment (displayed in Pinpoint UI)
externalIdentifierstringYesNon-emptyID of the assessment in the external system (used to match webhook updates)
statusstringOptionalValid assessment statusCurrent status of the assessment (e.g., pending, in_progress, completed)
detailedStatusstringOptionalValid detailed statusMore specific status information
externalSystemstringOptionalNon-emptyName of the external assessment system
externalRecordUrlstringOptionalNon-emptyURL to view the assessment in the external system
externalLinksarrayOptionalSee External Link Object SchemaAdditional links related to the assessment
messagestringOptionalSuccess or informational message displayed to the user
toastobjectOptionalSee Toast Object SchemaToast notifications to display in the UI
persistarrayOptionalSee Persist Object SchemaConfiguration values to persist for future use
Error Response

If validation fails or the external system rejects the request, return:

FieldTypeRequiredValidationDescription
successbooleanYesMust be falseIndicates failure
toastobjectOptionalSee Toast Object SchemaToast notifications to display
errorsarrayOptionalSee Field Error Object SchemaField-specific validation errors
Toast Object Schema
FieldTypeRequiredDescription
errorstringOptionalError message to display
warningstringOptionalWarning message to display
infostringOptionalInformational message to display
successstringOptionalSuccess message to display
Field Error Object Schema
FieldTypeRequiredDescription
keystringYesField identifier that has the error
errorstringYesError message for the field
Persist Object Schema

The persist array allows storing values back to the plugin configuration. These values become available in subsequent API calls through configurationValues in the payload. It is a way to update a plugin configuration field(s) based on the response of an external system.

FieldTypeRequiredDescription
keystringYesConfiguration field key to update
valuestringYesNew value to persist (will be available in configurationValues on future requests)
External Link Object Schema
FieldTypeRequiredDescription
keystringYesUnique identifier for the link
labelstringYesDisplay text for the link button
urlstringYesURL to navigate to when clicked

Webhook Processing

Purpose

Webhooks enable external assessment systems to push status updates back to the platform asynchronously. This eliminates the need for polling and provides real-time updates.

The flow looks like this:

  1. External system sends a POST request to the webhookUrl (which was sent in the payload to the submit endpoint and plugin sent it to the external system).
  2. Plugins Framework receives the webhook, finds the plugin instance based on the ID in the webhookUrl responds with 200 OK and schedules the background job to process the webhook payload.
  3. The framework's background job does the following:
    1. Sends a webhook request (with the original payload form the extrenal system) to the plugin's webhook endpoint.
    2. Plugin processes the webhook payload and returns a structured response which the framework uses to update the assessment record in the platform.
    3. The framework updates the assessment record in the platform with the parameters returned by the plugin and sends notifications to Pinpoint users (if requested).

Webhook Configuration

Define the webhook process endpoint in the meta response via webhookProcessEndpoint field.

Webhook Process Endpoint

Endpoint: Defined in meta response (e.g., /webhook/process)

Called when: External system POSTs to the platform's webhook URL

Responsibilities:

  • Parse webhook payload
  • Extract assessment updates
  • Return structured update instructions

Payload

Example request payload
{
  "body": "{\"status\":\"completed\", \"id\":\"external-uuid-123\", \"assessmentName\":\"Cognitive Assessment\"}",
  "headers": {
    "Content-Type": "application/json"
  },
  "configurationValues": [
    {
      "key": "apiKey",
      "value": "apwu498roa9wejrfahow4u"
    }
  ]
}
Request Payload Schema

When an external system sends a webhook to Pinpoint, the platform forwards the request to your webhook process endpoint with this payload:

FieldTypeRequiredDescription
bodystringYesThe raw body of the webhook request from the external system (typically JSON stringified, but can also be XML)
headersobjectOptionalHTTP headers from the original webhook request
configurationValuesarrayOptionalCurrent configuration values (same structure as in submit endpoint)
💡

The body field contains the raw webhook payload as a string. You'll need to parse it (e.g., JSON.parse(payload['body'])) to extract the data from your external assessment system.

Response

Example successful response
Response Schema

Your webhook process endpoint must return a response following this schema:

FieldTypeRequiredValidationDescription
resultVersionstringYesMust be '1.0.0'Version of the result schema
successbooleanYesMust be trueWhether the webhook processing succeeded
updateAssessmentsarrayOptionalSee Update Assessment Object SchemaList of assessment updates to apply
Update Assessment Object Schema

Each object in the updateAssessments array should follow this structure:

FieldTypeRequiredValidationDescription
externalIdentifierstringYesNon-emptyID of the assessment in the external system (must match the externalIdentifier returned from submit endpoint)
statusstring(enum)OptionalValid assessment statusNew status for the assessment (e.g., 'completed', 'in_progress', 'failed')
detailedStatusstringOptionalValid detailed statusMore specific status information (e.g. 'Needs manual review')
scoreintegerOptionalNullableAssessment score (if available)
externalLinksarrayOptionalSee External Link Object SchemaLinks to view results or reports
shouldNotifybooleanOptionalNullableWhether to send notifications about this update (set to true to trigger email notifications to hiring team). Notification should only be sent once when the assessment is completed, so set it to true only if the status is completed and you don't expect more webhooks for a given assessment.
📘

Why this is an Array? Although webhooks typically update a single assessment, the array structure allows for batch updates in future implementations and provides consistency with other update patterns.

External Link Object Schema
FieldTypeRequiredDescription
keystringYesUnique identifier for the link
labelstringYesDisplay text for the link button
urlstringYesURL to navigate to when clicked

Example of the webhook process logic

def self.webhook_process(payload:, headers: nil)
  api_base_url = headers&.dig(API_BASE_URL_HEADER)
  parsed_body = JSON.parse(payload['body'])
  
  *# Extract assessment data*
  external_guid = parsed_body['id']
  status = parsed_body['status'] if ALLOWED_STATUSES.include?(parsed_body['status'])
  detailed_status = parsed_body['detailed_status']
  score = parsed_body['score']
  report_path = parsed_body['report_path']
  report_url = "#{api_base_url}/#{report_path}"
  
  *# Build assessment update*
  assessment_update = {
    externalIdentifier: external_guid,  # Matches externalIdentifier from submit
    score: score,
    shouldNotify: true,  # Trigger platform notifications
    externalLinks: [
      { key: 'report', label: 'Report', url: report_url }
    ]
  }
  
  # Optional fields*
  assessment_update['status'] = status if status
  assessment_update['detailedStatus'] = detailed_status if detailed_status
  
  # Return array of updates (can update multiple assessments)
  {
    resultVersion: '1.0.0',
    success: true,
    updateAssessments: [assessment_update]
  }
end

External Links

External links appear in the platform UI as actionable buttons/links:

{
  key: 'report',           # Unique identifier
  label: 'View Report',    # Display text
  url: 'https://...'       # Destination URL
}

These allow users to quickly access related resources in the external system. This is typically used for assessment report URLs (link to PDF or assessment page in the external system).


Complete Integration Flow Example

Note: This is a simplified example of the complete flow (payloads are not complete).

1. User Sends Candidate to Assessment

Platform → Plugin (Action Meta Endpoint)

ruby

GET /createAssessment/meta

Plugin → Platform

ruby

{
  formFields: [
    { key: 'selectedTest', type: 'string', singleSelectOptions: [...] },
    { key: 'firstName', type: 'string', value: 'John' },
    { key: 'email', type: 'string', value: '[email protected]' }
  ],
  submitEndpoint: '/createAssessment/submit'
}

2. User Submits Form

Platform → Plugin (Submit Endpoint)

POST /createAssessment/submit
{
  formFields: [
    { key: 'selectedTest', value: 'cognitive-test' },
    { key: 'firstName', value: 'Example' },
    { key: 'email', value: '[email protected]' }
  ],
  generatedUuid: 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6',
  webhookUrl: 'https://app.pinpointhq.xyz/integration_plugins/webhooks/events/1ad84ce0-0e6f-4366-b939-834d63b8faf1',
  generatedUuidRedirectUrl: 'https://app.pinpointhq.xyz/integration_plugins/candidate_assessments/redirect/f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
}

3. Plugin Creates Assessment

Plugin → External Assessment System

POST https://api.example.com/api/assessments
{
  name: 'Example Test',
  email: '[email protected]',
  webhook_url: 'https://app.pinpointhq.xyz/integration_plugins/webhooks/events/1ad84ce0-0e6f-4366-b939-834d63b8faf1?uuid=81d4fae-7dec-11d0-a765-00a0c91e6bf6',
  platform_url: 'https://app.pinpointhq.xyz/integration_plugins/candidate_assessments/redirect/f81d4fae-7dec-11d0-a765-00a0c91e6bf6',
  uuid: 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
}

External System → Plugin

{
  id: 'external-uuid-456',
  status: 'pending',
  description: 'Cognitive Assessment'
}

4. Plugin Returns Success (or Error) Response

Plugin → Platform

{
  success: true,
  assessmentName: 'Cognitive Assessment',
  status: 'pending',
  externalIdentifier: 'external-uuid-456',
  externalRecordUrl: 'https://api.example.com/api/external-uuid-456',
  message: 'Assessment was successfully sent...'
}

5. Candidate Completes Assessment

External System → Platform (Webhook)

POST https://app.pinpointhq.xyz/integration_plugins/webhooks/events/1ad84ce0-0e6f-4366-b939-834d63b8faf1
{
  id: 'external-uuid-456',
  status: 'completed',
  detailed_status: 'Scored 85/100',
  score: 85,
  report_path: 'reports/external-uuid-456'
}

6. Platform Processes Webhook

Pinpoint passes back the payload it receives at the webhook endpoint to the provider to carry out any custom logic and return a result to complete the assessment update

Platform → Plugin (Webhook Process)

POST /webhook
{
  body: '{"id":"external-uuid-456","status":"completed",...}'
}

Plugin → Platform

{
  success: true,
  updateAssessments: [
    {
      externalIdentifier: 'external-uuid-456',
      status: 'completed',
      score: 85,
      shouldNotify: true,
      externalLinks: [
        { key: 'report', label: 'Report', url: 'https://api.example.com/reports/...' }
      ]
    }
  ]
}