POST /v1/applications/current/documents
Upload a document, sealed byte for byte before storage (10 MB). ID photos and selfies are photos only, never a PDF.
Host https://onboard.socialmatterspay.com
An owner’s own link may upload only that owner’s photos. A selfie is the person’s own: it is taken in that person’s own session (the applicant for the owner marked “This is me”, everyone else on their own emailed link), only after they agreed to the face match; otherwise 403 selfie_is_personal or 409 consent_needed. The applicant may add another owner’s ID front and back, which a person at SMP reviews without a face match.
Request body (multipart/form-data)
| Field | Notes |
|---|---|
file requiredstring (binary) | — |
doc_type requiredenum | one of id_front, id_back, selfie, ein_letter, articles, dba_certificate, terms_page, bank_statement, voided_check, bank_letter, account_document, other |
owner_idstring | For id_front, id_back and selfie |
statement_monthstring | YYYY-MM, for bank_statement: the current month or the four before it |
sourceenum | one of upload, camera |
Responses
| Status | Meaning |
|---|---|
201 | The document and the application |
400 | Error — error shape and codes |
401 | Error — error shape and codes |
403 | Error — error shape and codes |
404 | Error — error shape and codes |
409 | Error — error shape and codes |
413 | Error — error shape and codes |
415 | Error — error shape and codes |
Fields of data (201)
| Field | Notes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
documentobject | 7 child fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
applicationobject | The application as its applicant sees it. An owner who opened their own emailed link gets a limited view, with only owner_scope, legal_name, that owner and the config; the other fields are for the applicant.26 child fields
|
Example
Add a document (multipart: the file and its type)
curl -X POST https://onboard.socialmatterspay.com/v1/applications/current/documents \
-H 'Authorization: Bearer applicant_session_token' \
-F 'doc_type=other' \
-F 'file=@operating-agreement.pdf'
HTTP 201
{
"data": {
"document": {
"id": "ee01c4c7-1800-45e6-9863-f8ceb45e6540",
"doc_type": "other",
"owner_id": null,
"filename": "operating-agreement.pdf",
"size_bytes": 31,
"sha256": "fb37a48c7ba917ca20d4f959d6550db69ec3b25aa356bd03cb26ac466fdbfbaa",
"statement_month": null
},
"application": "(the application, as GET /v1/applications/current answers it)"
}
}
DELETE /v1/applications/current/documents/{documentId}
Remove a document from the draft (it stays on record as removed)
Host https://onboard.socialmatterspay.com
Parameters
| Field | Notes |
|---|---|
documentId requiredpath · string | — |
Responses
| Status | Meaning |
|---|---|
200 | Application |
401 | Error — error shape and codes |
404 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (200)
The same fields as under uploadApplicationDocument · application.
Example
Take a document off again
curl -X DELETE https://onboard.socialmatterspay.com/v1/applications/current/documents/ee01c4c7-1800-45e6-9863-f8ceb45e6540 \
-H 'Authorization: Bearer applicant_session_token'
HTTP 200
Cache-Control: no-store
{
"data": {
"object": "application",
"id": "8f67c6ec-bbf9-4630-bbc3-9c95203955fe",
"reference": "SMP-B94V-95JT",
"status": "draft",
"started_by": "applicant",
"info_request_message": null,
"contact": {
"name": "Jennifer Thompson",
"email": "jen31@sunrise31.example",
"phone": "+13055550123",
"email_verified": true
},
"business": {
"legal_name": "Sunrise Wellness LLC",
"dba_name": "Sunrise",
"entity_type": "llc",
"formation_state": "FL",
"formation_date": "2019-04-02",
"ein_last4": "0031",
"address": {
"line1": "1 Main St",
"line2": "Suite 200",
"city": "Tampa",
"state": "FL",
"postal_code": "33602"
},
"business_phone": null,
"website_url": "https://sunrise31.example",
"name_differs": true,
"terms_page_url": null,
"name_link_proof": "dba_certificate"
},
"sales": {
"products_description": "Yoga mats and studio gear",
"category": "retail",
"monthly_volume_cents": 2500000,
"avg_ticket_cents": 8500,
"max_ticket_cents": 60000,
"refund_policy": "30 days, unused items",
"current_processors": [
"Stripe"
],
"integration_types": [
"woocommerce",
"shopify"
],
"is_startup": false,
"statement_descriptor": "SUNRISE"
},
"owners": [
{
"id": "937483ec-19aa-4b69-9293-fb067752edf8",
"full_name": "Jennifer Thompson",
"title": "Managing Member",
"ownership_pct": 60,
"is_control_person": true,
"is_applicant": true,
"dob": "1980-01-01",
"email": "jen31@sunrise31.example",
"phone": null,
"address": {
"line1": "9 Bay Rd",
"line2": null,
"city": "Tampa",
"state": "FL",
"postal_code": "33606"
},
"ssn_last4": "1031",
"id_status": "verified",
"biometric_consent": true,
"consent": {
"can_answer": true,
"by": "applicant",
"at": "2026-10-28T00:23:30.542Z",
"version": "biometric-notice-0.1-draft-2026-10-25",
"sentence": "I have read SMP's Biometric Notice. I consent to Social Matter Payments LLC and its identity-verification provider collecting, storing and using a scan of my face geometry from my selfie and my ID photo, only to verify my identity for this application, and to its destruction on the schedule in that notice. I sign this release electronically as Jennifer Thompson.",
"sentence_sha256": "cc28518cd8c709a6187e7c7038497f9931898501b3d049737ed65637575e9666",
"locked": true
},
"invite_sent_at": null,
"documents": {
"id_front": {
"id": "1dfa6649-42ba-417d-884c-3e38f7606169",
"filename": "id_front.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.548Z"
},
"id_back": {
"id": "51f8f430-b2a2-42b9-b98f-f3d53a5f9e89",
"filename": "id_back.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.556Z"
},
"selfie": {
"id": "d9941f1e-7bc9-4355-990b-2ceb54a11a77",
"filename": "selfie.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.562Z"
}
},
"verification": {
"provider": "sandbox",
"status": "verified",
"provider_status": null,
"sandbox": true,
"checks": {
"sandbox": true,
"checks": [
{
"name": "image_format",
"result": "pass",
"detail": "ID front: png; ID back: png; selfie: png"
},
{
"name": "resolution",
"result": "pass",
"detail": "ID front 1600×1200; ID back 1600×1200; selfie 1600×1200"
},
… 4 more
]
},
"created_at": "2026-10-28T00:23:30.568Z",
"completed_at": "2026-10-28T00:23:30.568Z",
"attempt": 1,
"retry_available": false,
"attempts_left": null,
"reason": null,
"fell_back": false
}
},
{
"id": "7ef70922-1eea-4cef-8b4f-b732c2ffe370",
"full_name": "Marcus Lee",
"title": "Member, operations",
"ownership_pct": 40,
"is_control_person": false,
"is_applicant": false,
"dob": "1982-03-04",
"email": "marcus31@sunrise31.example",
"phone": null,
"address": {
"line1": "9 Bay Rd",
"line2": null,
"city": "Tampa",
"state": "FL",
"postal_code": "33606"
},
"ssn_last4": "2031",
"id_status": "verified",
"biometric_consent": true,
"consent": {
"can_answer": false,
"by": "owner",
"at": "2026-10-28T00:23:30.586Z",
"version": "biometric-notice-0.1-draft-2026-10-25",
"sentence": "I have read SMP's Biometric Notice. I consent to Social Matter Payments LLC and its identity-verification provider collecting, storing and using a scan of my face geometry from my selfie and my ID photo, only to verify my identity for this application, and to its destruction on the schedule in that notice. I sign this release electronically as Marcus Lee.",
"sentence_sha256": "d5830b920749ec3575bbb142dc76619e8057bfc9555432029d754a9bc4d4e6e1",
"locked": true
},
"invite_sent_at": "2026-10-28T00:23:30.573Z",
"documents": {
"id_front": {
"id": "0ce2b563-24dc-49ba-884a-2bf36c7a39cb",
"filename": "id_front.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.593Z"
},
"id_back": {
"id": "8112032a-d7c7-4af3-bc3c-1fc3787c55ba",
"filename": "id_back.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.600Z"
},
"selfie": {
"id": "7b1a22c2-5400-4115-ab66-0c7436814371",
"filename": "selfie.png",
"content_type": "image/png",
"size_bytes": 2048,
"source": "camera",
"uploaded_at": "2026-10-28T00:23:30.605Z"
}
},
"verification": {
"provider": "sandbox",
"status": "verified",
"provider_status": null,
"sandbox": true,
"checks": {
"sandbox": true,
"checks": [
{
"name": "image_format",
"result": "pass",
"detail": "ID front: png; ID back: png; selfie: png"
},
{
"name": "resolution",
"result": "pass",
"detail": "ID front 1600×1200; ID back 1600×1200; selfie 1600×1200"
},
… 4 more
]
},
"created_at": "2026-10-28T00:23:30.610Z",
"completed_at": "2026-10-28T00:23:30.610Z",
"attempt": 1,
"retry_available": false,
"attempts_left": null,
"reason": null,
"fell_back": false
}
}
],
"ownership_attested": true,
"documents": [
{
"id": "632da260-a3b9-4f3c-a97e-a214a6b66845",
"doc_type": "ein_letter",
"statement_month": null,
"filename": "ein_letter.pdf",
"content_type": "application/pdf",
"size_bytes": 33,
"uploaded_at": "2026-10-28T00:23:30.509Z"
},
{
"id": "b235a72b-a193-42e9-b28e-cc9353e9e46b",
"doc_type": "articles",
"statement_month": null,
"filename": "articles.pdf",
"content_type": "application/pdf",
"size_bytes": 39,
"uploaded_at": "2026-10-28T00:23:30.516Z"
},
… 4 more
],
"statement_months": [
"2026-07",
"2026-08",
"2026-09"
],
"bank": {
"method": "plaid_sandbox",
"status": "verified",
"institution_name": "Plaid Sandbox: First Platypus Bank (simulated)",
"account_type": "checking",
"account_last4": "9606",
"routing_number": "011401533",
"holder_name": "Sunrise Wellness LLC",
"name_match": "match",
"sandbox": true
},
"referral": {
"status": "none",
"source": null,
"partner_name": null,
"agent_name": null,
"claim": null
},
"integration": {
"kind": "website",
"domain": "sunrise31.example",
"app_name": null,
"app_platform": null,
"app_store_url": null,
"app_bundle_id": null,
"method": "api",
"label": "sunrise31.example",
"sandbox": {
"account_id": "4cad9448-209c-48b5-9a1f-95c8585a2db7",
"key_prefix": "sk_sandbox_2ca1",
"issued_at": "2026-10-28T00:23:30.468Z"
},
"status": "building",
"page_url": null,
"applicant_notes": null,
"submitted_at": null,
"due_at": null,
"place": null,
"decision": null,
"cases": [
{
"id": "bank_linked",
"title": "Link a bank",
"how": "Link a payer’s bank with the sandbox bank link (any test bank)."
},
{
"id": "payment_settled",
"title": "A payment that settles",
"how": "Make a WEB payment that carries the authorization words’ SHA-256, then move the sandbox clock until it settles."
},
… 7 more
],
"page_checks": [
{
"id": "payer_name",
"title": "The payer",
"looks_at": "asks for the payer’s real name; no placeholder"
},
{
"id": "authorization",
"title": "The authorization",
"looks_at": "SMP’s authorization words in full before the button, and a tick box that unlocks the button"
},
… 4 more
]
},
"pricing": null,
"agreements": [
{
"key": "merchant-agreement",
"title": "Merchant Agreement",
"box": "agreements",
"version": "0.1",
"draft": true
},
{
"key": "merchant-schedules",
"title": "Merchant Agreement — Schedules A to E",
"box": "agreements",
"version": "0.1",
"draft": true
},
… 8 more
],
"signatures": [],
"signed_documents": [],
"submitted_at": null,
"review": null,
"problems": [],
"config": "(the questionnaire's settings, as GET /v1/applications/config answers them)"
}
}
POST /v1/applications/current/bank/link-token
Start the bank step: a Plaid Link token (Auth + Identity), or which fallback applies
Host https://onboard.socialmatterspay.com
Responses
| Status | Meaning |
|---|---|
200 | mode: plaid (with link_token), sandbox, or document_only |
401 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (200)
| Field | Notes |
|---|---|
modeenum | plaid when a Plaid Link token is returned; sandbox or document_only when the bank is proved another way (document_only also when Plaid could not be reached). one of plaid, sandbox, document_only |
link_tokenstring | Plaid Link token, only when mode is plaid. |
expirationstring | When the Link token expires, as Plaid reports it. Only when mode is plaid. |
messagestring | Only when Plaid could not be reached: tells the applicant to upload a voided check, a bank letter or a bank document instead. |
Example
status 200 in this build: Plaid keys are not configured.
Start a Plaid bank sign-in for the payout account
curl -X POST https://onboard.socialmatterspay.com/v1/applications/current/bank/link-token \
-H 'Authorization: Bearer applicant_session_token'
HTTP 200
Cache-Control: no-store
{
"data": {
"mode": "sandbox"
}
}
POST /v1/applications/current/bank/plaid
Finish Plaid Link: the account and routing numbers (sealed) and the names on the account, compared with the business and its owners
Host https://onboard.socialmatterspay.com
A match on the business’s name verifies the account; a near match or an owner’s name goes to a person; anything else asks for another proof.
Request body
| Field | Notes |
|---|---|
public_token requiredstring | — |
account_id requiredstring | — |
Responses
| Status | Meaning |
|---|---|
200 | status: verified, manual_review or name_mismatch; and the application |
400 | Error — error shape and codes |
401 | Error — error shape and codes |
409 | Error — error shape and codes |
503 | Error — error shape and codes |
Fields of data (200)
| Field | Notes |
|---|---|
statusenum | verified when the account holder matches the business; name_mismatch when the names on the account match none of the business or its owners; manual_review otherwise. one of verified, name_mismatch, manual_review |
applicationobject | The application as its applicant sees it. An owner who opened their own emailed link gets a limited view, with only owner_scope, legal_name, that owner and the config; the other fields are for the applicant. Its fields are listed under uploadApplicationDocument · application. |
Example
status 409 in this build: Plaid keys are not configured.
Connect the payout bank with Plaid's public token
curl -X POST https://onboard.socialmatterspay.com/v1/applications/current/bank/plaid \
-H 'Authorization: Bearer applicant_session_token' \
-H 'Content-Type: application/json' \
-d '{
"public_token": "public-sandbox-00000000-0000-0000-0000-000000000000",
"account_id": "plaid-account-id"
}'
HTTP 409
Cache-Control: no-store
{
"error": "plaid_not_configured",
"message": "Plaid isn’t set up here. Upload a document instead."
}
POST /v1/applications/current/bank/sandbox
Sandbox only: Plaid’s documented test checking account; the account holder’s name is simulated (the legal name unless given) and the name check runs for real
Host https://onboard.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
account_owner_namestring | — |
Responses
| Status | Meaning |
|---|---|
200 | status and the application |
401 | Error — error shape and codes |
404 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (200)
| Field | Notes |
|---|---|
statusenum | verified when the simulated account holder matches the business; name_mismatch when it matches none of the business or its owners; manual_review otherwise. one of verified, name_mismatch, manual_review |
applicationobject | The application as its applicant sees it. An owner who opened their own emailed link gets a limited view, with only owner_scope, legal_name, that owner and the config; the other fields are for the applicant. Its fields are listed under uploadApplicationDocument · application. |
Example
Connect the payout bank (a sandbox test bank)
curl -X POST https://onboard.socialmatterspay.com/v1/applications/current/bank/sandbox \
-H 'Authorization: Bearer applicant_session_token' \
-H 'Content-Type: application/json' \
-d '{}'
HTTP 200
Cache-Control: no-store
{
"data": {
"status": "verified",
"application": "(the application, as GET /v1/applications/current answers it)"
}
}
POST /v1/applications/current/bank/manual
The fallback: the numbers as typed, and a voided check, bank letter or bank document a person compares them with
Host https://onboard.socialmatterspay.com
Request body
| Field | Notes |
|---|---|
routing_number requiredstring | — |
account_number requiredstring | — |
account_type requiredenum | one of checking, savings |
proof_document_id requiredstring | — |
Responses
| Status | Meaning |
|---|---|
200 | status: manual_review; and the application |
400 | Error — error shape and codes |
401 | Error — error shape and codes |
409 | Error — error shape and codes |
Fields of data (200)
| Field | Notes |
|---|---|
statusstring = "manual_review" | Always manual_review: a person compares the typed numbers with the proof document. |
applicationobject | The application as its applicant sees it. An owner who opened their own emailed link gets a limited view, with only owner_scope, legal_name, that owner and the config; the other fields are for the applicant. Its fields are listed under uploadApplicationDocument · application. |
Example
Or type the numbers, with a voided check a person compares them with
curl -X POST https://onboard.socialmatterspay.com/v1/applications/current/bank/manual \
-H 'Authorization: Bearer applicant_session_token' \
-H 'Content-Type: application/json' \
-d '{
"routing_number": "110000000",
"account_number": "000555666777",
"account_type": "checking",
"proof_document_id": "6432ecc3-8964-4754-b4e9-b01762b60229"
}'
HTTP 200
Cache-Control: no-store
{
"data": {
"status": "manual_review",
"application": "(the application, as GET /v1/applications/current answers it)"
}
}
