{"openapi":"3.1.0","info":{"title":"SSG MFG API","version":"2.0.0","description":"SSG MFG is a manufacturing network and part builder. Design or upload a part, get an instant budgetary estimate and DFM check, then firm quotes from vetted manufacturers — backed by reps with 25+ years on the floor. Estimates are budgetary. The public v1 endpoints need no key and are rate limited per IP. The v2 endpoints work with a workspace's own records and need an API key (bearerAuth); outgoing webhooks are described under webhooks.","contact":{"email":"bob@ssgmfg.com"}},"servers":[{"url":"https://ssgmfg.com"}],"paths":{"/api/v1/estimate":{"post":{"operationId":"estimatePart","summary":"Budgetary estimate, price breaks, DFM and alternatives for a part","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/PartSpec"},{"type":"object","properties":{"parts":{"type":"array","items":{"$ref":"#/components/schemas/PartSpec"}},"compare":{"type":"boolean"}},"required":["parts"]}]}}}},"responses":{"200":{"description":"Estimate"},"400":{"description":"Bad request"},"429":{"description":"Rate limited"}}},"get":{"operationId":"estimatePartFromLink","summary":"Estimate from a base64url-encoded spec","parameters":[{"name":"spec","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Estimate"}}}},"/api/v1/catalog":{"get":{"operationId":"getCatalog","summary":"Processes, materials, finishes, industries, terms, templates, or one entry","parameters":[{"name":"type","in":"query","schema":{"type":"string","enum":["processes","materials","finishes","industries","terms","templates","process","material","finish","industry","term"]}},{"name":"slug","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Catalog data"},"404":{"description":"Not found"}}}},"/api/v1/rfq":{"post":{"operationId":"requestQuotes","summary":"Send an RFQ. A rep routes it to matched principals and replies by email. Confirm with the user first.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["contact","parts"],"properties":{"contact":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"company":{"type":"string"},"phone":{"type":"string"},"role":{"type":"string","enum":["engineer","buyer","founder","rep","other"]}}},"parts":{"type":"array","minItems":1,"maxItems":25,"items":{"$ref":"#/components/schemas/PartSpec"}},"notes":{"type":"string"},"nda":{"type":"boolean"}}}}}},"responses":{"201":{"description":"RFQ received","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"next":{"type":"string"}}}}}},"400":{"description":"Invalid"}}}},"/api/v2/me":{"get":{"operationId":"v2GetMe","tags":["v2"],"summary":"The key, its workspace, the person it acts as, and its effective permissions","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"The key","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Me"}}}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/objects":{"get":{"operationId":"v2ListObjects","tags":["v2"],"summary":"Objects this key can list, with their fields as the workspace sees them","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"Objects","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ObjectMeta"}}}}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/objects/{object}/records":{"get":{"operationId":"v2ListRecords","tags":["v2"],"summary":"List records (same scopes, filters and field visibility as the portals)","security":[{"bearerAuth":[]}],"parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"description":"Object key, e.g. jobs, orders, ncrs, quotes, rfq_invites, invoices, companies, contacts, tasks. GET /api/v2/objects lists yours."},{"name":"filter","in":"query","schema":{"type":"string"},"description":"JSON FilterGroup, a list of rules, or one rule. Example: {\"field\":\"stage\",\"op\":\"in\",\"value\":[\"quoting\",\"proposed\"]}. Unknown or hidden fields are refused (400)."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"JSON {\"field\":\"value\",\"dir\":\"desc\"} or a list, or \"value,-created_at\". Up to 4."},{"name":"q","in":"query","schema":{"type":"string","maxLength":120},"description":"Full-text search"},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Comma-separated field keys to return (the title field is always included)"},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"A page of records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPage"}}}},"400":{"description":"Malformed request (bad JSON, unknown field, bad filter)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such object or record, or the key can't see it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/objects/{object}/records/{id}":{"get":{"operationId":"v2GetRecord","tags":["v2"],"summary":"One record","security":[{"bearerAuth":[]}],"parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"description":"Object key, e.g. jobs, orders, ncrs, quotes, rfq_invites, invoices, companies, contacts, tasks. GET /api/v2/objects lists yours."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"The record","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Record"}}}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such object or record, or the key can't see it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"v2UpdateRecord","tags":["v2"],"summary":"Update fields the key's person may edit (write scope). Same validation, state rules and audit trail as the portals, source \"api\".","security":[{"bearerAuth":[]}],"parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"description":"Object key, e.g. jobs, orders, ncrs, quotes, rfq_invites, invoices, companies, contacts, tasks. GET /api/v2/objects lists yours."},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["fields"],"properties":{"fields":{"type":"object","additionalProperties":true,"example":{"priority":"high"}},"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":"The updated record","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Record"}}}}}},"400":{"description":"Malformed request (bad JSON, unknown field, bad filter)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such object or record, or the key can't see it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation failed; `fields` says where","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"423":{"description":"Changes are switched off (maintenance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/rfqs":{"post":{"operationId":"v2CreateRfq","tags":["v2"],"summary":"Create a request for quote (a job) in the key's workspace. Customer keys: for their own company. Submitted unless submit is false.","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RfqCreate"}}}},"responses":{"201":{"description":"The new job as the workspace sees it","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Record"}}}}}},"400":{"description":"Malformed request (bad JSON, unknown field, bad filter)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such object or record, or the key can't see it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict, or a request with this Idempotency-Key is still running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation failed; `fields` says where","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"423":{"description":"Changes are switched off (maintenance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/notes":{"post":{"operationId":"v2CreateNote","tags":["v2"],"summary":"Add a note to a record the workspace can see","security":[{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"201":{"description":"The note","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Note"}}}}}},"400":{"description":"Malformed request (bad JSON, unknown field, bad filter)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such object or record, or the key can't see it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict, or a request with this Idempotency-Key is still running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Validation failed; `fields` says where","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"423":{"description":"Changes are switched off (maintenance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/events":{"get":{"operationId":"v2ListEvents","tags":["v2"],"summary":"Events sent to this workspace's webhook endpoints, newest first (catch up after downtime). Needs read scope and a key from someone who manages webhooks.","security":[{"bearerAuth":[]}],"parameters":[{"name":"type","in":"query","schema":{"type":"string","enum":["job.created","job.submitted","job.stage_changed","job.routed","rfq.declined","quote.submitted","quote.published","quote.expired","award.created","award.pending_approval","order.status_changed","milestone.updated","shipment.created","invoice.recorded","invoice.updated","ncr.opened","ncr.updated","record.created","record.updated","record.deleted","commission.paid","message.posted"]}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"$ref":"#/components/parameters/RequestId"}],"responses":{"200":{"description":"Events","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEvent"}},"page":{"type":"integer"},"page_size":{"type":"integer"},"has_more":{"type":"boolean"}}}}}},"400":{"description":"Malformed request (bad JSON, unknown field, bad filter)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, unknown, revoked or expired key, or its person lost access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scopes or its person's role don't allow this, or the workspace is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"PartSpec":{"type":"object","properties":{"name":{"type":"string"},"template":{"type":"string","enum":["plate","bracket","enclosure","shaft","bushing","cup","spring","gear","seal","case","standoff","channel","heatsink"]},"params":{"type":"object","additionalProperties":{"type":"number"},"description":"Template dimensions in millimetres"},"bbox_mm":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"volume_mm3":{"type":"number"},"area_mm2":{"type":"number"},"wall_mm":{"type":"number"},"process":{"type":"string","enum":["plastic-injection-molding","metal-stamping","deep-drawn-stamping","rubber-extrusion-and-molding","powdered-metal","springs-and-wire-forms","die-casting","screw-machining","forging","cnc-machining","soft-goods","offshore-sourcing","sheet-metal-fabrication","additive-manufacturing","urethane-casting"]},"material":{"type":"string","enum":["aluminum-6061-t6","aluminum-6063-t5","aluminum-7075-t6","aluminum-5052-h32","aluminum-a380","zinc-zamak-3","zinc-zamak-5","steel-1008-crs","steel-1018","steel-1045","steel-12l14","steel-4140","steel-a36","music-wire-a228","stainless-302","stainless-303","stainless-304","stainless-316","stainless-430","stainless-17-4ph","brass-c360","copper-c110","phosphor-bronze-c510","titanium-grade-5","pm-fc-0208","pm-fn-0205","pm-ss-316l","abs","polycarbonate","pc-abs","nylon-66","nylon-66-gf30","polypropylene","hdpe","acetal-pom","pbt","pmma-acrylic","peek","tpe","nylon-pa12","cast-urethane","epdm","silicone","nitrile-nbr","neoprene","fkm-viton","nylon-cordura-1000d","polyester-600d"]},"finish":{"type":"string","enum":["as-machined","bead-blasted","vibratory-deburr","anodize-type-ii","anodize-type-iii","chem-film","powder-coat","e-coat","wet-paint","zinc-plating","zinc-nickel-plating","electroless-nickel","chrome-plating","black-oxide","passivation","polished-spi","mold-texture","laser-marking","heat-treating"]},"finish_color":{"type":"string"},"quantity":{"type":"integer","minimum":1},"tolerance":{"type":"string","enum":["standard","precision","tight"]},"inspection":{"type":"string","enum":["standard","fai","ppap"]},"lead_time":{"type":"string","enum":["economy","standard","expedite"]},"sourcing":{"type":"string","enum":["domestic","best","offshore"]},"tariff_pct":{"type":"number"},"threads":{"type":"integer"},"notes":{"type":"string"},"compare":{"type":"boolean","description":"Include cheaper alternative processes"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"insufficient_scope"},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}},"Me":{"type":"object","properties":{"key":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"expires_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]}}},"org":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["house","rep_firm","client","supplier"]},"slug":{"type":"string"}}},"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}}},"permissions":{"type":"array","items":{"type":"string"}},"read_only":{"type":"boolean"}}},"FieldMeta":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["text","longtext","ref","email","phone","url","number","integer","currency","unit_price","percent","date","datetime","boolean","select","multiselect","status","tags","states","relation","user","json"]},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"}}}},"relation":{"type":"string"},"sortable":{"type":"boolean"},"filterable":{"type":"boolean"},"editable":{"type":"boolean"},"required":{"type":"boolean"}}},"ObjectMeta":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"object","properties":{"one":{"type":"string"},"other":{"type":"string"}}},"noun":{"type":"string"},"title_field":{"type":"string"},"can_create":{"type":"boolean"},"can_edit":{"type":"boolean"},"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldMeta"}}}},"Record":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":true,"description":"Field keys as in ObjectMeta. Relation and user fields add `<field>__label`. Dates are YYYY-MM-DD, times ISO 8601, percents fractions."},"RecordPage":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Record"}},"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"},"has_more":{"type":"boolean"},"aggregates":{"type":"object","additionalProperties":{"type":"number"}}}},"FilterRule":{"type":"object","required":["field","op"],"properties":{"field":{"type":"string"},"op":{"type":"string","enum":["is","is_not","contains","not_contains","starts_with","in","not_in","has_any","has_all","gt","gte","lt","lte","between","before","after","on","within_next_days","within_last_days","overdue","empty","not_empty","true","false","me","not_me"]},"value":{}}},"FilterGroup":{"type":"object","required":["rules"],"properties":{"conjunction":{"type":"string","enum":["and","or"],"default":"and"},"rules":{"type":"array","maxItems":40,"items":{"oneOf":[{"$ref":"#/components/schemas/FilterRule"},{"$ref":"#/components/schemas/FilterGroup"}]}}}},"RfqPart":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"part_number":{"type":"string"},"revision":{"type":"string"},"description":{"type":"string"},"process":{"type":"string"},"material":{"type":"string"},"finish":{"type":"string"},"tolerance":{"type":"string"},"quantities":{"type":"array","maxItems":10,"items":{"type":"integer","minimum":1}},"annual_volume":{"type":"integer"},"target_price":{"type":"number"},"spec":{"type":"object","additionalProperties":true,"description":"A part spec as in /api/v1/estimate"}}},"RfqCreate":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":200},"company_id":{"type":"string","description":"SSG and rep keys: the customer account"},"new_company":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"state":{"type":"string"},"industry":{"type":"string"},"confirm_new":{"type":"boolean"}}},"contact_id":{"type":"string"},"rep_id":{"type":"string","description":"SSG keys, and firm keys with firm-wide access"},"owner_user_id":{"type":"string","description":"SSG keys only"},"process":{"type":"string"},"material":{"type":"string"},"industry":{"type":"string"},"quantity":{"type":"integer","minimum":1},"annual_volume":{"type":"integer"},"quote_due":{"type":"string","format":"date"},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"description":{"type":"string"},"requirements":{"type":"object","properties":{"certs":{"type":"array","items":{"type":"string"}},"ppap":{"type":"string"},"itar":{"type":"boolean"},"nda":{"type":"boolean"},"notes":{"type":"string"}}},"ship_to":{"type":"object","properties":{"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"}}},"parts":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/RfqPart"}},"value":{"type":"number","description":"Budgetary production value (not for customer keys)"},"tooling_value":{"type":"number"},"submit":{"type":"boolean","default":true}}},"NoteCreate":{"type":"object","required":["object","record_id","body"],"properties":{"object":{"type":"string"},"record_id":{"type":"string"},"body":{"type":"string","maxLength":20000},"audience":{"oneOf":[{"type":"string","enum":["internal","rep","customer","principal","everyone"]},{"type":"array","items":{"type":"string","enum":["house","rep_firm","client","supplier"]}}]},"principal_id":{"type":"string"},"pinned":{"type":"boolean"}}},"Note":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string"},"record_id":{"type":"string"},"body":{"type":"string"},"audience":{"type":"array","items":{"type":"string"}},"pinned":{"type":"boolean"},"created_at":{"type":"string"}}},"WebhookEvent":{"type":"object","required":["id","type","created_at","data"],"properties":{"id":{"type":"string","description":"Event id: the same for every endpoint and retry. De-duplicate on it."},"type":{"type":"string","enum":["job.created","job.submitted","job.stage_changed","job.routed","rfq.declined","quote.submitted","quote.published","quote.expired","award.created","award.pending_approval","order.status_changed","milestone.updated","shipment.created","invoice.recorded","invoice.updated","ncr.opened","ncr.updated","record.created","record.updated","record.deleted","commission.paid","message.posted","ping"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","description":"The record(s) as the receiving workspace sees them: { object, id, record, related?, changes?, from?, to? }. record.deleted sends record: null, deleted: true.","properties":{"object":{"type":"string"},"id":{"type":"string"},"record":{"oneOf":[{"$ref":"#/components/schemas/Record"},{"type":"null"}]},"related":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/Record"}}},"changes":{"type":"object"}}}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ssg_live_<32 base62>","description":"API keys are created in a workspace's developer settings (API keys and webhooks permission) and sent as `Authorization: Bearer ssg_live_…`. A key acts as the person who created it, in that workspace, and can never do more than their current role allows. Scopes: `read` (list and read records, the event log), `write` (read, plus create requests and notes, update fields), `<object>:read` / `<object>:write` (one object only, e.g. `jobs:read`). Rate limit: 120 requests a minute per key, bursts of 60."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Make a POST safe to retry: the same key and body within 24 hours returns the first response (with Idempotent-Replayed: true); the same key with a different body is refused (422)."},"RequestId":{"name":"X-Request-Id","in":"header","required":false,"schema":{"type":"string","maxLength":128},"description":"Echoed back in the response; generated when absent."}}},"webhooks":{"event":{"post":{"summary":"An event your workspace subscribed to. 2xx within 10 s = delivered; otherwise retried after 1 min, 5 min, 30 min, 2 h, 6 h and 12 h. Redirects aren't followed. 20 failures in a row turn the endpoint off.","parameters":[{"name":"SSG-Signature","in":"header","required":true,"schema":{"type":"string","example":"t=1790000000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd"},"description":"t = unix seconds; v1 = hex HMAC-SHA256 of `${t}.${raw body}` keyed with the endpoint's whole secret (whsec_…). Two v1 values for 24 hours after a secret rotation. Reject if t is more than 5 minutes old."},{"name":"SSG-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"SSG-Event-Id","in":"header","required":true,"schema":{"type":"string"}},{"name":"SSG-Delivery","in":"header","required":true,"schema":{"type":"string"},"description":"Delivery id: new per endpoint, the same across retries"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Received"}}}}},"x-mcp-server":{"url":"https://ssgmfg.com/api/mcp","transport":"streamable-http"}}