Vertueal Docs
Authentic Profile

TrustLinks API Reference

Submit, manage, and batch-verify links and social accounts on behalf of users through AuthenticProfile's trusted verification engine.

TrustLinks API Reference

The TrustLinks API allows third-party platforms to submit links (social profiles, content channels, portfolio URLs, and domain links) for verification through AuthenticProfile. Submissions are individually audited and reviewed against user identity records by our verification team.

Verification Prerequisite

TrustLinks can only be submitted for users who hold an active, verified AuthenticProfile. Submissions for unverified profiles return HTTP 403 Forbidden (user_not_verified).


1. Authentication Methods

The TrustLinks API supports two authorization models:

Make API requests server-to-server using your application's Client Secret as the Bearer token. Specify the target user's ID via the x-user-id header or inside the request JSON body:

Authorization: Bearer YOUR_APP_CLIENT_SECRET
x-user-id: 64f1a2b3c4d5e6f7a8b9c0d1
Content-Type: application/json
// Server-to-server submission with App Client Secret
const response = await fetch("https://authenticprofile.com/api/trust-links", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.AUTHENTIC_CLIENT_SECRET}`,
    "x-user-id": "64f1a2b3c4d5e6f7a8b9c0d1",
  },
  body: JSON.stringify({
    links: [
      {
        title: "Official YouTube Channel",
        url: "https://youtube.com/@myhandle",
        platform: "youtube",
        description: "Official creator channel",
      },
    ],
  }),
});

Method 2: User-Scoped OAuth 2.0 Access Token

Standard user-delegated authorization code flow:

  1. Redirect user to /oauth/authorize/consent?client_id=...&scope=profile%20trust_links:write
  2. Exchange authorization code at POST /api/oauth/token
  3. Pass user access token: Authorization: Bearer USER_ACCESS_TOKEN

2. API Endpoints

Submit one or more links for verification on behalf of the user.

POST /api/trust-links

Request Payload

{
  "links": [
    {
      "title": "My YouTube Channel",
      "url": "https://youtube.com/@myhandle",
      "platform": "youtube",
      "description": "Official company channel"
    }
  ],
  "limit": 50,
  "userId": "64f1a2b3c4d5e6f7a8b9c0d1"
}

Response (200 OK)

{
  "success": true,
  "trustLinks": [
    {
      "_id": "64f1b8a9c2d3e4f5a6b7c8d9",
      "title": "My YouTube Channel",
      "url": "https://youtube.com/@myhandle",
      "platform": "youtube",
      "description": "Official company channel",
      "verificationStatus": "pending",
      "createdAt": "2026-05-08T10:00:00.000Z"
    }
  ]
}

Retrieve all TrustLinks for the authenticated user, automatically scoped to the calling application.

GET /api/trust-links?status=verified&userId=64f1a2b3c4d5e6f7a8b9c0d1

Query Parameters

ParameterTypeRequiredDescription
statusstringNoFilter by verification status: pending, verified, or rejected.
userIdstringMethod 1Target user ID (required if authenticating with Client Secret).

Response (200 OK)

{
  "trustLinks": [
    {
      "_id": "64f1b8a9c2d3e4f5a6b7c8d9",
      "title": "My YouTube Channel",
      "url": "https://youtube.com/@myhandle",
      "platform": "youtube",
      "verificationStatus": "verified",
      "reviewedAt": "2026-05-09T14:30:00.000Z",
      "createdAt": "2026-05-08T10:00:00.000Z"
    }
  ]
}

Retrieve a single TrustLink by its unique identifier.

GET /api/trust-links/{id}?userId=64f1a2b3c4d5e6f7a8b9c0d1

Response (200 OK)

{
  "trustLink": {
    "_id": "64f1b8a9c2d3e4f5a6b7c8d9",
    "title": "My YouTube Channel",
    "url": "https://youtube.com/@myhandle",
    "platform": "youtube",
    "verificationStatus": "verified"
  }
}

Update an existing TrustLink's title, URL, or platform.

Automatic Re-Review

Any update to an approved TrustLink automatically resets its status back to pending and initiates a priority review by our compliance team.

PUT /api/trust-links/{id}

Request Payload

{
  "title": "Updated Channel Name",
  "url": "https://youtube.com/@newhandle",
  "platform": "youtube",
  "userId": "64f1a2b3c4d5e6f7a8b9c0d1"
}

Response (200 OK)

{
  "success": true,
  "trustLink": {
    "_id": "64f1b8a9c2d3e4f5a6b7c8d9",
    "title": "Updated Channel Name",
    "verificationStatus": "pending"
  }
}

Permanently remove a TrustLink from the user's profile.

DELETE /api/trust-links/{id}?userId=64f1a2b3c4d5e6f7a8b9c0d1

Response (200 OK)

{
  "success": true,
  "deleted": "64f1b8a9c2d3e4f5a6b7c8d9"
}

Batch-check the real-time verification status of multiple links in a single HTTP request.

POST /api/trust-links/verify

Request Payload

{
  "linkIds": ["64f1b8a9c2d3e4f5a6b7c8d9", "64f2c9b1a3d5e7f8a9b0c1d2"],
  "userId": "64f1a2b3c4d5e6f7a8b9c0d1"
}

Response (200 OK)

{
  "success": true,
  "results": [
    {
      "id": "64f1b8a9c2d3e4f5a6b7c8d9",
      "title": "My YouTube",
      "status": "verified",
      "reviewedAt": "2026-05-09T14:30:00.000Z"
    },
    {
      "id": "64f2c9b1a3d5e7f8a9b0c1d2",
      "title": "My Twitter",
      "status": "pending",
      "reviewedAt": null
    }
  ],
  "summary": {
    "total": 2,
    "verified": 1,
    "pending": 1,
    "rejected": 0,
    "notFound": 0
  }
}

2.7. Check Social Account Verification Status

Batch-verify whether specific social media handles belonging to a user are verified on AuthenticProfile.

POST /api/social-accounts/verify

Request Payload

{
  "platforms": ["twitter", "linkedin"],
  "userId": "64f1a2b3c4d5e6f7a8b9c0d1"
}

Response (200 OK)

{
  "success": true,
  "results": [
    {
      "id": "soc_1",
      "platform": "twitter",
      "username": "myhandle",
      "url": "https://twitter.com/myhandle",
      "verified": true,
      "verificationStatus": "verified",
      "isPrimary": true
    },
    {
      "platform": "linkedin",
      "status": "not_found"
    }
  ],
  "summary": {
    "total": 2,
    "verified": 1,
    "pending": 0,
    "rejected": 0,
    "unverified": 1
  }
}

3. Error Codes & Diagnostics

HTTP StatusError CodeDescription
400 Bad Requestinvalid_requestMissing or malformed payload, or invalid link URL format.
401 Unauthorizedinvalid_tokenMissing, expired, or invalid authorization token or secret.
403 Forbiddenuser_not_verifiedTarget user does not hold an active, verified AuthenticProfile.
404 Not Foundnot_foundTrustLink with specified ID does not exist or does not belong to app.
400 Bad Requestlimit_exceededSubmission exceeds maximum batch limits (e.g. max 50 links).
429 Too Many Requestsrate_limitedQuota exceeded. Follow Retry-After header with exponential backoff.
500 Server Errorserver_errorUnexpected internal database or platform exception.

On this page