/api/v1/admin/participant (POST)
const url = 'https://dpg.example.com/api/v1/admin/participant';const options = { method: 'POST', headers: { 'x-acting-org-id': 'example', 'x-api-key': '<x-api-key>', 'Content-Type': 'application/json' }, body: '{"email":"hello@example.com","phone_number":"example","name":"example","age":1,"compliance":[{"key":"example","value":true}],"channel":"bulk","source_id":"example","item_state":{"additionalProperty":"example"},"item_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","network":"example","domain":"example","item_type":"example","item_locations":[{"lat":1,"lng":1,"label":"example"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://dpg.example.com/api/v1/admin/participant \ --header 'Content-Type: application/json' \ --header 'x-acting-org-id: example' \ --header 'x-api-key: <x-api-key>' \ --data '{ "email": "hello@example.com", "phone_number": "example", "name": "example", "age": 1, "compliance": [ { "key": "example", "value": true } ], "channel": "bulk", "source_id": "example", "item_state": { "additionalProperty": "example" }, "item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "network": "example", "domain": "example", "item_type": "example", "item_locations": [ { "lat": 1, "lng": 1, "label": "example" } ] }'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Organization this request acts on behalf of. Required for admin/aggregator operations.
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Payload written to the items table. If absent OR an empty object {} with NO item_id, the route enters account_only mode (only the user is created/looked up, no item is written). If absent/empty WITH an item_id, that profile is targeted for a consent/DOB update without changing its fields.
object
UUID. Meaningful when the user already exists AND the caller owns them — network_service, or the aggregator that onboarded the user (#309 activation). Targets that specific item for a PATCH-style update. Ignored otherwise.
Network id (default: ‘blue_dot’). Set when this Signals instance serves a different network.
Domain within the network (default: ‘seeker’). REQUIRED when acting on behalf of a non-aggregator org (voice / network_service): it selects which default aggregator owns the participant, so the ‘seeker’ fallback would mis-assign a provider signup. Omitting it there returns 400 DOMAIN_REQUIRED. Aggregator callers own their own onboards and may omit it.
Schema-typed item_type for the item (default: ‘profile_1.0’).
Exact coordinates the caller already resolved for this item (e.g. an address the participant picked from a Places autocomplete, so the lat/lng is the one the geocoder returned for that exact suggestion). When present and non-empty these are stored as-is and the address text in item_state is NOT geocoded server-side. When absent or empty, Signals geocodes the item schema’s primary location field from item_state, which is the historical behaviour. Privacy is unaffected either way: if the primary location field is declared private, the coordinate is jittered 100-250 m before storage regardless of whether it was supplied here or resolved server-side.
object
Responses
Section titled “Responses”Default Response
object
Ordered newest first by created_at (ties broken by item_id), so a caller that reads only the head of the list gets the participant’s most recent profile.
object
object
object
Examplegenerated
{ "user_id": "example", "user_existed": true, "owned_elsewhere": true, "onboarded_at": "2026-04-15T12:00:00Z", "items": [ { "item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "item_network": "example", "item_domain": "example", "item_type": "example", "lifecycle_status": "example", "profile_consent_accepted": true, "item_state": { "additionalProperty": "example" }, "item_locations": [ { "lat": 1, "lng": 1, "label": "example" } ], "created_at": "2026-04-15T12:00:00Z", "updated_at": "2026-04-15T12:00:00Z" } ], "consent_recorded": 1, "onboarded_by_org_id": "example", "onboarded_by_default": true}
