/projects

Two filters are applied in the query itself, not to the page afterwards — so the total is what the caller can actually page through:

  • Projects in Bidding or Hold are excluded entirely.
  • A project's optional per-vendor allow-list is honoured: a project whose vendorIds is blank is visible to everyone, one that names vendors is visible only to those named.

clientId, projectManagerId, salesManagerId and the panel-targeting filters are deliberately not exposed — they are staff- and client-side search axes, and filtering by clientId would be asking about a client the vendor is not told about anyway.

GEThttps://dashboard.a2bsample.com/api/developer/playground/vendor/projects
RequiresAuthorizationandX-Api-Tokenas headers.
Vendor
Vendor·Projects·GET/projects
GEThttps://dashboard.a2bsample.com/api/developer/playground/vendor/projects
Response

Send a request to see the response.

Example request

Request
curl --request GET \  --url 'https://dashboard.a2bsample.com/api/developer/playground/vendor/projects?pageNo=1&maxPerPage=25' \  --header 'Authorization: Bearer $A2B_BEARER_TOKEN' \  --header 'X-Api-Token: $A2B_API_TOKEN' \  --header 'Accept: application/json'

Request

Headers3

Authorizationstringrequired

The secret half. A vendor token starts vnd_ — the four-character prefix says which table to resolve it in, so the row it matches is the caller. A clt_… token on this prefix is a 403, not a 404.

example: Bearer vnd_7b3d4c8ea1f52d6b8e0c4a919f1c4e2a
X-Api-Tokenstringrequired

The identity half — this vendor's own 40-hex apiToken, the value GET /api/developer/me echoes back. Compared in constant time against the bearer token's own row, so a bearer token lifted on its own is not enough to call the playground.

example: 9f1c4e2a7b3d4c8ea1f52d6b8e0c4a913c7a1b90
Acceptstringoptional

Response media type.

default: application/json

Query parameters5

pageNointegeroptional

Page number, 1-based. A null or non-positive value means the first page.

default: 1example: 1
maxPerPageintegeroptional

Rows per page. Nothing is rejected for being out of range — a null or non-positive size means the default and an oversized one is clamped. The clamp is never silent: the listing still answers with the real total. (max 200)

default: 25example: 25
projectNamestringoptional

Name contains — substring match.

statusintegeroptional

ProjectStatus code. Bidding (1) and Hold (4) are legal values that match nothing here — they are excluded in the query itself.

1234567
countryIdstring<uuid>optional

Target country.

Responses

200OK

Matching projects plus the pageable total.

successboolean
Whether the call succeeded.
projectsarray<object>
totalinteger
Rows matching the filter, ignoring paging.
Example response
{  "success": true,  "projects": [    {      "id": "9f1c4e2a-7b3d-4c8e-a1f5-2d6b8e0c4a91",      "pId": 1042,      "projectName": "Q3 Brand Tracker",      "status": 3,      "statusLabel": "Running",      "countryId": "b1d9f4e6-2a80-4c35-97e1-6f3b0d8a5c72",      "countryName": "United States",      "languageId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",      "languageName": "English",      "currencyId": "2d6b8e0c-4a91-4e2a-9f1c-7b3d4c8ea1f5",      "currencyName": "United States Dollar",      "reqComplete": 500,      "loi": 12,      "ir": 35,      "vendorCpi": 2.1,      "device": "1,2",      "fieldEndDate": "2026-08-24T16:58:00Z",      "createdAt": "2026-08-24T14:32:07",      "updatedAt": "2026-08-25T09:11:40"    }  ],  "total": 42}