/projects/{id}

Partial by contract: a null or absent field leaves the stored value alone, so a caller can send one field without echoing back a whole project it may not hold every part of.

The cost of that contract: a null cannot clear a value. Send "" to clear a string; numeric fields have no clear, only a new value.

A rejected update writes nothing — the method is transactional, so whatever had already been assigned to the entity rolls back. ensureRedirectIds also runs on update: it fills only ids that are null, which heals a project created before the test callbacks existed without ever reissuing one that already exists (reissuing would break a live survey configuration).

PUThttps://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}
RequiresAuthorizationandX-Api-Tokenas headers.
Client
Client·Projects·PUT/projects/{id}
PUThttps://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}
Request body

missing projectId

Response

Send a request to see the response.

Example request

Request
curl --request PUT \  --url 'https://dashboard.a2bsample.com/api/developer/playground/client/projects/{projectId}' \  --header 'Authorization: Bearer $A2B_BEARER_TOKEN' \  --header 'X-Api-Token: $A2B_API_TOKEN' \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{"loi":12,"notes":"updated from the playground console"}'

Request

Headers4

Authorizationstringrequired

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

example: Bearer clt_4c8ea1f52d6b8e0c4a919f1c4e2a7b3d
X-Api-Tokenstringrequired

The identity half — this client'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: 3c7a1b905e424d189f637a2c5e1b8d40b1d9f4e6
Content-Typestringrequired

Request media type.

default: application/json
Acceptstringoptional

Response media type.

default: application/json

Path parameters1

projectIdstring<uuid>required

Project identifier. Ownership-checked in the service, never trusted from the URL.

Body20

projectNamestringrequired

Required on create and non-blank. Unique system-wide, not per client — a clash is a 409.

example: Q3 Brand Tracker
parentProjectIdstring<uuid>optional
studyTypeintegeroptional
default: 1
countryIdstring<uuid>optional

Must exist, or 400 Unknown countryId: ….

languageIdstring<uuid>optional

Must exist.

currencyIdstring<uuid>optional

Must exist. Defaults to United States Dollar.

cpcnumberoptional

The client's own rate per complete.

default: 0
surveyLinkstringoptional
surveyTestLinkstringoptional

Required if status is 2 (Testing). Checked last, against the values just assigned rather than against the request, so it catches both moving a project into Testing with no test link and clearing the test link of a project already sitting in Testing.

reqCompleteintegeroptional
loiintegeroptional
irintegeroptional
statusintegeroptional
default: 11234567
devicestringoptional

1 Monitor, 2 Smartphone, 3 Tablet. Blank means any.

notesstringoptional
projectBriefstringoptional
targetAgeMinintegeroptional
targetAgeMaxintegeroptional
targetGenderstringoptional

Send "" to lift the restriction.

MALEFEMALEANY
targetZipCodesstringoptional

Request body

JSONapplication/json
{  "loi": 12,  "notes": "updated from the playground console"}

Responses

200OK

The project as it now stands.

successboolean
Whether the call succeeded.
messagestring
projectobject
A project as its owning client sees it. vendorCpi is absent from this record entirely, not present-and-nulled — a field that is never populated is one nobody has to remember to null on a new code path.
Example response
{  "success": true,  "message": "Project updated.",  "project": {    "id": "9f1c4e2a-7b3d-4c8e-a1f5-2d6b8e0c4a91",    "pId": 1042,    "parentProjectId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",    "projectName": "Q3 Brand Tracker",    "studyType": 1,    "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",    "cpc": 4.5,    "surveyLink": "https://survey.example.com/s/9f1c4e2a",    "surveyTestLink": "https://survey.example.com/s/9f1c4e2a?test=1",    "reqComplete": 500,    "loi": 12,    "ir": 35,    "device": "1,2",    "notes": "string",    "projectBrief": "string",    "targetAgeMin": 0,    "targetAgeMax": 0,    "targetGender": "MALE",    "targetZipCodes": "string",    "completeRedirectId": "c1a4e2a7-b3d4-4c8e-a1f5-2d6b8e0c4a91",    "disqualifyRedirectId": "d2a4e2a7-b3d4-4c8e-a1f5-2d6b8e0c4a91",    "terminateRedirectId": "t3a4e2a7-b3d4-4c8e-a1f5-2d6b8e0c4a91",    "quotaFullRedirectId": "q4a4e2a7-b3d4-4c8e-a1f5-2d6b8e0c4a91",    "testCompleteRedirectId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",    "testDisqualifyRedirectId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",    "testTerminateRedirectId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",    "testQuotaFullRedirectId": "5f1c8a3e-9d21-4c77-92f0-1b3a4d6e8c00",    "createdAt": "2026-08-24T14:32:07",    "updatedAt": "2026-08-25T09:11:40"  }}