Publisher API
API Reference

POST /surveys

Request survey offers for a panelist — list mode or single-offer mode.

Request

POST https://publishers.mypinio.com/api/v1/publishers/surveys
AuthenticationBearer or X-API-Key
Content-Typeapplication/json
MethodsPOST only

Local docs: use Download collection and import the file in Postman (File → Import). Run in Postman needs the public URL at publishers.mypinio.com — Postman cannot fetch collections from localhost.

Request body

Required

FieldTypeDescription
appIdstringApp ID from the Publisher Portal (Apps)
panelistIdstringYour stable identifier for this panelist
countrystringISO 3166-1 alpha-2, uppercase (e.g. DE, US)
localestringBCP 47 tag (e.g. de-DE, en-US)

Optional

FieldTypeDescription
maxSurveysnumberOptional. Max offers to return; capped at your account limit. If omitted, up to your account limit is returned
subId1stringOptional tracking ID, passed through the session
subId2stringOptional tracking ID
subId3stringOptional tracking ID
profileDetailsobjectProfiling attributes (see below)
smartdefenderobjectOptional fraud-verification payload if your stack provides one
surveyIdstringRequest a single offer by ID instead of a list
sidstringAlias for surveyId

profileDetails

Send one object (not an array). age and gender are required from 2026-10-06 (see the changelog); until then, responses to requests without them include a warnings entry.

KeyTypeNotes
ageintegerRequired from 2026-10-06. JSON number (not a string), 0–130
genderstringRequired from 2026-10-06. male or female (not case-sensitive; m, f, 1 = male, 2 = female also accepted). Must be a string. Other values count as present but are not used for matching
postalCodestringAlso accepts postal_code, zip, zipcode (one value only)
citystring
maidstringMobile advertising ID
emailstringWhen used for matching

Other keys are ignored.

Examples

List offers:

{
  "appId": "YOUR_APP_ID",
  "panelistId": "user_abc123",
  "country": "DE",
  "locale": "de-DE",
  "maxSurveys": 10,
  "profileDetails": {
    "age": 34,
    "postalCode": "10115",
    "gender": "female"
  }
}

Single offer:

{
  "appId": "YOUR_APP_ID",
  "panelistId": "user_abc123",
  "country": "DE",
  "locale": "de-DE",
  "surveyId": "987654"
}

Response — HTTP 200 success

Rely only on the fields below. Other fields may appear in responses during development accounts but are not part of the stable contract.

Top-level fields

FieldTypeDescription
requestStatusstring"true" on success
hasSurveysbooleanWhether any offers are returned
hasPartlyQuestionsbooleanProfiling partially complete
messagestringOptional status text (truncated)
reasonstringOptional reason text (truncated)
appIdstringEcho of your request
panelistIdstringEcho of your request
countrystringEcho of your request
localestringEcho of your request
rewardUnitNamestringLabel for end-user rewards (e.g. PINTOS)
surveyCountnumberNumber of items in surveys
surveysarrayOffers, highest reward first
profilingUrlstringDeprecated (legacy). Optional link for base profile questions. Still returned for backward compatibility; will be removed later. Prefer showing surveys / partlySurveys and opening entryLink — profiling runs inline on click.
partlySurveysarraySame shape as surveys. Offers that need a few client-specific questions before redirect.
warningsarrayOptional. Non-fatal notices, each with a code and a message — see Warnings.

Warnings

codeMeaning
matching_timeoutSurvey matching did not answer within 5 seconds. The response is a normal 200 with hasSurveys: false and empty lists. Show your empty state and call again on the panelist's next page view.
profile_fields_required_soonprofileDetails.age / profileDetails.gender missing; required from 2026-10-06 (fields lists the missing keys).

Survey object

FieldTypeDescription
surveyIdstringOffer identifier
idstringSame as surveyId when present
entryLinkstringHTTPS URL — open to start the survey
cpinumberYour CPI for this offer (USD).
loinumberLength of interview (minutes)
irnumberIncidence rate (percent)
categorystringCategory label
userRewardAmountnumberSuggested panelist reward in rewardUnitName units

Example

{
  "appId": "YOUR_APP_ID",
  "panelistId": "user_abc123",
  "country": "DE",
  "locale": "de-DE",
  "requestStatus": "true",
  "hasSurveys": true,
  "hasPartlyQuestions": false,
  "rewardUnitName": "PINTOS",
  "surveyCount": 1,
  "surveys": [
    {
      "surveyId": "123456",
      "entryLink": "https://…",
      "cpi": 1.5,
      "loi": 10,
      "ir": 40,
      "category": "Shopping",
      "userRewardAmount": 150
    }
  ]
}

Prerequisites and errors

ConditionHTTPmessage (typical)
Redirect URLs not configured400Redirect URLs / signing secret required
Unknown or wrong-org appId404Unknown appId…
Invalid JSON or validation400Missing required field…

See Errors and Redirect URLs.

On this page