# SOAP Contracts API
> Compare caller-supplied WSDL 1.1 and XSD documents for broken references and syntactic contract changes. No documents are downloaded.
Each POST has a fixed USDC price on Base, paid with the x402 exact scheme. The request is validated first, and payment settles only after a successful (2xx) result. Failed calls are not charged.
1. POST JSON matching the requestBody. Invalid input returns 400 with no payment challenge.
2. A valid unpaid call returns 402 with the exact amount and payTo.
3. Pay and retry with payment-signature. Payment settles only if the operation returns 2xx. A 4xx/5xx is not charged.
- Product: https://www.brainiac.software/api/soap-contracts
- Docs: https://www.brainiac.software/api/soap-contracts/docs
- OpenAPI: https://www.brainiac.software/api/soap-contracts/openapi.json
- Contact: support@brainiac.software (https://www.brainiac.software/contact)
## Operations
### POST /api/v1/soap-contracts/wsdl-xsd-dependency-audit
$0.05 USDC. Compare a caller-supplied WSDL 1.1 document and its XSD documents, including an optional previous set. audit_status is valid, warnings, breaking_changes, invalid, or incomplete. Imports are not downloaded. A schema difference is syntactic and is not proof that a SOAP client fails at runtime.
Inputs: wsdl, schemas, previous?, clients?
Docs: https://www.brainiac.software/api/soap-contracts/docs#soap-contracts-wsdl-xsd-dependency-audit
Example request:
```json
{
"wsdl": {
"name": "account.wsdl",
"content": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n"
},
"schemas": [
{
"name": "types.xsd",
"content": "\n\n \n \n \n \n \n \n \n \n \n"
},
{
"name": "extra.xsd",
"content": ""
}
],
"previous": {
"wsdl": {
"name": "account.wsdl",
"content": "\n\n \n \n \n \n \n \n \n \n \n \n"
},
"schemas": [
{
"name": "types.xsd",
"content": "\n\n \n \n \n \n \n \n"
}
]
},
"clients": [
{
"name": "legacy-client",
"operations": [
"ResetPassword"
],
"elements": [
{
"namespace": "urn:account",
"name": "ResetPasswordRequest"
}
]
}
]
}
```
Example response:
```json
{
"audit_status": "breaking_changes",
"dependency_graph": {
"nodes": [
{
"document": "account.wsdl",
"role": "wsdl",
"namespace": "urn:account"
},
{
"document": "types.xsd",
"role": "xsd",
"namespace": "urn:account"
},
{
"document": "extra.xsd",
"role": "xsd",
"namespace": "urn:account"
}
],
"edges": [
{
"from": "account.wsdl",
"to": "types.xsd",
"kind": "include",
"reference": "types.xsd"
}
]
},
"unresolved_references": [
{
"document": "account.wsdl",
"reference": "https://example.com/missing.xsd",
"kind": "import",
"namespace": "urn:missing",
"detail": "https://example.com/missing.xsd is not in the supplied documents. It was not downloaded."
}
],
"namespace_conflicts": [
{
"namespace": "urn:account",
"name": "Account",
"kind": "complexType",
"documents": [
"types.xsd",
"extra.xsd"
],
"detail": "complexType Account in namespace urn:account is defined in types.xsd and extra.xsd with different content. The first definition is used for comparison."
}
],
"contract_changes": [
{
"change": "removed",
"impact": "breaking",
"kind": "operation",
"namespace": "urn:account",
"name": "ResetPassword",
"document": "account.wsdl",
"ownerKind": "operation",
"ownerNamespace": "urn:account",
"ownerName": "ResetPassword",
"detail": "AccountPortType.ResetPassword is in the previous contract and is not in the proposed contract. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "removed",
"impact": "breaking",
"kind": "message",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"document": "account.wsdl",
"ownerKind": "message",
"ownerNamespace": "urn:account",
"ownerName": "ResetPasswordRequest",
"detail": "message ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "removed",
"impact": "breaking",
"kind": "element",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"document": "types.xsd",
"ownerKind": "element",
"ownerNamespace": "urn:account",
"ownerName": "ResetPasswordRequest",
"detail": "element ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "cardinality",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "GetAccountRequest.id",
"document": "types.xsd",
"ownerKind": "element",
"ownerNamespace": "urn:account",
"ownerName": "GetAccountRequest",
"detail": "GetAccountRequest.id changed from 0..1 to 1..1. This is a syntactic cardinality change, not proof a client fails at runtime."
},
{
"change": "added",
"impact": "additive",
"kind": "element",
"namespace": "",
"name": "GetAccountRequest.note",
"document": "types.xsd",
"ownerKind": "element",
"ownerNamespace": "urn:account",
"ownerName": "GetAccountRequest",
"detail": "GetAccountRequest.note was added as an optional item. This is a syntactic change, not proof a client fails at runtime."
},
{
"change": "type",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "Account.id",
"document": "types.xsd",
"ownerKind": "complexType",
"ownerNamespace": "urn:account",
"ownerName": "Account",
"detail": "Account.id changed from {http://www.w3.org/2001/XMLSchema}int to {http://www.w3.org/2001/XMLSchema}string. This is a syntactic type change, not proof a client fails at runtime."
},
{
"change": "added",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "Account.owner",
"document": "types.xsd",
"ownerKind": "complexType",
"ownerNamespace": "urn:account",
"ownerName": "Account",
"detail": "Account.owner was added as a required item. This is a syntactic change, not proof a client fails at runtime."
}
],
"breaking_change_candidates": [
{
"change": "removed",
"impact": "breaking",
"kind": "operation",
"namespace": "urn:account",
"name": "ResetPassword",
"document": "account.wsdl",
"ownerKind": "operation",
"ownerNamespace": "urn:account",
"ownerName": "ResetPassword",
"detail": "AccountPortType.ResetPassword is in the previous contract and is not in the proposed contract. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "removed",
"impact": "breaking",
"kind": "message",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"document": "account.wsdl",
"ownerKind": "message",
"ownerNamespace": "urn:account",
"ownerName": "ResetPasswordRequest",
"detail": "message ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "removed",
"impact": "breaking",
"kind": "element",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"document": "types.xsd",
"ownerKind": "element",
"ownerNamespace": "urn:account",
"ownerName": "ResetPasswordRequest",
"detail": "element ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"change": "cardinality",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "GetAccountRequest.id",
"document": "types.xsd",
"ownerKind": "element",
"ownerNamespace": "urn:account",
"ownerName": "GetAccountRequest",
"detail": "GetAccountRequest.id changed from 0..1 to 1..1. This is a syntactic cardinality change, not proof a client fails at runtime."
},
{
"change": "type",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "Account.id",
"document": "types.xsd",
"ownerKind": "complexType",
"ownerNamespace": "urn:account",
"ownerName": "Account",
"detail": "Account.id changed from {http://www.w3.org/2001/XMLSchema}int to {http://www.w3.org/2001/XMLSchema}string. This is a syntactic type change, not proof a client fails at runtime."
},
{
"change": "added",
"impact": "breaking",
"kind": "element",
"namespace": "",
"name": "Account.owner",
"document": "types.xsd",
"ownerKind": "complexType",
"ownerNamespace": "urn:account",
"ownerName": "Account",
"detail": "Account.owner was added as a required item. This is a syntactic change, not proof a client fails at runtime."
}
],
"affected_operations": [
{
"client": "legacy-client",
"service": "AccountService",
"binding": "AccountBinding",
"operation": "ResetPassword",
"reason": "operation_removed",
"detail": "ResetPassword was removed from the proposed contract. A schema difference does not prove the client fails at runtime."
},
{
"service": "AccountService",
"binding": "AccountBinding",
"operation": "GetAccount",
"reason": "operation_changed",
"detail": "GetAccount reaches element GetAccountRequest. The change is syntactic and is not proof the client fails at runtime."
}
],
"findings": [
{
"code": "operation_removed",
"severity": "high",
"document": "account.wsdl",
"namespace": "urn:account",
"name": "ResetPassword",
"operation": "ResetPassword",
"detail": "AccountPortType.ResetPassword is in the previous contract and is not in the proposed contract. This is a syntactic removal, not proof a client fails at runtime."
},
{
"code": "message_removed",
"severity": "high",
"document": "account.wsdl",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"detail": "message ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"code": "element_removed",
"severity": "high",
"document": "types.xsd",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"detail": "element ResetPasswordRequest in namespace urn:account was removed. This is a syntactic removal, not proof a client fails at runtime."
},
{
"code": "element_cardinality",
"severity": "high",
"document": "types.xsd",
"namespace": "",
"name": "GetAccountRequest.id",
"detail": "GetAccountRequest.id changed from 0..1 to 1..1. This is a syntactic cardinality change, not proof a client fails at runtime."
},
{
"code": "element_added",
"severity": "low",
"document": "types.xsd",
"namespace": "",
"name": "GetAccountRequest.note",
"detail": "GetAccountRequest.note was added as an optional item. This is a syntactic change, not proof a client fails at runtime."
},
{
"code": "element_type",
"severity": "high",
"document": "types.xsd",
"namespace": "",
"name": "Account.id",
"detail": "Account.id changed from {http://www.w3.org/2001/XMLSchema}int to {http://www.w3.org/2001/XMLSchema}string. This is a syntactic type change, not proof a client fails at runtime."
},
{
"code": "element_added",
"severity": "high",
"document": "types.xsd",
"namespace": "",
"name": "Account.owner",
"detail": "Account.owner was added as a required item. This is a syntactic change, not proof a client fails at runtime."
},
{
"code": "client_component_removed",
"severity": "high",
"namespace": "urn:account",
"name": "ResetPasswordRequest",
"detail": "legacy-client depends on element ResetPasswordRequest in namespace urn:account, and the proposed contract does not declare it. This is a syntactic removal, not proof the client fails at runtime."
},
{
"code": "recursive_type",
"severity": "medium",
"namespace": "urn:account",
"name": "Account",
"detail": "Account in namespace urn:account participates in a recursive type reference. The cycle is reported from the supplied documents only."
},
{
"code": "schema_unreferenced",
"severity": "medium",
"document": "extra.xsd",
"detail": "extra.xsd is supplied, and no supplied document imports, includes, or redefines it."
},
{
"code": "definition_conflict",
"severity": "high",
"document": "extra.xsd",
"namespace": "urn:account",
"name": "Account",
"detail": "complexType Account in namespace urn:account is defined in types.xsd and extra.xsd with different content. The first definition is used for comparison."
},
{
"code": "reference_unresolved",
"severity": "medium",
"document": "account.wsdl",
"namespace": "urn:missing",
"name": "https://example.com/missing.xsd",
"detail": "https://example.com/missing.xsd is not in the supplied documents. It was not downloaded."
},
{
"code": "syntactic_only",
"severity": "low",
"detail": "This comparison is syntactic. It does not prove that an existing SOAP client would fail at runtime, and it does not establish full client compatibility."
}
],
"limitations": [
"Documents are the XML strings in the request. Imports, includes, and redefines were not downloaded.",
"A difference between contracts is syntactic. It is not proof that a SOAP client fails at runtime.",
"Names are compared as a namespace plus a local name.",
"Only WSDL 1.1 and XML Schema are read. The root WSDL is the only WSDL document in a set.",
"When one name is defined more than once, the first definition is used for comparison.",
"This audit does not establish full client compatibility."
]
}
```
### POST /api/v1/soap-contracts/schema-dependency-tree
$0.04 USDC. Read import, include, and complexType names from the supplied XML. A document cycle, or a complex type that references itself, sets the circular flag. The score counts types, imports, and non-builtin references. schemaLocation values are not downloaded.
Inputs: documents
Docs: https://www.brainiac.software/api/soap-contracts/docs#soap-contracts-schema-dependency-tree
Example request:
```json
{
"documents": [
{
"name": "types.xsd",
"content": "\n\n \n \n"
},
{
"name": "other.xsd",
"content": "\n\n \n \n"
}
]
}
```
Example response:
```json
{
"schema_complexity_score": 55,
"circular_dependency_detected": true,
"dependency_tree_json": [
{
"document": "types.xsd",
"imports": [
"other.xsd"
],
"types": [
"Account"
],
"references": [
"Account"
]
},
{
"document": "other.xsd",
"imports": [
"types.xsd"
],
"types": [
"Note"
],
"references": []
}
]
}
```