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
Deprecationheader (RFC 9745), aLinkheader pointing at the version 2 reference,https://ryanbumstead.com/api-lab/reference?version=v2, and, once the sunset date is set, aSunsetheader (RFC 8594) with that date. The body is unchanged. - After the sunset date: every version 1 call returns
410 Gonein the standard error envelope witherrorCodeGONE, a short message and the link to the version 2 reference. No data is returned.
Authentication (ADR-027)
- 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_secretheaders validated in Apex against Custom Metadata (ADR-017, superseded). Retired when MuleSoft left the architecture.
- Run-as identity: a dedicated integration user holding a single read-only permission set (
- On-platform consumers: the site API Lab proxy and the PAPI health check obtain tokens through the
Portfolio_APINamed Credential (External Credential, Client Credentials principal). No secret is stored in metadata, source, or the browser. - 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 exampleprj_8f3k2m9qtz, andkeyis the identifier to use. Theidfield is the 18-character Salesforce Id, kept in v1 so existing clients keep working, and it is deprecated. Each reference has the same pair (projectIdandprojectKey). Every parameter that takes an Id (projectId,experienceId,certificationId, and the/projectspath segment) also takes the key. A key is set once, never changes, and never carries a name. Version 2 removesidand every Id reference field. - Traceability: Each API resource maps 1:1 to an Apex
@RestResourceclass (SAPI<Resource>), and every class runs through the sharedApiRequestContext.
Non-Functional Requirements (NFRs)
- Observability:
X-Request-Idmandatory in Request/Response for distributed tracing. A missing or non-UUID value returns400 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), with429responses andRetry-Afterheaders. 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, privateorno-store.
- Public Data (Skills, Projects, Junctions):
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).
- Enterprise Note: For volumes >2,000, this would be refactored to Keyset/Cursor Pagination (
- Versioning: Header version (
X-API-Version) takes precedence over URL versioning. A missing header resolves tov1; any other value returns400 BAD_REQUESTwith messageUnsupported X-API-Version(ADR-026). BothX-Request-IdandX-API-Versionare echoed on every response.
Base URLs:
-
https://{domain}/services/apexrest/sapi/v1
-
domain - The org’s My Domain host. Default: ryan-bumstead-dev-ed.develop.my.salesforce.com
- ryan-bumstead-dev-ed.develop.my.salesforce.com
-
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.-
Flow: clientCredentials
-
Token URL = https://ryan-bumstead-dev-ed.develop.my.salesforce.com/services/oauth2/token
-
| 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 |
| 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 |
| 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 |