Socious
Reference

API reference

Every endpoint, what authenticates it, and what a paid plan is needed for. Base URL is https://api.shinid.com.

Auth column: apikey = integration Secret Key in the apikey header · session = Authorization: Bearer from a dashboard sign-in · none = open, scoped by an unguessable ID · admin = internal, not available to customers.

Endpoints marked Paid plan or Premium+ check the tier of the acting organization — named by a current-identity header, defaulting to the organization you have belonged to longest. See Authentication.

Verifications

MethodPathAuthNotes
GET/verificationssessionPaginated list
POST/verificationssessionPaid plan, unless "sandbox": true. Create a verification request
GET/verifications/{id}sessionOne verification request
PUT/verifications/{id}sessionUpdate. Owner only
DELETE/verifications/{id}sessionOwner only
GET/verifications/{id}/individualssessionPaginated runs of one verification
GET/verifications/{id}/individuals/{customer}apikey or sessionResult for one customer_id. The call to decide on
GET/verifications/individuals/{id}sessionOne run by its own ID
POST/verifications/individualsnoneOpen a run. Idempotent per (customer_id, verification_id)
GET/verifications/{individual_id}/connectnoneConnection URL for the QR code. Reused for 2 minutes
GET/verifications/{individual_id}/callbacknoneCalled by the wallet. Not for you
GET/verifications/{individual_id}/verifynoneCurrent status; settles the presentation
POST/verifications/{individual_id}/simulateapikey or sessionSandbox only. Settle a test individual through the real validator. 403 NOT_SANDBOX on a live verification

Credentials

MethodPathAuthNotes
GET/credentialssessionPaginated list
GET/credentials/{id}session
POST/credentialssessionPaid plan. Emails a claim link if the recipient has an address
POST/credentials/with-recipientsessionPaid plan. Creates the recipient too
POST/credentials/importsessionPaid plan. Multipart: file (CSV) + schema_id
GET/credentials/import/{id}sessionImport progress
GET/credentials/import/download-sample/{schema_id}noneSchema-shaped CSV template
POST/credentials/notifysessionClaim email for a list of credentials
POST/credentials/notify/via-schemasessionClaim email for every credential on a schema
PUT/credentials/{id}session
PATCH/credentials/{id}/revokesessionOwner only
PATCH/credentials/revokesessionBulk, asynchronous
DELETE/credentials/{id}session
POST/credentials/deletesessionBulk delete
GET/credentials/{id}/connectnoneClaim connection URL. Reused for 2 minutes
GET/credentials/{id}/callbacknoneCalled by the wallet

Schemas and recipients

MethodPathAuthNotes
GET/schemassessionPaginated
GET/schemas/{id}session
POST/schemassessionPublish a schema
DELETE/schemas/{id}session
GET/recipientsapikey or session?q= searches
GET/recipients/{id}apikey or session
POST/recipientsapikey or session
PUT/recipients/{id}apikey or session
DELETE/recipients/{id}apikey or session

Organizations, plan and billing

MethodPathAuthNotes
GET/organizationssessionOrganizations you belong to
GET/organizations/{id}session
POST/organizationssession
PUT/organizations/{id}sessionMembers only
GET/organizations/{id}/usagesessionPlan, quota, usage, 12-month history
GET/organizations/{id}/billing/subscriptionsessionnull where the tier was granted by hand
POST/organizations/{id}/billing/checkoutsessionBuy Standard. Returns a Stripe Checkout URL; the webhook applies the tier
POST/organizations/{id}/billing/portalsessionStripe portal. 409 if there is no billing account

Organization codes and vouchers

MethodPathAuthNotes
POST/organizations/{id}/codessessionPaid plan. Mint a code. Types narrowed to the plan — identity always covered, phone/address Premium+
GET/organizations/{id}/codessessionList with redemption counts
DELETE/organizations/{id}/codes/{codeId}sessionRevoke
POST/voucherssessionPremium+. Mint a grant directly
POST/vouchers/exchangenoneWallet exchanges a typed code. 200/hour/IP
POST/vouchers/redeemnoneService-to-service. The signature is the authorization

Policies

A multi-requirement policy engine — several credentials, per-requirement reasons — is in the API but not yet wired end to end: the evaluation step is restricted to internal calls, so a policy request cannot currently be driven to a verdict by a customer integration. Documented here so you know it exists. Use verification requests for anything you are shipping now.

MethodPathAuthNotes
POST/policiessessionPremium+
GET/policies/{id}sessionMembers of the owning organization only
POST/policy-requestsapikey or sessionReturns a deep-link token
GET/policy-requests/{token}/definitionnoneToken-scoped, no personal data
GET/policy-requests/{id}/statusapikey or sessionVerdict with per-requirement reasons
POST/policy-requests/{id}/evaluateadminInternal

Other

MethodPathAuthNotes
GET/pingnoneHealth check. Returns {"message":"pong"}
GET/integrations/keyssessionYour API keys
POST/integrations/keyssessionPaid plan. Mint a key
PUT/integrations/keys/{id}sessionRename
DELETE/integrations/keys/{id}sessionRevoke
POST/kyb/{org_id}sessionSubmit KYB documents
GET/kyb, /kyb/{id}sessionKYB status
POST/media/uploadsessionMultipart upload
GET/userssessionYour profile
PUT/users/profilesession

Pagination

List endpoints take page (default 1) and limit (default 10, maximum 100 — values above 100 fall back to 10, they do not error). Filter with filter.<field>=<value>. Responses are { "results": [...], "total": n }.

A note on /docs

api.shinid.com/docs and api.shinid.com/swagger.yaml now redirect here. They used to serve an OpenAPI page describing eleven of these routes, last updated in August 2025, and several of the shapes it documented had since changed — so anyone who found it by guessing got worse information than this page. These pages are the reference.