Salesforce Platform Architect Portfolio

Governance, Architecture, and Living Documentation

Salesforce System API (SAPI) v1.4.0

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

System API exposing core Salesforce objects for the Portfolio.

Deprecation of version 1

Version 1 is deprecated and has a sunset date. Use version 2 (X-API-Version: v2, documented in salesforce-sapi-v2.yaml), which returns public keys only. The sunset date is 30 days after version 2 reaches production.

  • Before the sunset date: every version 1 response carries a Deprecation header (RFC 9745), a Link header pointing at the version 2 reference, https://ryanbumstead.com/api-lab/reference?version=v2, and, once the sunset date is set, a Sunset header (RFC 8594) with that date. The body is unchanged.
  • After the sunset date: every version 1 call returns 410 Gone in the standard error envelope with errorCode GONE, a short message and the link to the version 2 reference. No data is returned.

Authentication (ADR-027)

  1. Inbound: OAuth 2.0 Client Credentials issued by the Portfolio API External Client App. Every request carries Authorization: Bearer <access_token>. The platform rejects missing, expired or invalid tokens before any Apex executes.
    • Run-as identity: a dedicated integration user holding a single read-only permission set (Integration_Access). Authorisation is bounded by that permission set, not by the token.
    • Previous design: client_id/client_secret headers validated in Apex against Custom Metadata (ADR-017, superseded). Retired when MuleSoft left the architecture.
  2. On-platform consumers: the site API Lab proxy and the PAPI health check obtain tokens through the Portfolio_API Named Credential (External Credential, Client Credentials principal). No secret is stored in metadata, source, or the browser.
  3. External evaluators: request a short-lived token from POST /papi/v1/auth/token (see the PAPI specification, ADR-028), then call this API with it.

Architecture & Governance

  • Read-Only Design: This System API is strictly read-only (GET methods only) by design to minimize attack surface and enforce unidirectional data flow.
  • ID Strategy (ADR-038): Every record carries a stable public key, for example prj_8f3k2m9qtz, and key is the identifier to use. The id field is the 18-character Salesforce Id, kept in v1 so existing clients keep working, and it is deprecated. Each reference has the same pair (projectId and projectKey). Every parameter that takes an Id (projectId, experienceId, certificationId, and the /projects path segment) also takes the key. A key is set once, never changes, and never carries a name. Version 2 removes id and every Id reference field.
  • Traceability: Each API resource maps 1:1 to an Apex @RestResource class (SAPI<Resource>), and every class runs through the shared ApiRequestContext.

Non-Functional Requirements (NFRs)

  • Observability: X-Request-Id mandatory in Request/Response for distributed tracing. A missing or non-UUID value returns 400 BAD_REQUEST (ApiRequestContext.applyRequestRules). The platform echoes a caller-supplied value on every response; Apex sets the header only when it generated the value (ADR-026).
  • Latency: Target < 500ms for internal processing.
  • Resilience: 120 requests per minute per caller key, enforced by RateWindowLimiter (ADR-025), with 429 responses and Retry-After headers. Every vended evaluator token is the same session, so all evaluators share one key and one limit of 120 per minute (ADR-028).
  • Caching Strategy:
    • Public Data (Skills, Projects, Junctions): Cache-Control: max-age=300, public.
    • Private Data (Contact, Config): Cache-Control: max-age=300, private or no-store.

Design Constraints & Trade-offs

  • Pagination: Offset-based pagination implemented for simplicity (<200 records).
    • Enterprise Note: For volumes >2,000, this would be refactored to Keyset/Cursor Pagination (WHERE Id > lastSeenId).
  • Versioning: Header version (X-API-Version) takes precedence over URL versioning. A missing header resolves to v1; any other value returns 400 BAD_REQUEST with message Unsupported X-API-Version (ADR-026). Both X-Request-Id and X-API-Version are echoed on every response.

Base URLs:

Email: Ryan Bumstead License: MIT

Authentication

  • oAuth2 authentication. OAuth 2.0 Client Credentials flow issued by the Portfolio API External Client App (ADR-027). Tokens run as the read-only integration user. External evaluators obtain a short-lived token from POST /papi/v1/auth/token (ADR-028) instead of holding the consumer secret. Every evaluator receives the same session, so all evaluators share one rate limit.

Scope Scope Description
api Access Salesforce REST APIs as the integration user

Monitoring

Health checks and observability endpoints.

getHealth

Code samples


