OpenSocial Restful ProtocolThe RESTful API serves as a common protocol understood by all OpenSocial 0.8-compliant clients and servers. 0. Notation and ConventionsThe key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC2119]. Domain name examples use [RFC2606]. 1. OverviewThis API defines a language and platform neutral protocol for clients to interact with OpenSocial container servers outside of gadgets on a web page. As a protocol, it is intended to be reasonably easy to implement in any language and on any platform. It should also be usable across a range of clients, from gadgets operating within a web page to servers communicating to synchronize data about a user. The protocol operates primarily in terms of resources and operations on them. It is defined on top of the HTTP protocol, and uses the standard HTTP methods (GET, POST, PUT, DELETE, etc.) to retrieve and change server state. No single data representation is ideal for every client. This protocol defines representations for each resource in three widely supported formats, JSON [RFC4627], XML, and Atom/AtomPub [RFC4287][RFC5023], using a set of generic mapping rules. The mapping rules allow a server to write to a single interface rather than implementing the protocol three times. OpenSocial container servers are free to define additional representations but MUST support at least the JSON and Atom formats for all resources and XML for the people calls. XML MAY be supported for the rest of the resources. The protocol defines Activity, Person, Group, and AppData resources. Most operations consist of retrieving (GET), updating (PUT), creating (POST or PUT), or destroying (DELETE) these resources. It also specifies an optional partial update feature which avoids sending large resources over the wire to update just one field. OpenSocial API Background details the underlying concepts used below; this document assumes familiarity with the OpenSocial model. 2. Data RepresentationsEach resource has three representations, as JSON, XML, and Atom. All data must be representable in each format. The XML and JSON formats have a one to one mapping while the Atom format is defined separately for each type of object and collection. Throughout this document, examples will only be given in JSON and Atom. The XML representation can be mapped directly from the JSON and MUST conform to the XSD in Section 12. Each resource is represented as a hierarchical tree of elements. Ordering of elements within a parent element may or may not be significant, depending on the context. Mapping consists of converting between the internal hierarchy and the JSON/XML or Atom protocol format. The set of allowed fields in each type of data is the same as the set documented in Section 11 (field names) The general rules for mapping between the Atom and JSON formats are as follows. Each data type may add additional aliasing rules.
Examples of the primary types of data follow. Each example shows both representations, JSON and Atom, with the payload data highlighted for ease of comparison. 2.1 ResponsesThe structure of the response object returned from a successful request for the JSON or XML formats is as follows. The root element isresponse, which is shown explicitly as the root element in XML format, and is the anonymous root object returned when the format is json (i.e. in JSON, the response returned is the object value of the response node). The response node MUST contain the following child nodes, and MAY contain additional nodes that the Service Provider wishes to add to expose additional data. Note thatstartIndex, itemsPerPage, and totalResults are based on OpenSearch.
For example: application/json representation: {
or, for only one item: "startIndex" : 1 "itemsPerPage" : 10 "totalResults" : 100, "entry" : {...only item...} } xml representation: <response> or, for only one item: <response> The atom format uses the JSON to Atom mapping rules described above and has a different base format than the XML: application/atom+xml representation: <feed xmlns="http://www.w3.org/2005/Atom" xmlos:osearch="http://a9.com/-/spec/opensearch/1.1"> 2.2 PersonA Person contains social network data about a single person. The same record is used for contacts/friends and for profiles. See Section 11 (field names) for a full list of available fields and their types. See also the general mapping rules in section 2. A minimal Person example: application/json representation: { "id" : "example.org:34KJDCSKJN2HHF0DW20394", application/xml representation:
application/atom+xml representation: <entry xmlns="http://www.w3.org/2005/Atom"> Note: The atom:summary element is the appropriate place to put a text or HTML representation of the structured data present in the content element, and the atom:title element is the appropriate place to copy a short descriptive name for the entry, such as name.unstructured. Servers MAY choose to add these or other fields to make their feeds more useful for generic aggregators or tools. 2.3 GroupOpenSocial Groups are owned by people, and are used to tag or categorize people and their relationships. The RESTful API supports querying for the available groups for a given user. The groups are returned as a collection. Each group has a display name, an identifier which is unique within the groups owned by that person, and a URI link. A Group example:
application/xml representation: <group xmlns="http://ns.opensocial.org/2008/opensocial"> application/atom+xml representation: <entry xmlns="http://www.w3.org/2005/Atom"> Groups only appear within Group Collections and are used to retrieve a list of available groups for a given person. 2.4 ActivityAn OpenSocial Activity represents a short summary or notification of a timestamped event, often with pointers for more information. See Section 11 (field names) for a full list of available fields and their types. Activities have extensive Atom hoisting rules to ensure maximum compatibility with standard feed processing code:
A minimal Activity example: application/json representation: {
application/xml representation: <activity xmlns="http://ns.opensocial.org/2008/opensocial"> application/atom+xml representation: <entry xmlns="http://www.w3.org/2005/Atom"> Note: The title field is a string that may only have the following html tags: <b>, <i>, <a>, <span>. The container may ignore this formatting when rendering the activity. 2.5 AppDataAppData stores uninterpreted key/value pairs on behalf of an application. The standard unit of AppData is all of the key/value pairs stored for a given app on behalf of a given user; however, the API supports other types of queries (detailed below). To retrieve a subset of fields, use the fields= selector syntax (detailed below). An isolated AppData example The first example is of a collection of key/value pairs for a particular application/user pair:
application/xml representation: <appdata xmlns="http://ns.opensocial.org/2008/opensocial"> application/atom+xml representation: <entry xmlns="http://www.w3.org/2005/Atom"> An AppData Collection Example In this example, a client has requested a collection of data that spans multiple users. The result is a collection which, by default, is given a special default JSON representation as a mapping from users to their data. application/json representation: (maps directly to the xml format) {
The data within each field is assumed to be in JSON format and is otherwise uninterpreted. 3. OperationsOpenSocial uses standard HTTP methods: GET to retrieve, PUT to update in place, POST to create new, and DELETE to remove. POST is special; it operates on collections and creates new activities, persons, or app data within those collections, and returns the base URI for the created resource in the Location: header, per AtomPub semantics. Restricted clients, or clients behind restricted clients, which cannot use PUT or DELETE SHOULD translate PUT and DELETE to POST operations with an additional X-HTTP-Method-Override: header: POST /... HTTP/1.1 Servers SHOULD respond to POST+X-HTTP-Method-Override as if the content of the header were the actual operation sent. Note: OpenSocial 0.8 does not support cross-domain JSONP (GET with callback), but servers MAY offer this as an extension. It is RECOMMENDED that such servers implement appropriate security and authorization controls. 4. Request Authentication and Authorization ContextEach RESTful operation has a request context that usually includes authentication and authorization information. Typically, the context information includes the requestor id (the user initiating the request) and app ID (the application, or whatever is acting as the user's agent). It may include other container-specific information. Containers MUST be an OAuth Core 1.0 Service Provider (a web application that allows access via OAuth). Containers MAY also support other ways to establish a request context. Containers MUST also support the Consumer Request OAuth extension, in which the end user has not directly authorized the operation. Applications SHOULD ensure that the users have given prior consent, implicitly or explicitly, to the operation or class of operations. However, containers MAY require an additional prior trust relationship be established by the app in order to allow use of Consumer Request OAuth. If a Consumer has a user identifier and wishes to indicate that the operation is being done on behalf of that particular user, it SHOULD provide the OAuth extension parameter xoauth_requestor_id with the OAuth signed parameters. Consumers SHOULD only provide this if the user has given prior consent, implicitly or explicitly, to the operation or class of operations, as it indicates that the operation is being done on behalf of the user. Container SPs MUST either honor the parameter or ignore it as if it were not provided. Thus, a request context usually includes the requesting application (the OAuth Consumer), and may include the requesting user, either implicitly via an oauth_token or explicitly via xoauth_requestor_id. It may also include additional information via extensions or other channels (cookies, URI parameters, client SSL certificates, etc.) A container may also accept requests with no authentication or authorization (authnz) information at all for public data. A container may provide a public version (e.g., of a profile) if no authnz information is provided. Note that the data provided for a given RESTful URI MAY vary per requestor or app. Thus, the meaning of the resource at a given URI is "the view of the information available to the current requestor/app combination". In the case where no information is available due to lack of authorization, an HTTP 401 Unauthorized response SHOULD be returned to the client. In the case where at least some view of the information is available, it SHOULD be returned using a 200 status, with a standard OAuth WWW-Authenticate: header indicating that additional information may be available when using a different authnz context. 5. DiscoveryA container declares what collection and features it supports, and provides templates for discovering them, via a simple discovery document. A client starts the discovery process at the container's identifier URI (e.g., example.org). The full flow is available athttp://xrds-simple.net/core/1.0/; in a nutshell:
The discovery document is an XML file in the same format used for OpenID and OAuth discovery, defined at http://xrds-simple.net/core/1.0/: <XRDS xmlns="xri://$xrds"> Each Service advertises a service provided by the container. Each container MUST support the service Types documented below and MAY support others by advertising them in the discovery document. Each service comprises a set of resources defined by the given URI Template (or URI, if there is only a single resource). Clients follow the URIs and instantiate the templates to find and operate on specific resources. (URI Template syntax is documented at http://www.ietf.org/internet-drafts/draft-gregorio-uritemplate-03.txt.) The set of substitution variables is fixed for each service Type. The core set of service Types and their substitution variables is documented below. Extensions to OpenSocial SHOULD document their substitution variables; note that a reasonable place to put human readable documentation is at the namespace URI. 6. The Core OpenSocial Service TypesThis section defines the core types that every OpenSocial container MUST support, their XRDS types, and their semantics. Unless otherwise specified, all HTTP operations are generally allowed for any URI endpoint; a container which wishes to specify the allowed operations SHOULD provide an HTTP Allow: header for each resource listing the allowed operations. 6.1 PeopleXRDS Type: http://ns.opensocial.org/2008/opensocial/people guid : Container-globally-unique user identifier; identifies owner of the people data, or @me to indicate the requestor should be usedselector : One of
People URI examples: Note that a given container may use alternative URI formats; for example, /people.cgi?guid={guid}&groupid={groupid}
is a valid URI pattern given the appropriate XRDS discovery document which allows clients to map the parameters to a concrete URI. Friends may be added by POSTing to the appropriate collection (e.g., /people/{guid}/@friends). Containers MAY require a dual opt-in process before the friend record appears in the collection, and in this case SHOULD return a 202 Accepted response, indicating that the request is 'in flight' and may or may not be ultimately successful. 6.2 GroupsXRDS Type: http://ns.opensocial.org/2008/opensocial/groups guid : Container-globally-unique user identifier; identifies owner of the people data; can be @me to indicate auth[nz] requestor should be used. Groups URI examples: /groups/{guid} -- Collection of groups associated with user {guid}
6.3 ActivitiesXRDS Type: http://ns.opensocial.org/2008/opensocial/activities guid : Container-globally-unique user identifier; owner or recipient of the activity data, or @me to indicate the requestor should be used selector : One of
appId : The app id to select activities for, or @app to indicate the currently requesting application. Activity URI examples: /activities/{guid}/@self -- Collection of activities generated by given user
6.4 AppData (http://ns.opensocial.org/2008/opensocial/appdata)guid : Container-globally-unique user identifier, or @me to indicate the requestor should be used selector : One of
appId : The app id to select activities for, or @app to indicate the currently requesting application. AppData URI examples: /appdata/{guid}/@self/{appid} -- All app data for user {guid}, app {appid}
6.5 Standard Query ParametersThese additional query parameters may be used with any URI above. The parameters startIndex and count are interpreted according to the OpenSearch spec. count={count} -- Requests page size for paged collection. If no parameter is specified the container can choose how many items
7. Security ConsiderationsContainers SHOULD carefully consider security. Containers MUST support OAuth but SHOULD use appropriate policies to determine allowed operations on a per-Consumer and per-user basis. Per the OAuth spec, Containers SHOULD document how a Consumer can direct a user to a Container web page to obtain an oauth_token for future use. Note that this is a vector for phishing if the user is required to enter their credentials. Containers SHOULD support SSL connections for sensitive data as OAuth on its own does not provide encryption or message body integrity checking. Containers should base their security decisions on the type of client in use; a generally available desktop client, for example, cannot effectively protect a Consumer Secret that is installed with each client. The security of communications with a partner service, on the other hand, is dependent on the effectiveness of that service's security procedures. Containers may wish to rate limit requests from unknown clients, or require registration, in order to mitigate risk. Containers should scope oauth_tokens as narrowly as possible (e.g., allow reading but not writing if a client only performs reads). 8. Concurrency Control (Optional)This feature allows a container and client to cooperate in order to prevent multiple containers from overwriting each other's data. It uses the standard HTTP/AtomPub optimistic concurrency mechanism based on ETags (see section 9.5 of [RFC5023] for details; the same mechanism applies regardless of the data format used for the body of the PUT). 8.1 DiscoveryConcurrency control is available on a resource-by-resource basis. When an updateable resource supports concurrency control, the container SHOULD supply an ETag encoding the resource's current state when supplying a representation to clients. If a resource does not support optimistic concurrency, it MUST respond to an update request containing an If-Match: header with a 403 Not Implemented error. A server which chooses not to support optimistic concurrency SHOULD omit ETags on its responses for updateable resources. A client SHOULD assume that optimistic concurrency is not available if no ETag is present. 8.2 SemanticsWhen a client is given an ETag, it MAY supply that ETag in an If-Match: header on subsequent updates. The semantics are that the client can supply the new representation and the previous ETag; the server inspects the current state of the resource and applies the update if the client supplied ETag matches (meaning no intervening updates have happened), otherwise responds with a 409 Conflict error and the new ETag. Clients may then take appropriate actions to resolve the conflict, or fail the operation, depending on their needs. Clients are also free to use PUT to simply overwrite a resource with a new state at any time, ignoring possible overwriting problems. If partial updates are supported (see below), a server MUST accept an ETag given for either a base resource or a projection of that resource upon a subsequent PUT for that resource. That is, it is legal to supply an ETag you received when GETting the full representation of a resource even if you are only PUTting back a single field. If you intend to simply overwrite that single field, then you skip sending any ETag. 9. Partial Updates
Partial updates avoid the need to send full representations of data on updates, especially for People and App Data. The primary use case is when a client has retrieved a full representation and subsequently wishes to send a small update to a server. In the most general case, the client may have a series of small updates (e.g., changing tags on a large number of contacts) scattered across many resources. To accomplish these partial updates we will take advantage of the "fields" parameter. When the "fields" parameter is specified on a url, only those fields will be looked at when updating an object. If a field is in the parameter list but not part of the post, that would be considered a removal of that field. If the field is in the post but not in the parameter list a 400 bad request error will be returned. If a field is in both places then it will be updated normally. 10. Messaging (Optional)A social network service may optionally expose a mechanism for sending short messages between users. The functionality and policies are parallel to those of the JS API's requestSendMessage. DiscoveryIf a container supports messaging, it advertises a "messages" Service in its discovery document: <Service> SemanticsTo create a message and place it in a queue, a client PUTs a message to an 'outbox' collection resource discovered from the XRDS document: PUT /messages/{guid}/outbox/{msgid}
The outbox is owned by the source user. Placing a message in the outbox requests that the message be delivered to one or more recipients. Containers are free to filter or alter the message according to their own policies (such as security or rate limiting policies). The format of the message is the same as an activity, but with an additional set of recipients (osapi:recipient): <entry xmlns="http://www.w3.org/2005/Atom" The {msgid} is client generated and SHOULD be globally unique. If a client does not care about failure cases, it can alternatively use a standard AtomPub POST to /messages/{source-uid}/outbox and leave generation of the ID to the container. In either case, the response is 201 Created on success. If not supported, the response code should be 403 Not Implemented. Typically a container would choose to only allow a PUT to an outbox where the {guid} equals the requestor id, but this is a container security policy decision. Containers may choose to allow messaging only between friends or user other heuristics to prevent spam. 11. Field Names
Each field is defined as either a Singular Field, in which case there can be at most one instance of that field per contact, or as a Plural Field, which case any number of instances of that field may be present per contact. Unless otherwise specified, all fields are optional and of type xs:string. 11.1 PersonEach person returned MUST include the id and displayName fields with non-empty values, but all other fields are optional, and it is recognized that not all Service Providers will be able to provide data for all the supported fields. The field list is below is broad so that, for Service Providers that do support any of these fields, there is a standard field name available11.1.1 singular person fields
The following additional Singular Fields are defined, based on their specification in the OpenSocial javascript apis: aboutMe, bodyType,currentLocation, drinker, ethnicity, fashion, happiestWhen, humor, livingArrangement, lookingFor, profileSong,profileVideo, relationshipStatus, religion, romance, scaredOf, sexualOrientation, smoker, and status. 11.1.2 plural person fieldsUnless specified otherwise, all Plural Fields have the same three standard sub-fields:
When returning Plural Fields, Service Providers SHOULD canonicalize the value returned, if appropriate (e.g. for e-mail addresses and URLs). Providers MAY return the same value more than once with different types (e.g. the same e-mail address may used for work and home), but SHOULD NOT return the same (type, value) combination more than once per Plural Field, as this complicates processing by the Consumer.
The following additional Plural Fields are defined, based on their specification in OpenSocial: activities, books, cars, children,food, heroes, interests, jobInterests, languages, languagesSpoken, movies, music, pets, politicalViews, quotes, sports,turnOffs, turnOns, and tvShows. 11.1.3 name elementThe components of the person's real name. Providers MAY return just the full name as a single string in the formatted sub-field, or they MAY return just the individual component fields using the other sub-fields, or they MAY return both. If both variants are returned, they SHOULD be describing the same name, with the formatted name indicating how the component fields should be combined.
11.1.4 address elementThe components of a physical mailing address. Service Providers MAY return just the full address as a single string in the formattedsub-field, or they MAY return just the individual component fields using the other sub-fields, or they MAY return both. If both variants are returned, they SHOULD be describing the same address, with the formatted address indicating how the component fields should be combined.
11.1.5 organization elementDescribes a current or past organizational affiliation of this contact. Service Providers that support only a single Company Name and Job Title field should represent them with a single organization element with name and title properties, respectively.
11.1.6 account elementDescribes an account held by this Person, which MAY be on the Service Provider's service, or MAY be on a different service. Consumers SHOULD NOT assume that this account has been verified by the Service Provider to actually belong to this Person. For each account, the domain is the top-most authoritative domain for this account, e.g. yahoo.com or reader.google.com, and MUST be non-empty. Each account must also contain a non-empty value for either username or userid, and MAY contain both, in which case the two values MUST be for the same account. These accounts can be used to determine if a user on one service is also known to be the same person on a different service, to facilitate connecting to people the user already knows on different services. If Consumers want to turn these accounts into profile URLs, they can use an open-source library like [Social Graph Node Mapper] (Fitzpatrick, B.).
11.2 Activity11.2.1 activity fields
The following fields are defined, based on their specification in the OpenSocial javascript apis: appId, body, bodyId, externalId, id, mediaItems, postedTime, priority, streamFaviconUrl, streamSourceUrl, streamTitle, streamUrl, templateParams, title, url, userId11.3 Message11.3.1 message fieldsThe following fields are defined, based on their specification in the OpenSocial javascript apis: body, bodyId, title, titleId, type12. XML format XSDThe response to a request with format=xml MUST conform to the following XSD: <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://ns.opensocial.org/2008/opensocial" elementFormDefault="qualified" targetNamespace="http://ns.opensocial.org/2008/opensocial" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="ActivityCollection"> <xs:all> <xs:element minOccurs="0" name="activities" type="tns:ArrayOfActivity" /> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="ActivityCollection" type="tns:ActivityCollection" /> <xs:complexType name="ArrayOfActivity"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Activity" type="tns:Activity" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfActivity" type="tns:ArrayOfActivity" /> <xs:complexType name="Activity"> <xs:all> <xs:element minOccurs="0" name="appId" type="xs:string" /> <xs:element minOccurs="0" name="body" type="xs:string" /> <xs:element minOccurs="0" name="bodyId" type="xs:string" /> <xs:element minOccurs="0" name="externalId" type="xs:string" /> <xs:element minOccurs="0" name="id" type="xs:string" /> <xs:element minOccurs="0" name="mediaItems" type="tns:ArrayOfMediaItem" /> <xs:element minOccurs="0" name="postedTime" type="xs:long" /> <xs:element minOccurs="0" name="priority" type="xs:double" /> <xs:element minOccurs="0" name="streamFaviconUrl" type="xs:string" /> <xs:element minOccurs="0" name="streamSourceUrl" type="xs:string" /> <xs:element minOccurs="0" name="streamTitle" type="xs:string" /> <xs:element minOccurs="0" name="streamUrl" type="xs:string" /> <xs:element minOccurs="0" name="templateParams" type="tns:ActivityTemplateParams" /> <xs:element minOccurs="0" name="title" type="xs:string" /> <xs:element minOccurs="0" name="titleId" type="xs:string" /> <xs:element minOccurs="0" name="url" type="xs:string" /> <xs:element minOccurs="0" name="userId" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="Activity" type="tns:Activity" /> <xs:complexType name="ArrayOfMediaItem"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="MediaItem" type="tns:MediaItem" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfMediaItem" type="tns:ArrayOfMediaItem" /> <xs:complexType name="MediaItem"> <xs:all> <xs:element minOccurs="0" name="mimeType" type="xs:string" /> <xs:element minOccurs="0" name="type" type="tns:MediaItemType" /> <xs:element minOccurs="0" name="url" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="MediaItem" type="tns:MediaItem" /> <xs:simpleType name="MediaItemType"> <xs:restriction base="xs:string"> <xs:enumeration value="AUDIO" /> <xs:enumeration value="IMAGE" /> <xs:enumeration value="VIDEO" /> </xs:restriction> </xs:simpleType> <xs:element name="MediaItemType" type="tns:MediaItemType" /> <xs:complexType name="ActivityTemplateParams"> <xs:all> <xs:element minOccurs="0" name="PersonKey" type="xs:string" /> <xs:element minOccurs="0" name="PersonKey.DisplayName" type="xs:string" /> <xs:element minOccurs="0" name="PersonKey.Id" type="xs:string" /> <xs:element minOccurs="0" name="PersonKey.ProfileUrl" type="xs:string" /> <xs:element minOccurs="0" name="person" type="tns:person" /> </xs:all> </xs:complexType> <xs:element name="ActivityTemplateParams" type="tns:ActivityTemplateParams" /> <xs:complexType name="person"> <xs:all> <xs:element minOccurs="0" name="aboutMe" type="xs:string" /> <xs:element minOccurs="0" name="activities" type="tns:ArrayOfActivities" /> <xs:element minOccurs="0" name="accounts" type="tns:account"/> <xs:element minOccurs="0" name="anniversary" type="xs:dateTime" /> <xs:element minOccurs="0" name="birthday" type="xs:dateTime" /> <xs:element minOccurs="0" name="bodyType" type="tns:BodyType" /> <xs:element minOccurs="0" name="books" type="tns:ArrayOfBooks" /> <xs:element minOccurs="0" name="cars" type="tns:ArrayOfCars" /> <xs:element minOccurs="0" name="children" type="xs:string" /> <xs:element minOccurs="0" name="connected" type="tns:Presence" /> <xs:element minOccurs="0" name="currentLocation" type="tns:Address" /> <xs:element minOccurs="0" name="displayName" type="xs:string" /> <xs:element minOccurs="0" name="drinker" type="tns:Drinker" /> <xs:element minOccurs="0" name="emails" type="tns:ArrayOfEmail" /> <xs:element minOccurs="0" name="ethnicity" type="xs:string" /> <xs:element minOccurs="0" name="fashion" type="xs:string" /> <xs:element minOccurs="0" name="food" type="tns:ArrayOfFoods" /> <xs:element minOccurs="0" name="gender" type="xs:string" /> <xs:element minOccurs="0" name="happiestWhen" type="xs:string" /> <xs:element minOccurs="0" name="hasApp" type="xs:boolean" /> <xs:element minOccurs="0" name="heroes" type="tns:ArrayOfHeroes" /> <xs:element minOccurs="0" name="humor" type="xs:string" /> <xs:element minOccurs="0" name="id" type="xs:string" /> <xs:element minOccurs="0" name="ims" type="tns:ArrayOfIm"/> <xs:element minOccurs="0" name="interests" type="tns:ArrayOfInterests" /> <xs:element minOccurs="0" name="jobInterests" type="xs:string" /> <xs:element minOccurs="0" name="languagesSpoken" type="tns:ArrayOfLanguages" /> <xs:element minOccurs="0" name="livingArrangement" type="xs:string" /> <xs:element minOccurs="0" name="lookingFor" type="xs:string" /> <xs:element minOccurs="0" name="movies" type="tns:ArrayOfMovies" /> <xs:element minOccurs="0" name="music" type="tns:ArrayOfMusic" /> <xs:element minOccurs="0" name="name" type="tns:name" /> <xs:element minOccurs="0" name="nickname" type="xs:string" /> <xs:element minOccurs="0" name="organizations" type="tns:ArrayOfOrganization" /> <xs:element minOccurs="0" name="pets" type="xs:string" /> <xs:element minOccurs="0" name="photos" type="tns:ArrayOfPhoto" /> <xs:element minOccurs="0" name="phoneNumbers" type="tns:ArrayOfPhone" /> <xs:element minOccurs="0" name="politicalViews" type="xs:string" /> <xs:element minOccurs="0" name="preferredUsername" type="xs:string" /> <xs:element minOccurs="0" name="profileSong" type="tns:Url" /> <xs:element minOccurs="0" name="profileUrl" type="xs:string" /> <xs:element minOccurs="0" name="profileVideo" type="tns:Url" /> <xs:element minOccurs="0" name="published" type="xs:dateTime"/> <xs:element minOccurs="0" name="quotes" type="tns:ArrayOfQuotes" /> <xs:element minOccurs="0" name="relationships" type="tns:ArrayOfRelationship" /> <xs:element minOccurs="0" name="relationshipStatus" type="xs:string" /> <xs:element minOccurs="0" name="religion" type="xs:string" /> <xs:element minOccurs="0" name="romance" type="xs:string" /> <xs:element minOccurs="0" name="scaredOf" type="xs:string" /> <xs:element minOccurs="0" name="sexualOrientation" type="xs:string" /> <xs:element minOccurs="0" name="smoker" type="tns:Smoker" /> <xs:element minOccurs="0" name="sports" type="tns:ArrayOfSports" /> <xs:element minOccurs="0" name="tags" type="tns:ArrayOfTags" /> <xs:element minOccurs="0" name="thumbnailUrl" type="xs:string" /> <xs:element minOccurs="0" name="turnOffs" type="tns:ArrayOfTurnOffs" /> <xs:element minOccurs="0" name="turnOns" type="tns:ArrayOfTurnOns" /> <xs:element minOccurs="0" name="tvShows" type="tns:ArrayOfTvShows" /> <xs:element minOccurs="0" name="updated" type="xs:dateTime"/> <xs:element minOccurs="0" name="urls" type="tns:ArrayOfPersonUrl" /> <xs:element minOccurs="0" name="utcOffset" type="xs:int" /> </xs:all> </xs:complexType> <xs:element name="person" type="tns:person" /> <xs:element name="group" type="tns:group" /> <xs:complexType name="group"> <xs:all> <xs:element minOccurs="0" name="id" type="xs:string" /> <xs:element minOccurs="0" name="title" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="appdataEntry" type="tns:appdataEntry" /> <xs:complexType name="appdataEntry"> <xs:all> <xs:element minOccurs="1" name="key" type="xs:string" /> <xs:element minOccurs="1" name="value" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="appdata" type="tns:appdata" /> <xs:complexType name="appdata"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="entry" type="tns:appdataEntry" /> </xs:sequence> </xs:complexType> <xs:complexType name="ArrayOfgroup"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="person" type="tns:group" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfgroup" type="tns:ArrayOfgroup" /> <xs:complexType name="GroupCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="groups" type="tns:ArrayOfgroup" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="GroupCollection" type="tns:GroupCollection" /> <xs:complexType name="ArrayOfActivities"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="activity" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfActivities" type="tns:ArrayOfActivities" /> <xs:complexType name="BodyType"> <xs:all> <xs:element minOccurs="0" name="build" type="xs:string" /> <xs:element minOccurs="0" name="eyeColor" type="xs:string" /> <xs:element minOccurs="0" name="hairColor" type="xs:string" /> <xs:element minOccurs="0" name="height" type="xs:double" /> <xs:element minOccurs="0" name="weight" type="xs:double" /> </xs:all> </xs:complexType> <xs:element name="BodyType" type="tns:BodyType" /> <xs:complexType name="ArrayOfBooks"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="book" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfBooks" type="tns:ArrayOfBooks" /> <xs:complexType name="ArrayOfCars"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="car" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfCars" type="tns:ArrayOfCars" /> <xs:complexType name="Address"> <xs:all> <xs:element minOccurs="0" name="country" type="xs:string" /> <xs:element minOccurs="0" name="extendedAddress" type="xs:string" /> <xs:element minOccurs="0" name="latitude" type="xs:double" /> <xs:element minOccurs="0" name="locality" type="xs:string" /> <xs:element minOccurs="0" name="longitude" type="xs:double" /> <xs:element minOccurs="0" name="poBox" type="xs:string" /> <xs:element minOccurs="0" name="postalCode" type="xs:string" /> <xs:element minOccurs="0" name="primary" type="xs:boolean"/> <xs:element minOccurs="0" name="region" type="xs:string" /> <xs:element minOccurs="0" name="streetAddress" type="xs:string" /> <xs:element minOccurs="0" name="type" type="xs:string" /> <xs:element minOccurs="0" name="formatted" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="Address" type="tns:Address" /> <xs:complexType name="Drinker"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:DrinkerType" /> </xs:all> </xs:complexType> <xs:element name="Drinker" type="tns:Drinker" /> <xs:simpleType name="DrinkerType"> <xs:restriction base="xs:string"> <xs:enumeration value="HEAVILY" /> <xs:enumeration value="NO" /> <xs:enumeration value="OCCASIONALLY" /> <xs:enumeration value="QUIT" /> <xs:enumeration value="QUITTING" /> <xs:enumeration value="REGULARLY" /> <xs:enumeration value="SOCIALLY" /> <xs:enumeration value="YES" /> </xs:restriction> </xs:simpleType> <xs:element name="DrinkerType" type="tns:DrinkerType" /> <xs:complexType name="ArrayOfPersonUrl"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="url" type="tns:PluralPersonField" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfPersonUrl" type="tns:ArrayOfPersonUrl" /> <xs:complexType name="ArrayOfEmail"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="email" type="tns:PluralPersonField" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfEmail" type="tns:ArrayOfEmail" /> <xs:complexType name="PluralPersonField"> <xs:all> <xs:element minOccurs="0" name="value" type="xs:string" /> <xs:element minOccurs="0" name="type" type="xs:string" /> <xs:element minOccurs="0" name="primary" type="xs:boolean"/> </xs:all> </xs:complexType> <xs:complexType name="ArrayOfIm"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="im" type="tns:PluralPersonField" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfIm" type="tns:ArrayOfIm" /> <xs:complexType name="ArrayOfPhoto"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="photo" type="tns:PluralPersonField" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfPhoto" type="tns:ArrayOfPhoto" /> <xs:complexType name="ArrayOfRelationship"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="relationship" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfRelationship" type="tns:ArrayOfRelationship" /> <xs:element name="account" type="tns:account" /> <xs:complexType name="ArrayOfAccount"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="account" type="tns:account" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfAccount" type="tns:ArrayOfAccount" /> <xs:complexType name="account"> <xs:all> <xs:element minOccurs="0" name="domain" type="xs:string" /> <xs:element minOccurs="0" name="primary" type="xs:boolean"/> <xs:element minOccurs="0" name="userid" type="xs:string" /> <xs:element minOccurs="0" name="username" type="xs:string" /> </xs:all> </xs:complexType> <xs:complexType name="ArrayOfFoods"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="food" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfFoods" type="tns:ArrayOfFoods" /> <xs:complexType name="ArrayOfHeroes"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="hero" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfHeroes" type="tns:ArrayOfHeroes" /> <xs:complexType name="ArrayOfInterests"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="interest" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfInterests" type="tns:ArrayOfInterests" /> <xs:complexType name="ArrayOfOrganization"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Organization" type="tns:Organization" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfOrganization" type="tns:ArrayOfOrganization" /> <xs:complexType name="Organization"> <xs:all> <xs:element minOccurs="0" name="department" type="xs:string" /> <xs:element minOccurs="0" name="description" type="xs:string" /> <xs:element minOccurs="0" name="endDate" type="xs:dateTime" /> <xs:element minOccurs="0" name="location" type="tns:Address" /> <xs:element minOccurs="0" name="name" type="xs:string" /> <xs:element minOccurs="0" name="startDate" type="xs:dateTime" /> <xs:element minOccurs="0" name="type" type="xs:string" /> <xs:element minOccurs="0" name="title" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="Organization" type="tns:Organization" /> <xs:complexType name="ArrayOfLanguages"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="language" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfLanguages" type="tns:ArrayOfLanguages" /> <xs:complexType name="ArrayOfMovies"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="movie" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfMovies" type="tns:ArrayOfMovies" /> <xs:complexType name="ArrayOfMusic"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="music" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfMusic" type="tns:ArrayOfMusic" /> <xs:complexType name="name"> <xs:all> <xs:element minOccurs="0" name="additionalName" type="xs:string" /> <xs:element minOccurs="0" name="familyName" type="xs:string" /> <xs:element minOccurs="0" name="givenName" type="xs:string" /> <xs:element minOccurs="0" name="honorificPrefix" type="xs:string" /> <xs:element minOccurs="0" name="formatted" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="name" type="tns:name" /> <xs:complexType name="Presence"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:PresenceType" /> </xs:all> </xs:complexType> <xs:element name="Presence" type="tns:Presence" /> <xs:simpleType name="PresenceType"> <xs:restriction base="xs:string"> <xs:enumeration value="AWAY" /> <xs:enumeration value="CHAT" /> <xs:enumeration value="DND" /> <xs:enumeration value="OFFLINE" /> <xs:enumeration value="ONLINE" /> <xs:enumeration value="XA" /> </xs:restriction> </xs:simpleType> <xs:element name="PresenceType" type="tns:PresenceType" /> <xs:complexType name="ArrayOfPhone"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="phone" type="tns:PluralPersonField" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfPhone" type="tns:ArrayOfPhone" /> <xs:complexType name="Url"> <xs:all> <xs:element minOccurs="0" name="address" type="xs:string" /> <xs:element minOccurs="0" name="linkText" type="xs:string" /> <xs:element minOccurs="0" name="type" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="Url" type="tns:Url" /> <xs:complexType name="ArrayOfQuotes"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="quote" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfQuotes" type="tns:ArrayOfQuotes" /> <xs:complexType name="Smoker"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:SmokerType" /> </xs:all> </xs:complexType> <xs:element name="Smoker" type="tns:Smoker" /> <xs:simpleType name="SmokerType"> <xs:restriction base="xs:string"> <xs:enumeration value="HEAVILY" /> <xs:enumeration value="NO" /> <xs:enumeration value="OCCASIONALLY" /> <xs:enumeration value="QUIT" /> <xs:enumeration value="QUITTING" /> <xs:enumeration value="REGULARLY" /> <xs:enumeration value="SOCIALLY" /> <xs:enumeration value="YES" /> </xs:restriction> </xs:simpleType> <xs:element name="SmokerType" type="tns:SmokerType" /> <xs:complexType name="ArrayOfSports"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="sport" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfSports" type="tns:ArrayOfSports" /> <xs:complexType name="ArrayOfTags"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="tag" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfTags" type="tns:ArrayOfTags" /> <xs:complexType name="ArrayOfTurnOffs"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="turnOff" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfTurnOffs" type="tns:ArrayOfTurnOffs" /> <xs:complexType name="ArrayOfTurnOns"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="turnOn" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfTurnOns" type="tns:ArrayOfTurnOns" /> <xs:complexType name="ArrayOfTvShows"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="tvShow" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfTvShows" type="tns:ArrayOfTvShows" /> <xs:complexType name="ArrayOfUrl"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Url" type="tns:Url" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfUrl" type="tns:ArrayOfUrl" /> <xs:complexType name="UrlCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> <xs:element minOccurs="0" name="urls" type="tns:ArrayOfUrl" /> </xs:all> </xs:complexType> <xs:element name="UrlCollection" type="tns:UrlCollection" /> <xs:complexType name="CreateActivityPriority"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:CreateActivityPriorityType" /> </xs:all> </xs:complexType> <xs:element name="CreateActivityPriority" type="tns:CreateActivityPriority" /> <xs:simpleType name="CreateActivityPriorityType"> <xs:restriction base="xs:string"> <xs:enumeration value="HIGH" /> <xs:enumeration value="LOW" /> </xs:restriction> </xs:simpleType> <xs:element name="CreateActivityPriorityType" type="tns:CreateActivityPriorityType" /> <xs:complexType name="EscapeType"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:EscapeTypeType" /> </xs:all> </xs:complexType> <xs:element name="EscapeType" type="tns:EscapeType" /> <xs:simpleType name="EscapeTypeType"> <xs:restriction base="xs:string"> <xs:enumeration value="HTML_ESCAPE" /> <xs:enumeration value="NONE" /> </xs:restriction> </xs:simpleType> <xs:element name="EscapeTypeType" type="tns:EscapeTypeType" /> <xs:complexType name="PhoneCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="phones" type="tns:ArrayOfPhone" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="PhoneCollection" type="tns:PhoneCollection" /> <xs:complexType name="EmailCollection"> <xs:all> <xs:element minOccurs="0" name="emails" type="tns:ArrayOfEmail" /> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="EmailCollection" type="tns:EmailCollection" /> <xs:complexType name="Message"> <xs:all> <xs:element minOccurs="0" name="body" type="xs:string" /> <xs:element minOccurs="0" name="bodyId" type="xs:string" /> <xs:element minOccurs="0" name="title" type="xs:string" /> <xs:element minOccurs="0" name="titleId" type="xs:string" /> </xs:all> </xs:complexType> <xs:element name="Message" type="tns:Message" /> <xs:complexType name="MediaItemCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="mediaItems" type="tns:ArrayOfMediaItem" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="MediaItemCollection" type="tns:MediaItemCollection" /> <xs:simpleType name="EnvironmentType"> <xs:restriction base="xs:string"> <xs:enumeration value="ACTIVITY" /> <xs:enumeration value="ADDRESS" /> <xs:enumeration value="BODY_TYPE" /> <xs:enumeration value="EMAIL" /> <xs:enumeration value="FILTER_TYPE" /> <xs:enumeration value="MEDIAITEM" /> <xs:enumeration value="MESSAGE" /> <xs:enumeration value="MESSAGE_TYPE" /> <xs:enumeration value="NAME" /> <xs:enumeration value="ORGANIZATION" /> <xs:enumeration value="PERSON" /> <xs:enumeration value="PHONE" /> <xs:enumeration value="SORTORDER" /> <xs:enumeration value="URL" /> </xs:restriction> </xs:simpleType> <xs:element name="EnvironmentType" type="tns:EnvironmentType" /> <xs:complexType name="MessageType"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:MessageTypeType" /> </xs:all> </xs:complexType> <xs:element name="MessageType" type="tns:MessageType" /> <xs:simpleType name="MessageTypeType"> <xs:restriction base="xs:string"> <xs:enumeration value="EMAIL" /> <xs:enumeration value="NOTIFICATION" /> <xs:enumeration value="PRIVATE_MESSAGE" /> <xs:enumeration value="PUBLIC_MESSAGE" /> </xs:restriction> </xs:simpleType> <xs:element name="MessageTypeType" type="tns:MessageTypeType" /> <xs:simpleType name="LookingForType"> <xs:restriction base="xs:string"> <xs:enumeration value="ACTIVITY_PARTNERS" /> <xs:enumeration value="DATING" /> <xs:enumeration value="FRIENDS" /> <xs:enumeration value="NETWORKING" /> <xs:enumeration value="RANDOM" /> <xs:enumeration value="RELATIONSHIP" /> </xs:restriction> </xs:simpleType> <xs:element name="LookingForType" type="tns:LookingForType" /> <xs:complexType name="Container"> <xs:all /> </xs:complexType> <xs:element name="Container" type="tns:Container" /> <xs:complexType name="Environment"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:EnvironmentType" /> </xs:all> </xs:complexType> <xs:element name="Environment" type="tns:Environment" /> <xs:complexType name="AddressCollection"> <xs:all> <xs:element minOccurs="0" name="addresses" type="tns:ArrayOfAddress" /> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="AddressCollection" type="tns:AddressCollection" /> <xs:complexType name="ArrayOfAddress"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Address" type="tns:Address" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfAddress" type="tns:ArrayOfAddress" /> <xs:complexType name="PersonCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="people" type="tns:ArrayOfperson" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="PersonCollection" type="tns:PersonCollection" /> <xs:complexType name="ArrayOfperson"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="person" type="tns:person" /> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfperson" type="tns:ArrayOfperson" /> <xs:complexType name="OrganizationCollection"> <xs:all> <xs:element minOccurs="0" name="itemsPerPage" type="xs:int" /> <xs:element minOccurs="0" name="organizations" type="tns:ArrayOfOrganization" /> <xs:element minOccurs="0" name="startIndex" type="xs:long" /> <xs:element minOccurs="0" name="totalResults" type="xs:long" /> </xs:all> </xs:complexType> <xs:element name="OrganizationCollection" type="tns:OrganizationCollection" /> <xs:complexType name="LookingFor"> <xs:all> <xs:element minOccurs="0" name="displayvalue" type="xs:string" /> <xs:element minOccurs="0" name="key" type="tns:LookingForType" /> </xs:all> </xs:complexType> <xs:element name="LookingFor" type="tns:LookingFor" /> </xs:schema> 13. HTTP Status Codes
. |