const headers = {
  'Accept':'application/json',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/health',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /health

Health Check

Shallow check: runtime availability, the current transaction’s governor-limit snapshot and org time (SAPIHealth.getHealth, payload from SAPIHealth.buildPayload). checkType is always SHALLOW.

Example responses

200 Response

{
  "status": "UP",
  "checkType": "SHALLOW",
  "timestamp": "2019-08-24T14:15:22Z",
  "orgTimeZone": "America/Chicago",
  "dependencies": {
    "salesforce": "UP"
  },
  "limits": {
    "queries": {
      "used": 1,
      "limit": 100
    },
    "dmlStatements": {
      "used": 1,
      "limit": 100
    },
    "callouts": {
      "used": 1,
      "limit": 100
    },
    "cpuTimeMs": {
      "used": 1,
      "limit": 100
    },
    "heapBytes": {
      "used": 1,
      "limit": 100
    }
  }
}

Responses

Status Meaning Description Schema
200 OK Service is UP. HealthStatus

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 Cache-Control string   No-cache for health checks.

Profile

Core candidate information (Contact, Experience, Education).

getContacts

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/contacts',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /contacts

Get Contact records

Retrieves the primary contact details for the portfolio owner. Returns only the Contact flagged as the portfolio owner (Is_Portfolio_Owner__c).

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
contactName query string false Filter by Contact Name.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "0035e00000B2O3DAAV",
    "key": "con_7c5j3w9sfa",
    "name": "Ryan Bumstead",
    "title": "Platform Architect",
    "trailhead": "https://trailblazer.me/id/rbumstead",
    "careerObjective": "Driving digital transformation...",
    "linkedIn": "https://linkedin.com/in/ryanbumstead",
    "portfolio": "https://ryanbumstead.com"
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Contact records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Contact] false none [Contact Information Schema. The contact’s email and phone are never returned.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Full Name
» title string false none Job Title
» trailhead string(uri)¦null false none Trailhead Profile URL
» careerObjective string¦null false none Short Professional Summary
» linkedIn string(uri)¦null false none LinkedIn Profile URL
» portfolio string(uri)¦null false none Portfolio Website URL

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directive to prevent caching of sensitive/dynamic data.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getExperience

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/experience',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /experience

Get Experience records

Retrieves professional experience history.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
contactName query string false Filter by Contact Name.
employerName query string false Filter by Employer Name.
currentlyEmployed query boolean false Filter by active employment status.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a025e00000B2O3DAAV",
    "key": "exp_4h7n2c8wpd",
    "employerName": "Salesforce",
    "employerId": "0015e00000A1O3DAAV",
    "employerKey": "acc_2t8e6y4mgb",
    "name": "Technical Architect",
    "startDate": "2023-01-01",
    "endDate": "2025-01-01",
    "isCurrentRole": true,
    "isRemote": true,
    "accomplishments": "<ul><li>Led 5 successful deployments</li></ul>",
    "contactId": "0035e00000B2O3DAAV",
    "contactKey": "con_7c5j3w9sfa",
    "contactName": "Ryan Bumstead",
    "sortOrder": 10
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Experience records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Experience] false none [Professional Experience Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» employerName string false none Employer Name
» employerId string false none Employer Account ID. Deprecated, use employerKey.
» employerKey string false none Public key of the employer. Use it in place of employerId.
» name string false none Role Title
» startDate string(date) false none Start Date
» endDate string(date)¦null false none End Date (null if current)
» isCurrentRole boolean false read-only Is Current Role Flag
» isRemote boolean false none Remote Work Flag
» accomplishments string¦null false none DEPRECATED: Use /experience-highlights endpoint instead. This field will be removed in SAPI v2.0.0.
» contactId string false none Contact ID. Deprecated, use contactKey.
» contactKey string false none Public key of the contact. Use it in place of contactId.
» contactName string false none Contact Name
» sortOrder number¦null false none Sort Order

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directive to prevent caching of sensitive/dynamic data.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getExperienceHighlights

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/experience-highlights',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /experience-highlights

Get Experience Highlights

Fetches resume bullets. Supports Persona filtering for PAPI optimization. A malformed experienceId or an unknown persona value returns 400.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
experienceId query string false Filter by Experience public key (for example exp_4h7n2c8wpd) or Salesforce ID. The Salesforce ID is deprecated.
persona query string false Filters records where the target field (Multi-Select Picklist) includes the specified persona(s).
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Detailed descriptions

persona: Filters records where the target field (Multi-Select Picklist) includes the specified persona(s). Takes a single value or a comma-separated list of Admin, Developer and Architect. An unknown value returns 400.

Examples:

  • Single: ?persona=Admin
  • Multiple (comma): ?persona=Admin,Developer

Example responses

200 Response

[
  {
    "id": "a035e00000B2O3DAAV",
    "key": "hlt_9d3p7k5vxn",
    "experienceId": "a025e00000B2O3DAAV",
    "experienceKey": "exp_4h7n2c8wpd",
    "experienceName": "Technical Architect",
    "name": "DevOps Transformation",
    "description": "Implemented CI/CD pipelines reducing deployment time by 80%.",
    "sortOrder": 1,
    "personaTag": "Developer;Architect"
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Experience Highlights. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [ExperienceHighlight] false none [Experience Bullet Point Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» experienceId string false none Parent Experience ID. Deprecated, use experienceKey.
» experienceKey string false none Public key of the experience. Use it in place of experienceId.
» experienceName string false none Parent Experience Name
» name string false none Highlight Title
» description string false none Detailed Description
» sortOrder number false none Sort Order
» personaTag string false none Semicolon-separated Persona values from the Persona_Tag__c multi-select picklist (Admin, Developer, Architect).

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directive to prevent caching of sensitive/dynamic data.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

Objects

Portfolio entities (Projects, Skills, Certifications).

getProjects

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/projects',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /projects

Get Project records

Retrieves portfolio projects. Example Usage: /projects?isFeatured=true

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
status query ProjectStatus false Filter by Project Status.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.
contactName query string false Filter by Contact Name.
projectName query string false Filter by Project Name.
isFeatured query boolean false Filter only featured projects.

Enumerated Values

Parameter Value
status Live – In Production
status Live – Demo / Reference
status Active Development
status On Hold
status Archived

Example responses

200 Response

[
  {
    "id": "a015e00000B2O3DAAV",
    "key": "prj_8f3k2m9qtz",
    "name": "Global CRM Migration",
    "challenge": "Legacy system had 5M duplicate records.",
    "solution": "Implemented MDM strategy using Data Cloud.",
    "businessValue": "Reduced data storage costs by 40%.",
    "status": "Active Development",
    "dateCompleted": "2025-12-01",
    "heroImageUrl": "https://example.com/images/hero.jpg",
    "liveUrl": "https://example.com/demo",
    "repositoryUrl": "https://github.com/rdbumstead/project",
    "pillar": "A",
    "pillarLabel": "Pillar A: Business Architecture",
    "isFeatured": true,
    "contactName": "Ryan Bumstead",
    "contactId": "0035e00000B2O3DAAV",
    "contactKey": "con_7c5j3w9sfa",
    "sortOrder": 10
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Project records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Project] false none [Portfolio Project Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Project Name
» challenge string¦null false none STAR Method: Situation/Task
» solution string¦null false none STAR Method: Action
» businessValue string¦null false none STAR Method: Result
» status ProjectStatus false none Project Lifecycle Status
» dateCompleted string(date)¦null false none Completion Date
» heroImageUrl string(uri)¦null false none Banner Image URL
» liveUrl string(uri)¦null false none Live Demo URL
» repositoryUrl string(uri)¦null false none Code Repository URL
» pillar string¦null false none Architectural Pillar
» pillarLabel string¦null false none Architectural Pillar Label
» isFeatured boolean false none Featured Flag for Home Page
» contactName string false none Owner Name
» contactId string false none Owner ID. Deprecated, use contactKey.
» contactKey string false none Public key of the contact. Use it in place of contactId.
» sortOrder number¦null false none Display Sort Order

Enumerated Values

Property Value
status Live – In Production
status Live – Demo / Reference
status Active Development
status On Hold
status Archived

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getProjectAssets

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/project-assets',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /project-assets

Get Project Assets

Retrieves assets (images, links) associated with a project. A malformed Salesforce Id filter returns 400.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
projectId query string false Filter by Project public key (for example prj_8f3k2m9qtz) or Salesforce ID. The Salesforce ID is deprecated.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a045e00000B2O3DAAV",
    "key": "pas_4n7s3f9tdk",
    "name": "Architecture Diagram",
    "projectId": "a015e00000B2O3DAAV",
    "projectKey": "prj_8f3k2m9qtz",
    "projectName": "Global CRM Migration",
    "type": "Image",
    "externalUrl": "https://example.com/images/diagram.png",
    "altText": "C4 Model System Context Diagram",
    "sortOrder": 1
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Project Assets. Returns empty array if none found. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [ProjectAsset] false none [Project Asset (Image/Video) Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Asset Name
» projectId string false none Parent Project ID. Deprecated, use projectKey.
» projectKey string false none Public key of the project. Use it in place of projectId.
» projectName string false none Parent Project Name
» type AssetType false none Asset Type
» externalUrl string(uri) false none Asset URL
» altText string¦null false none Accessibility Alt Text
» sortOrder number false none Sort Order

Enumerated Values

Property Value
type Image
type Video
type Document
type Link

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getTestimonials

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/testimonials',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /testimonials

Get Testimonials

Retrieves received testimonials. Returns only records where Approved__c = true.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a055e00000B2O3DAAV",
    "key": "tst_2y7a5d9wmh",
    "name": "Testimonial from Jane Doe",
    "authorName": "Jane Doe",
    "authorTitle": "CTO, Tech Corp",
    "avatarUrl": "https://example.com/images/avatar.jpg",
    "relationshipType": "Manager",
    "vibeMode": "Professional",
    "context": "Worked together on the Q1 digital transformation."
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Testimonials. Returns empty array if none found. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Testimonial] false none [Social Proof Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Testimonial Name
» authorName string false none Author Name
» authorTitle string¦null false none Author Title
» avatarUrl string(uri)¦null false none Author Avatar URL
» relationshipType RelationshipType false none Professional Relationship
» vibeMode VibeMode false none Tone/Style Category
» context string¦null false none Context of Work

Enumerated Values

Property Value
relationshipType Manager
relationshipType Peer
relationshipType Client
relationshipType Recruiter
relationshipType Fan
vibeMode Professional
vibeMode Casual

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directive to prevent caching of sensitive/dynamic data.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getAccounts

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/accounts',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /accounts

Get Account records

Retrieves related account/employer records.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
accountName query string false Filter by Account Name.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "0015e00000A1O3DAAV",
    "key": "acc_2t8e6y4mgb",
    "name": "Salesforce",
    "industry": "Technology",
    "abbreviation": "SFDC"
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Account records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Account] false none [Account/Employer Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Account Name
» industry string¦null false none Industry
» abbreviation string¦null false none Abbreviation

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getSkills

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/skills',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /skills

Get Skill records

Retrieves technical skills and proficiency scores.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
category query string false Filter skills by Category, one of the Skill Category picklist values, for example ‘Backend’, ‘Frontend’ or ‘Integration’.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a075e00000B2O3DAAV",
    "key": "skl_3m9x5b2rkt",
    "name": "Apex",
    "displayName": "Salesforce Apex",
    "category": "Development",
    "proficiencyScore": 5,
    "iconName": "utility:code",
    "svgPathData": "M10...",
    "colorHex": "#0070d2",
    "categoryOrder": 10
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Skill records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Skill] false none [Skill Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Skill Name
» displayName string¦null false none Display Name
» category string false none Skill Category
» proficiencyScore number false none Self-Reported Proficiency
» iconName string¦null false none Icon Name
» svgPathData string¦null false none SVG Path Data
» colorHex string¦null false none Category Color Hex
» categoryOrder number false none Category Order

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getCertifications

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/certifications',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /certifications

Get Certification records

Retrieves professional certifications.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
contactName query string false Filter by Contact Name.
issuerName query string false Filter by Issuer Name.
certificationName query string false Filter by Certification Name.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a105e00000B2O3DAAV",
    "key": "crt_6q2v8d4nhz",
    "name": "Application Architect",
    "contactId": "0035e00000B2O3DAAV",
    "contactKey": "con_7c5j3w9sfa",
    "contactName": "Ryan Bumstead",
    "issuerId": "0015e00000A1O3DAAV",
    "issuerKey": "acc_2t8e6y4mgb",
    "issuerName": "Salesforce",
    "earnedDate": "2024-05-15"
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Certification records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Certification] false none [Certification Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Certification Name
» contactId string false none Contact ID. Deprecated, use contactKey.
» contactKey string false none Public key of the contact. Use it in place of contactId.
» contactName string false none Contact Name
» issuerId string false none Issuer Account ID. Deprecated, use issuerKey.
» issuerKey string false none Public key of the issuer. Use it in place of issuerId.
» issuerName string false none Issuer Name
» earnedDate string(date) false none Date Earned

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getEducation

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/education',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /education

Get Education records

Retrieves educational background.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
contactName query string false Filter by Contact Name.
issuerName query string false Filter by Issuer Name.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a115e00000B2O3DAAV",
    "key": "edu_6b4c8j2rvq",
    "name": "Bachelor of Science",
    "contactId": "0035e00000B2O3DAAV",
    "contactKey": "con_7c5j3w9sfa",
    "contactName": "Ryan Bumstead",
    "issuerId": "0015e00000A1O3DAAV",
    "issuerKey": "acc_2t8e6y4mgb",
    "issuerName": "University of Technology",
    "fieldOfStudy": "Computer Science",
    "graduationDate": "2018-05-01",
    "gpa": 3.8
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Education records. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Education] false none [Education Schema.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» name string false none Degree Name
» contactId string false none Contact ID. Deprecated, use contactKey.
» contactKey string false none Public key of the contact. Use it in place of contactId.
» contactName string false none Contact Name
» issuerId string false none University Account ID. Deprecated, use issuerKey.
» issuerKey string false none Public key of the issuer. Use it in place of issuerId.
» issuerName string false none University Name
» fieldOfStudy string false none Field of Study
» graduationDate string(date) false none Graduation Date
» gpa number¦null false none GPA

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

Junctions

Many-to-many relationships (Project-Skills, Experience-Skills).

getProjectSkills

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/project-skills',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /project-skills

Get Project-Skill Links

Retrieves junction records linking Projects to Skills. A malformed Salesforce Id filter returns 400.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
projectId query string false Filter by Project public key (for example prj_8f3k2m9qtz) or Salesforce ID. The Salesforce ID is deprecated.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a065e00000B2O3DAAV",
    "key": "prs_8w2m6g4bha",
    "projectId": "a015e00000B2O3DAAV",
    "projectKey": "prj_8f3k2m9qtz",
    "projectName": "Global CRM Migration",
    "skillId": "a075e00000B2O3DAAV",
    "skillKey": "skl_3m9x5b2rkt",
    "skillName": "Apex",
    "skillCategory": "Backend Development",
    "skillProficiencyScore": 5
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Project-Skill junctions. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [ProjectSkill] false none [Junction Object: Project <-> Skill.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» projectId string false none Project ID. Deprecated, use projectKey.
» projectKey string false none Public key of the project. Use it in place of projectId.
» projectName string false none Project Name
» skillId string false none Skill ID. Deprecated, use skillKey.
» skillKey string false none Public key of the skill. Use it in place of skillId.
» skillName string false none Skill Name
» skillCategory string false none Skill Category
» skillProficiencyScore number false none Proficiency Score

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getExperienceSkills

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/experience-skills',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /experience-skills

Get Experience-Skill Links

Retrieves junction records linking Experiences to Skills. A malformed Salesforce Id filter returns 400.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
experienceId query string false Filter by Experience public key (for example exp_4h7n2c8wpd) or Salesforce ID. The Salesforce ID is deprecated.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a085e00000B2O3DAAV",
    "key": "exs_5r8h2q6cjw",
    "experienceId": "a025e00000B2O3DAAV",
    "experienceKey": "exp_4h7n2c8wpd",
    "experienceName": "Technical Architect",
    "skillId": "a075e00000B2O3DAAV",
    "skillKey": "skl_3m9x5b2rkt",
    "skillName": "LWC",
    "skillCategory": "Frontend Development",
    "skillProficiencyScore": 4
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Experience-Skill junctions. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [ExperienceSkill] false none [Junction Object: Experience <-> Skill.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» experienceId string false none Experience ID. Deprecated, use experienceKey.
» experienceKey string false none Public key of the experience. Use it in place of experienceId.
» experienceName string false none Experience Name
» skillId string false none Skill ID. Deprecated, use skillKey.
» skillKey string false none Public key of the skill. Use it in place of skillId.
» skillName string false none Skill Name
» skillCategory string false none Skill Category
» skillProficiencyScore number false none Proficiency Score

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

getCertificationSkills

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/certification-skills',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /certification-skills

Get Certification-Skill Links

Retrieves junction records linking Certifications to Skills. A malformed Salesforce Id filter returns 400.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).
certificationId query string false Filter by Certification public key (for example crt_6q2v8d4nhz) or Salesforce ID. The Salesforce ID is deprecated.
limit query integer false Maximum number of records to return.
offset query integer false Pagination offset.

Example responses

200 Response

[
  {
    "id": "a095e00000B2O3DAAV",
    "key": "cks_3k9z5x7pne",
    "certificationId": "a105e00000B2O3DAAV",
    "certificationKey": "crt_6q2v8d4nhz",
    "certificationName": "Salesforce Certified Application Architect",
    "skillId": "a075e00000B2O3DAAV",
    "skillKey": "skl_3m9x5b2rkt",
    "skillName": "Security",
    "skillCategory": "Architecture",
    "skillProficiencyScore": 5
  }
]

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Certification-Skill junctions. Inline
400 Bad Request Invalid request parameters or schema validation failure. Error
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [CertificationSkill] false none [Junction Object: Certification <-> Skill.]
» id string false read-only Salesforce Record ID. Deprecated, use key.
» key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
» certificationId string false none Certification ID. Deprecated, use certificationKey.
» certificationKey string false none Public key of the certification. Use it in place of certificationId.
» certificationName string false none Certification Name
» skillId string false none Skill ID. Deprecated, use skillKey.
» skillKey string false none Public key of the skill. Use it in place of skillId.
» skillName string false none Skill Name
» skillCategory string false none Skill Category
» skillProficiencyScore number false none Proficiency Score

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 X-Total-Count integer   Total number of records that match the request, so a filtered list reports the filtered total. With no filter it is every record the resource can return. The total is the same on every page of one request.
200 X-Has-More boolean   Boolean indicator if more records exist beyond the current offset.
200 Cache-Control string   Directives for caching mechanisms in both requests and responses.
400 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

Configuration

Global portfolio settings.

getPortfolioConfig

Code samples


const headers = {
  'Accept':'application/json',
  'X-API-Version':'v1',
  'X-Request-Id':'497f6eca-6276-4993-bfeb-53cbbbba6f08',
  'Authorization':'Bearer {access-token}'
};

fetch('https://{domain}/services/apexrest/sapi/v1/portfolio-config',
{
  method: 'GET',

  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

GET /portfolio-config

Get Portfolio Configuration

Returns the singleton Global Configuration object (Metadata-driven). Not pageable.

Parameters

Name In Type Required Description
X-API-Version header string false API Contract Version. Missing resolves to v1; any other value returns 400 BAD_REQUEST with message ‘Unsupported X-API-Version’ (ADR-026).
X-Request-Id header string(uuid) true Correlation ID for distributed tracing. Required on SAPI; missing or non-UUID returns 400 BAD_REQUEST (ADR-026).

Example responses

200 Response

{
  "linkedInUrl": "https://linkedin.com/in/ryanbumstead",
  "gitHubProfileUrl": "https://example.com/source",
  "calendlyUrl": "https://example.com/schedule",
  "trailblazerProfileUrl": "https://trailblazer.me/id/rbumstead",
  "personalWebsiteUrl": "https://ryanbumstead.com",
  "careerObjective": "Looking for Principal Architect roles.",
  "jiraProjectKey": "SPAP",
  "gitHubRepoPath": "rdbumstead/salesforce-portfolio"
}

500 Response

{
  "httpStatus": 500,
  "errorCode": "INTERNAL_SERVER_ERROR",
  "message": "Upstream Salesforce processing failed.",
  "correlationId": "123e4567-e89b-12d3-a456-426614174000",
  "retryable": true
}

Responses

Status Meaning Description Schema
200 OK Successful retrieval of Global Configuration. Returns an empty object when no configuration record exists. PortfolioConfig
401 Unauthorized Missing, expired, or invalid Bearer token (rejected by the platform before Apex executes). Error
403 Forbidden The integration user lacks object, field, or Apex class permission for this resource. Error
429 Too Many Requests API rate limit exceeded. Error
500 Internal Server Error Internal platform error (unhandled Apex exception). Error

Response Headers

Status Header Type Format Description
200 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
200 Cache-Control string   Private configuration data; shared caches must not store it.
401 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
403 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).
429 Retry-After integer   Seconds left in the current calendar minute, or 1 when the counter row stayed locked past the platform wait (RateWindowLimiter.checkKey).
500 X-Request-Id string uuid Correlation ID. A valid caller-supplied value is echoed by the platform; Apex sets the header only when it generated the value (missing or non-UUID request header).

Schemas

Error

{
  "httpStatus": 400,
  "errorCode": "BAD_REQUEST",
  "message": "Offset cannot be negative.",
  "retryable": false,
  "correlationId": "123e4567-e89b-12d3-a456-426614174000"
}

Standard Error Response Schema.

Properties

Name Type Required Restrictions Description
httpStatus integer true read-only Standard HTTP Status Code.
errorCode string true none Machine-readable error code constant.
message string true none Human-readable error message.
retryable boolean false none Indicates if the client should retry the request.
correlationId string(uuid) true none Unique ID tracking the request. Matches X-Request-Id.

Enumerated Values

Property Value
errorCode BAD_REQUEST
errorCode UNAUTHORIZED
errorCode FORBIDDEN
errorCode NOT_FOUND
errorCode RATE_LIMIT_EXCEEDED
errorCode INTERNAL_SERVER_ERROR
errorCode SALESFORCE_UNAVAILABLE
errorCode GATEWAY_TIMEOUT
errorCode GONE

Persona

"Architect"

Target audience for content filtering.

Properties

Name Type Required Restrictions Description
anonymous string false none Target audience for content filtering.

Enumerated Values

Property Value
anonymous Admin
anonymous Developer
anonymous Architect

ProjectStatus

"Active Development"

Project Lifecycle Status

Properties

Name Type Required Restrictions Description
anonymous string false none Project Lifecycle Status

Enumerated Values

Property Value
anonymous Live – In Production
anonymous Live – Demo / Reference
anonymous Active Development
anonymous On Hold
anonymous Archived

AssetType

"Image"

Asset Type

Properties

Name Type Required Restrictions Description
anonymous string false none Asset Type

Enumerated Values

Property Value
anonymous Image
anonymous Video
anonymous Document
anonymous Link

RelationshipType

"Manager"

Professional Relationship

Properties

Name Type Required Restrictions Description
anonymous string false none Professional Relationship

Enumerated Values

Property Value
anonymous Manager
anonymous Peer
anonymous Client
anonymous Recruiter
anonymous Fan

VibeMode

"Professional"

Tone/Style Category

Properties

Name Type Required Restrictions Description
anonymous string false none Tone/Style Category

Enumerated Values

Property Value
anonymous Professional
anonymous Casual

HealthStatus

{
  "status": "UP",
  "checkType": "SHALLOW",
  "timestamp": "2019-08-24T14:15:22Z",
  "orgTimeZone": "America/Chicago",
  "dependencies": {
    "salesforce": "UP"
  },
  "limits": {
    "queries": {
      "used": 1,
      "limit": 100
    },
    "dmlStatements": {
      "used": 1,
      "limit": 100
    },
    "callouts": {
      "used": 1,
      "limit": 100
    },
    "cpuTimeMs": {
      "used": 1,
      "limit": 100
    },
    "heapBytes": {
      "used": 1,
      "limit": 100
    }
  }
}

API Health Status Schema.

Properties

Name Type Required Restrictions Description
status string false none Overall API Availability.
checkType string false none SHALLOW = Runtime only. DEEP = Includes downstream dependencies.
timestamp string(date-time) false none ISO 8601 Timestamp of the health check.
orgTimeZone string false none Time zone of the running user (org time).
dependencies object false none Status of downstream systems.
» salesforce string false none Status of Salesforce Core.
limits object false none Governor-limit snapshot of the current transaction (SAPIHealth.buildPayload).
» queries LimitUsage false none none
» dmlStatements LimitUsage false none none
» callouts LimitUsage false none none
» cpuTimeMs LimitUsage false none none
» heapBytes LimitUsage false none none

Enumerated Values

Property Value
status UP
status DOWN
status DEGRADED
checkType SHALLOW
checkType DEEP

LimitUsage

{
  "used": 1,
  "limit": 100
}

Properties

Name Type Required Restrictions Description
used integer false none none
limit integer false none none

Contact

{
  "id": "0035e00000B2O3DAAV",
  "key": "con_7c5j3w9sfa",
  "name": "Ryan Bumstead",
  "title": "Platform Architect",
  "trailhead": "https://trailblazer.me/id/rbumstead",
  "careerObjective": "Driving digital transformation...",
  "linkedIn": "https://linkedin.com/in/ryanbumstead",
  "portfolio": "https://ryanbumstead.com"
}

Contact Information Schema. The contact’s email and phone are never returned.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Full Name
title string false none Job Title
trailhead string(uri)¦null false none Trailhead Profile URL
careerObjective string¦null false none Short Professional Summary
linkedIn string(uri)¦null false none LinkedIn Profile URL
portfolio string(uri)¦null false none Portfolio Website URL

Project

{
  "id": "a015e00000B2O3DAAV",
  "key": "prj_8f3k2m9qtz",
  "name": "Global CRM Migration",
  "challenge": "Legacy system had 5M duplicate records.",
  "solution": "Implemented MDM strategy using Data Cloud.",
  "businessValue": "Reduced data storage costs by 40%.",
  "status": "Active Development",
  "dateCompleted": "2025-12-01",
  "heroImageUrl": "https://example.com/images/hero.jpg",
  "liveUrl": "https://example.com/demo",
  "repositoryUrl": "https://github.com/rdbumstead/project",
  "pillar": "A",
  "pillarLabel": "Pillar A: Business Architecture",
  "isFeatured": true,
  "contactName": "Ryan Bumstead",
  "contactId": "0035e00000B2O3DAAV",
  "contactKey": "con_7c5j3w9sfa",
  "sortOrder": 10
}

Portfolio Project Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Project Name
challenge string¦null false none STAR Method: Situation/Task
solution string¦null false none STAR Method: Action
businessValue string¦null false none STAR Method: Result
status ProjectStatus false none Project Lifecycle Status
dateCompleted string(date)¦null false none Completion Date
heroImageUrl string(uri)¦null false none Banner Image URL
liveUrl string(uri)¦null false none Live Demo URL
repositoryUrl string(uri)¦null false none Code Repository URL
pillar string¦null false none Architectural Pillar
pillarLabel string¦null false none Architectural Pillar Label
isFeatured boolean false none Featured Flag for Home Page
contactName string false none Owner Name
contactId string false none Owner ID. Deprecated, use contactKey.
contactKey string false none Public key of the contact. Use it in place of contactId.
sortOrder number¦null false none Display Sort Order

Experience

{
  "id": "a025e00000B2O3DAAV",
  "key": "exp_4h7n2c8wpd",
  "employerName": "Salesforce",
  "employerId": "0015e00000A1O3DAAV",
  "employerKey": "acc_2t8e6y4mgb",
  "name": "Technical Architect",
  "startDate": "2023-01-01",
  "endDate": "2025-01-01",
  "isCurrentRole": true,
  "isRemote": true,
  "accomplishments": "<ul><li>Led 5 successful deployments</li></ul>",
  "contactId": "0035e00000B2O3DAAV",
  "contactKey": "con_7c5j3w9sfa",
  "contactName": "Ryan Bumstead",
  "sortOrder": 10
}

Professional Experience Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
employerName string false none Employer Name
employerId string false none Employer Account ID. Deprecated, use employerKey.
employerKey string false none Public key of the employer. Use it in place of employerId.
name string false none Role Title
startDate string(date) false none Start Date
endDate string(date)¦null false none End Date (null if current)
isCurrentRole boolean false read-only Is Current Role Flag
isRemote boolean false none Remote Work Flag
accomplishments string¦null false none DEPRECATED: Use /experience-highlights endpoint instead. This field will be removed in SAPI v2.0.0.
contactId string false none Contact ID. Deprecated, use contactKey.
contactKey string false none Public key of the contact. Use it in place of contactId.
contactName string false none Contact Name
sortOrder number¦null false none Sort Order

ExperienceHighlight

{
  "id": "a035e00000B2O3DAAV",
  "key": "hlt_9d3p7k5vxn",
  "experienceId": "a025e00000B2O3DAAV",
  "experienceKey": "exp_4h7n2c8wpd",
  "experienceName": "Technical Architect",
  "name": "DevOps Transformation",
  "description": "Implemented CI/CD pipelines reducing deployment time by 80%.",
  "sortOrder": 1,
  "personaTag": "Developer;Architect"
}

Experience Bullet Point Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
experienceId string false none Parent Experience ID. Deprecated, use experienceKey.
experienceKey string false none Public key of the experience. Use it in place of experienceId.
experienceName string false none Parent Experience Name
name string false none Highlight Title
description string false none Detailed Description
sortOrder number false none Sort Order
personaTag string false none Semicolon-separated Persona values from the Persona_Tag__c multi-select picklist (Admin, Developer, Architect).

ProjectAsset

{
  "id": "a045e00000B2O3DAAV",
  "key": "pas_4n7s3f9tdk",
  "name": "Architecture Diagram",
  "projectId": "a015e00000B2O3DAAV",
  "projectKey": "prj_8f3k2m9qtz",
  "projectName": "Global CRM Migration",
  "type": "Image",
  "externalUrl": "https://example.com/images/diagram.png",
  "altText": "C4 Model System Context Diagram",
  "sortOrder": 1
}

Project Asset (Image/Video) Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Asset Name
projectId string false none Parent Project ID. Deprecated, use projectKey.
projectKey string false none Public key of the project. Use it in place of projectId.
projectName string false none Parent Project Name
type AssetType false none Asset Type
externalUrl string(uri) false none Asset URL
altText string¦null false none Accessibility Alt Text
sortOrder number false none Sort Order

Testimonial

{
  "id": "a055e00000B2O3DAAV",
  "key": "tst_2y7a5d9wmh",
  "name": "Testimonial from Jane Doe",
  "authorName": "Jane Doe",
  "authorTitle": "CTO, Tech Corp",
  "avatarUrl": "https://example.com/images/avatar.jpg",
  "relationshipType": "Manager",
  "vibeMode": "Professional",
  "context": "Worked together on the Q1 digital transformation."
}

Social Proof Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Testimonial Name
authorName string false none Author Name
authorTitle string¦null false none Author Title
avatarUrl string(uri)¦null false none Author Avatar URL
relationshipType RelationshipType false none Professional Relationship
vibeMode VibeMode false none Tone/Style Category
context string¦null false none Context of Work

ProjectSkill

{
  "id": "a065e00000B2O3DAAV",
  "key": "prs_8w2m6g4bha",
  "projectId": "a015e00000B2O3DAAV",
  "projectKey": "prj_8f3k2m9qtz",
  "projectName": "Global CRM Migration",
  "skillId": "a075e00000B2O3DAAV",
  "skillKey": "skl_3m9x5b2rkt",
  "skillName": "Apex",
  "skillCategory": "Backend Development",
  "skillProficiencyScore": 5
}

Junction Object: Project <-> Skill.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
projectId string false none Project ID. Deprecated, use projectKey.
projectKey string false none Public key of the project. Use it in place of projectId.
projectName string false none Project Name
skillId string false none Skill ID. Deprecated, use skillKey.
skillKey string false none Public key of the skill. Use it in place of skillId.
skillName string false none Skill Name
skillCategory string false none Skill Category
skillProficiencyScore number false none Proficiency Score

ExperienceSkill

{
  "id": "a085e00000B2O3DAAV",
  "key": "exs_5r8h2q6cjw",
  "experienceId": "a025e00000B2O3DAAV",
  "experienceKey": "exp_4h7n2c8wpd",
  "experienceName": "Technical Architect",
  "skillId": "a075e00000B2O3DAAV",
  "skillKey": "skl_3m9x5b2rkt",
  "skillName": "LWC",
  "skillCategory": "Frontend Development",
  "skillProficiencyScore": 4
}

Junction Object: Experience <-> Skill.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
experienceId string false none Experience ID. Deprecated, use experienceKey.
experienceKey string false none Public key of the experience. Use it in place of experienceId.
experienceName string false none Experience Name
skillId string false none Skill ID. Deprecated, use skillKey.
skillKey string false none Public key of the skill. Use it in place of skillId.
skillName string false none Skill Name
skillCategory string false none Skill Category
skillProficiencyScore number false none Proficiency Score

CertificationSkill

{
  "id": "a095e00000B2O3DAAV",
  "key": "cks_3k9z5x7pne",
  "certificationId": "a105e00000B2O3DAAV",
  "certificationKey": "crt_6q2v8d4nhz",
  "certificationName": "Salesforce Certified Application Architect",
  "skillId": "a075e00000B2O3DAAV",
  "skillKey": "skl_3m9x5b2rkt",
  "skillName": "Security",
  "skillCategory": "Architecture",
  "skillProficiencyScore": 5
}

Junction Object: Certification <-> Skill.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
certificationId string false none Certification ID. Deprecated, use certificationKey.
certificationKey string false none Public key of the certification. Use it in place of certificationId.
certificationName string false none Certification Name
skillId string false none Skill ID. Deprecated, use skillKey.
skillKey string false none Public key of the skill. Use it in place of skillId.
skillName string false none Skill Name
skillCategory string false none Skill Category
skillProficiencyScore number false none Proficiency Score

PortfolioConfig

{
  "linkedInUrl": "https://linkedin.com/in/ryanbumstead",
  "gitHubProfileUrl": "https://example.com/source",
  "calendlyUrl": "https://example.com/schedule",
  "trailblazerProfileUrl": "https://trailblazer.me/id/rbumstead",
  "personalWebsiteUrl": "https://ryanbumstead.com",
  "careerObjective": "Looking for Principal Architect roles.",
  "jiraProjectKey": "SPAP",
  "gitHubRepoPath": "rdbumstead/salesforce-portfolio"
}

Global Config Schema (Custom Metadata). The owner’s email and phone are never returned.

Properties

Name Type Required Restrictions Description
linkedInUrl string(uri)¦null false none LinkedIn URL
gitHubProfileUrl string(uri)¦null false none GitHub URL
calendlyUrl string(uri)¦null false none Calendly URL
trailblazerProfileUrl string(uri)¦null false none Trailhead URL
personalWebsiteUrl string(uri)¦null false none Personal Website URL
careerObjective string¦null false none Career Objective Text
jiraProjectKey string false none Jira Key for integration
gitHubRepoPath string false none GitHub Owner/Repo path for API calls

Account

{
  "id": "0015e00000A1O3DAAV",
  "key": "acc_2t8e6y4mgb",
  "name": "Salesforce",
  "industry": "Technology",
  "abbreviation": "SFDC"
}

Account/Employer Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Account Name
industry string¦null false none Industry
abbreviation string¦null false none Abbreviation

Skill

{
  "id": "a075e00000B2O3DAAV",
  "key": "skl_3m9x5b2rkt",
  "name": "Apex",
  "displayName": "Salesforce Apex",
  "category": "Development",
  "proficiencyScore": 5,
  "iconName": "utility:code",
  "svgPathData": "M10...",
  "colorHex": "#0070d2",
  "categoryOrder": 10
}

Skill Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Skill Name
displayName string¦null false none Display Name
category string false none Skill Category
proficiencyScore number false none Self-Reported Proficiency
iconName string¦null false none Icon Name
svgPathData string¦null false none SVG Path Data
colorHex string¦null false none Category Color Hex
categoryOrder number false none Category Order

Certification

{
  "id": "a105e00000B2O3DAAV",
  "key": "crt_6q2v8d4nhz",
  "name": "Application Architect",
  "contactId": "0035e00000B2O3DAAV",
  "contactKey": "con_7c5j3w9sfa",
  "contactName": "Ryan Bumstead",
  "issuerId": "0015e00000A1O3DAAV",
  "issuerKey": "acc_2t8e6y4mgb",
  "issuerName": "Salesforce",
  "earnedDate": "2024-05-15"
}

Certification Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Certification Name
contactId string false none Contact ID. Deprecated, use contactKey.
contactKey string false none Public key of the contact. Use it in place of contactId.
contactName string false none Contact Name
issuerId string false none Issuer Account ID. Deprecated, use issuerKey.
issuerKey string false none Public key of the issuer. Use it in place of issuerId.
issuerName string false none Issuer Name
earnedDate string(date) false none Date Earned

Education

{
  "id": "a115e00000B2O3DAAV",
  "key": "edu_6b4c8j2rvq",
  "name": "Bachelor of Science",
  "contactId": "0035e00000B2O3DAAV",
  "contactKey": "con_7c5j3w9sfa",
  "contactName": "Ryan Bumstead",
  "issuerId": "0015e00000A1O3DAAV",
  "issuerKey": "acc_2t8e6y4mgb",
  "issuerName": "University of Technology",
  "fieldOfStudy": "Computer Science",
  "graduationDate": "2018-05-01",
  "gpa": 3.8
}

Education Schema.

Properties

Name Type Required Restrictions Description
id string false read-only Salesforce Record ID. Deprecated, use key.
key string false read-only Stable public key of the record. Use it in place of id. It is set once and never changes.
name string false none Degree Name
contactId string false none Contact ID. Deprecated, use contactKey.
contactKey string false none Public key of the contact. Use it in place of contactId.
contactName string false none Contact Name
issuerId string false none University Account ID. Deprecated, use issuerKey.
issuerKey string false none Public key of the issuer. Use it in place of issuerId.
issuerName string false none University Name
fieldOfStudy string false none Field of Study
graduationDate string(date) false none Graduation Date
gpa number¦null false none GPA